@@ -2079,6 +2079,296 @@ public void new_() {
20792079 @ Nested
20802080 public class STACK {
20812081
2082+ @ Test
2083+ public void dup2_x2_form4 () {
2084+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2085+ frame .in = new MethodAnalyzer .Status (0 );
2086+ frame .in .control = new LabelNode ("control" );
2087+ frame .in .memory = new LabelNode ("memory" );
2088+
2089+ frame .in .stack .push (new PrimitiveLong (10 ));
2090+ frame .in .stack .push (new PrimitiveLong (20L ));
2091+
2092+ analyzer .visitStackInstruction (Opcode .DUP2_X2 , frame );
2093+
2094+ assertThat (frame .out ).isNotNull ().isNotSameAs (frame .in );
2095+ assertThat (frame .out .control ).isSameAs (frame .in .control );
2096+ assertThat (frame .out .memory ).isSameAs (frame .in .memory );
2097+
2098+ assertThat (frame .out .stack ).hasSize (3 );
2099+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get (1 ));
2100+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get (0 ));
2101+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (1 ));
2102+ }
2103+
2104+ @ Test
2105+ public void dup2_x2_form3 () {
2106+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2107+ frame .in = new MethodAnalyzer .Status (0 );
2108+ frame .in .control = new LabelNode ("control" );
2109+ frame .in .memory = new LabelNode ("memory" );
2110+
2111+ frame .in .stack .push (new PrimitiveLong (10L ));
2112+ frame .in .stack .push (new PrimitiveInt (20 ));
2113+ frame .in .stack .push (new PrimitiveInt (30 ));
2114+
2115+ analyzer .visitStackInstruction (Opcode .DUP2_X2 , frame );
2116+
2117+ assertThat (frame .out ).isNotNull ().isNotSameAs (frame .in );
2118+ assertThat (frame .out .control ).isSameAs (frame .in .control );
2119+ assertThat (frame .out .memory ).isSameAs (frame .in .memory );
2120+
2121+ assertThat (frame .out .stack ).hasSize (5 );
2122+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get (1 ));
2123+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get (2 ));
2124+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (0 ));
2125+ assertThat (frame .out .stack .get (3 )).isSameAs (frame .in .stack .get (1 ));
2126+ assertThat (frame .out .stack .get (4 )).isSameAs (frame .in .stack .get (2 ));
2127+ }
2128+
2129+ @ Test
2130+ public void dup2_x2_form2 () {
2131+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2132+ frame .in = new MethodAnalyzer .Status (0 );
2133+ frame .in .control = new LabelNode ("control" );
2134+ frame .in .memory = new LabelNode ("memory" );
2135+
2136+ frame .in .stack .push (new PrimitiveInt (10 ));
2137+ frame .in .stack .push (new PrimitiveInt (20 ));
2138+ frame .in .stack .push (new PrimitiveLong (30L ));
2139+
2140+ analyzer .visitStackInstruction (Opcode .DUP2_X2 , frame );
2141+
2142+ assertThat (frame .out ).isNotNull ().isNotSameAs (frame .in );
2143+ assertThat (frame .out .control ).isSameAs (frame .in .control );
2144+ assertThat (frame .out .memory ).isSameAs (frame .in .memory );
2145+
2146+ assertThat (frame .out .stack ).hasSize (4 );
2147+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get (2 ));
2148+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get (0 ));
2149+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (1 ));
2150+ assertThat (frame .out .stack .get (3 )).isSameAs (frame .in .stack .get (2 ));
2151+ }
2152+
2153+ @ Test
2154+ public void dup2_x2_form1 () {
2155+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2156+ frame .in = new MethodAnalyzer .Status (0 );
2157+ frame .in .control = new LabelNode ("control" );
2158+ frame .in .memory = new LabelNode ("memory" );
2159+
2160+ frame .in .stack .push (new PrimitiveInt (10 ));
2161+ frame .in .stack .push (new PrimitiveInt (20 ));
2162+ frame .in .stack .push (new PrimitiveInt (30 ));
2163+ frame .in .stack .push (new PrimitiveInt (40 ));
2164+
2165+ analyzer .visitStackInstruction (Opcode .DUP2_X2 , frame );
2166+
2167+ assertThat (frame .out ).isNotNull ().isNotSameAs (frame .in );
2168+ assertThat (frame .out .control ).isSameAs (frame .in .control );
2169+ assertThat (frame .out .memory ).isSameAs (frame .in .memory );
2170+
2171+ assertThat (frame .out .stack ).hasSize (6 );
2172+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get (2 ));
2173+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get (3 ));
2174+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (0 ));
2175+ assertThat (frame .out .stack .get (3 )).isSameAs (frame .in .stack .get (1 ));
2176+ assertThat (frame .out .stack .get (4 )).isSameAs (frame .in .stack .get (2 ));
2177+ assertThat (frame .out .stack .get (5 )).isSameAs (frame .in .stack .get (3 ));
2178+ }
2179+
2180+ @ Test
2181+ public void dup2_x1_form2 () {
2182+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2183+ frame .in = new MethodAnalyzer .Status (0 );
2184+ frame .in .control = new LabelNode ("control" );
2185+ frame .in .memory = new LabelNode ("memory" );
2186+
2187+ frame .in .stack .push (new PrimitiveInt (10 ));
2188+ frame .in .stack .push (new PrimitiveLong (20L ));
2189+
2190+ analyzer .visitStackInstruction (Opcode .DUP2_X1 , frame );
2191+
2192+ assertThat (frame .out ).isNotNull ().isNotSameAs (frame .in );
2193+ assertThat (frame .out .control ).isSameAs (frame .in .control );
2194+ assertThat (frame .out .memory ).isSameAs (frame .in .memory );
2195+
2196+ assertThat (frame .out .stack ).hasSize (3 );
2197+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get (1 ));
2198+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get (0 ));
2199+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (1 ));
2200+ }
2201+
2202+ @ Test
2203+ public void dup2_x1_form2_fail_wrongstack () {
2204+ assertThatExceptionOfType (IllegalParsingStateException .class ).isThrownBy (() -> {
2205+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2206+ frame .in = new MethodAnalyzer .Status (0 );
2207+ frame .in .control = new LabelNode ("control" );
2208+ frame .in .memory = new LabelNode ("memory" );
2209+
2210+ frame .in .stack .push (new PrimitiveInt (10 ));
2211+
2212+ analyzer .visitStackInstruction (Opcode .DUP2_X1 , frame );
2213+ fail ("Exception expected" );
2214+ }).withMessage ("A minimum stack size of 2 is required, but only 1 is available!" );
2215+ }
2216+
2217+ @ Test
2218+ public void dup2_x1_form1 () {
2219+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2220+ frame .in = new MethodAnalyzer .Status (0 );
2221+ frame .in .control = new LabelNode ("control" );
2222+ frame .in .memory = new LabelNode ("memory" );
2223+
2224+ frame .in .stack .push (new PrimitiveInt (10 ));
2225+ frame .in .stack .push (new PrimitiveInt (20 ));
2226+ frame .in .stack .push (new PrimitiveInt (30 ));
2227+
2228+ analyzer .visitStackInstruction (Opcode .DUP2_X1 , frame );
2229+
2230+ assertThat (frame .out ).isNotNull ().isNotSameAs (frame .in );
2231+ assertThat (frame .out .control ).isSameAs (frame .in .control );
2232+ assertThat (frame .out .memory ).isSameAs (frame .in .memory );
2233+
2234+ assertThat (frame .out .stack ).hasSize (5 );
2235+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get (1 ));
2236+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get (2 ));
2237+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (0 ));
2238+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (0 ));
2239+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (0 ));
2240+ }
2241+
2242+ @ Test
2243+ public void dup2_x1_form1_fail_wrongstack () {
2244+ assertThatExceptionOfType (IllegalParsingStateException .class ).isThrownBy (() -> {
2245+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2246+ frame .in = new MethodAnalyzer .Status (0 );
2247+ frame .in .control = new LabelNode ("control" );
2248+ frame .in .memory = new LabelNode ("memory" );
2249+
2250+ frame .in .stack .push (new PrimitiveInt (10 ));
2251+ frame .in .stack .push (new PrimitiveInt (20 ));
2252+
2253+ analyzer .visitStackInstruction (Opcode .DUP2_X1 , frame );
2254+ fail ("Exception expected" );
2255+ }).withMessage ("A minimum stack size of 1 is required, but only 0 is available!" );
2256+ }
2257+
2258+ @ Test
2259+ public void dup_x2_form2 () {
2260+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2261+ frame .in = new MethodAnalyzer .Status (0 );
2262+ frame .in .control = new LabelNode ("control" );
2263+ frame .in .memory = new LabelNode ("memory" );
2264+
2265+ frame .in .stack .push (new PrimitiveLong (20L ));
2266+ frame .in .stack .push (new PrimitiveInt (10 ));
2267+
2268+ analyzer .visitStackInstruction (Opcode .DUP_X2 , frame );
2269+
2270+ assertThat (frame .out ).isNotNull ().isNotSameAs (frame .in );
2271+ assertThat (frame .out .control ).isSameAs (frame .in .control );
2272+ assertThat (frame .out .memory ).isSameAs (frame .in .memory );
2273+
2274+ assertThat (frame .out .stack ).hasSize (3 );
2275+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get (1 ));
2276+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get (0 ));
2277+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (1 ));
2278+ }
2279+
2280+ @ Test
2281+ public void dup_x2_form2_fail_wrongstack () {
2282+ assertThatExceptionOfType (IllegalParsingStateException .class ).isThrownBy (() -> {
2283+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2284+ frame .in = new MethodAnalyzer .Status (0 );
2285+ frame .in .control = new LabelNode ("control" );
2286+ frame .in .memory = new LabelNode ("memory" );
2287+
2288+ frame .in .stack .push (new PrimitiveLong (20L ));
2289+
2290+ analyzer .visitStackInstruction (Opcode .DUP_X2 , frame );
2291+ fail ("Exception expected" );
2292+ }).withMessage ("A minimum stack size of 2 is required, but only 1 is available!" );
2293+ }
2294+
2295+ @ Test
2296+ public void dup_x2_form1 () {
2297+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2298+ frame .in = new MethodAnalyzer .Status (0 );
2299+ frame .in .control = new LabelNode ("control" );
2300+ frame .in .memory = new LabelNode ("memory" );
2301+
2302+ frame .in .stack .push (new PrimitiveInt (10 ));
2303+ frame .in .stack .push (new PrimitiveInt (20 ));
2304+ frame .in .stack .push (new PrimitiveInt (30 ));
2305+
2306+ analyzer .visitStackInstruction (Opcode .DUP_X2 , frame );
2307+
2308+ assertThat (frame .out ).isNotNull ().isNotSameAs (frame .in );
2309+ assertThat (frame .out .control ).isSameAs (frame .in .control );
2310+ assertThat (frame .out .memory ).isSameAs (frame .in .memory );
2311+
2312+ assertThat (frame .out .stack ).hasSize (4 );
2313+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get (2 ));
2314+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get (0 ));
2315+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (1 ));
2316+ assertThat (frame .out .stack .get (3 )).isSameAs (frame .in .stack .get (2 ));
2317+ }
2318+
2319+ @ Test
2320+ public void dup_x2_form1_fail_wrongstack () {
2321+ assertThatExceptionOfType (IllegalParsingStateException .class ).isThrownBy (() -> {
2322+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2323+ frame .in = new MethodAnalyzer .Status (0 );
2324+ frame .in .control = new LabelNode ("control" );
2325+ frame .in .memory = new LabelNode ("memory" );
2326+
2327+ frame .in .stack .push (new PrimitiveInt (10 ));
2328+ frame .in .stack .push (new PrimitiveInt (20 ));
2329+
2330+ analyzer .visitStackInstruction (Opcode .DUP_X2 , frame );
2331+ fail ("Exception expected" );
2332+ }).withMessage ("A minimum stack size of 1 is required, but only 0 is available!" );
2333+ }
2334+
2335+ @ Test
2336+ public void dup_x1 () {
2337+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2338+ frame .in = new MethodAnalyzer .Status (0 );
2339+ frame .in .control = new LabelNode ("control" );
2340+ frame .in .memory = new LabelNode ("memory" );
2341+
2342+ frame .in .stack .push (new PrimitiveLong (10L ));
2343+ frame .in .stack .push (new PrimitiveLong (10L ));
2344+
2345+ analyzer .visitStackInstruction (Opcode .DUP_X1 , frame );
2346+
2347+ assertThat (frame .out ).isNotNull ().isNotSameAs (frame .in );
2348+ assertThat (frame .out .control ).isSameAs (frame .in .control );
2349+ assertThat (frame .out .memory ).isSameAs (frame .in .memory );
2350+
2351+ assertThat (frame .out .stack ).hasSize (3 );
2352+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get (1 ));
2353+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get (0 ));
2354+ assertThat (frame .out .stack .get (2 )).isSameAs (frame .in .stack .get (1 ));
2355+ }
2356+
2357+ @ Test
2358+ public void dup_x1_fail_stacksize () {
2359+ assertThatExceptionOfType (IllegalParsingStateException .class ).isThrownBy (() -> {
2360+ final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
2361+ frame .in = new MethodAnalyzer .Status (0 );
2362+ frame .in .control = new LabelNode ("control" );
2363+ frame .in .memory = new LabelNode ("memory" );
2364+
2365+ frame .in .stack .push (new PrimitiveLong (10L ));
2366+
2367+ analyzer .visitStackInstruction (Opcode .DUP_X1 , frame );
2368+ fail ("Exception expected" );
2369+ }).withMessage ("A minimum stack size of 2 is required, but only 1 is available!" );
2370+ }
2371+
20822372 @ Test
20832373 public void dup2_form2 () {
20842374 final MethodAnalyzer .Frame frame = new MethodAnalyzer .Frame (0 , null );
@@ -2095,8 +2385,8 @@ public void dup2_form2() {
20952385 assertThat (frame .out .memory ).isSameAs (frame .in .memory );
20962386
20972387 assertThat (frame .out .stack ).hasSize (2 );
2098- assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .get ( 0 ));
2099- assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .get ( 0 ));
2388+ assertThat (frame .out .stack .get (0 )).isSameAs (frame .in .stack .getFirst ( ));
2389+ assertThat (frame .out .stack .get (1 )).isSameAs (frame .in .stack .getFirst ( ));
21002390 }
21012391
21022392 @ Test
0 commit comments