Skip to content

Commit b5499b0

Browse files
committed
Added more tests
1 parent be4af83 commit b5499b0

2 files changed

Lines changed: 298 additions & 12 deletions

File tree

src/main/java/de/mirkosertic/metair/ir/MethodAnalyzer.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,8 +1467,7 @@ private void parse_DUP(final Frame frame) {
14671467
outgoing.push(v);
14681468
}
14691469

1470-
@Testbacklog
1471-
protected void parse_DUP_X1(final Frame frame) {
1470+
private void parse_DUP_X1(final Frame frame) {
14721471
final Status outgoing = frame.copyIncomingToOutgoing();
14731472
assertMinimumStackSize(outgoing, 2);
14741473

@@ -1479,8 +1478,7 @@ protected void parse_DUP_X1(final Frame frame) {
14791478
outgoing.push(v1);
14801479
}
14811480

1482-
@Testbacklog
1483-
protected void parse_DUP_X2(final Frame frame) {
1481+
private void parse_DUP_X2(final Frame frame) {
14841482
final Status outgoing = frame.copyIncomingToOutgoing();
14851483
assertMinimumStackSize(outgoing, 2);
14861484

@@ -1526,8 +1524,7 @@ private void parse_DUP2(final Frame frame) {
15261524
outgoing.push(v1);
15271525
}
15281526

1529-
@Testbacklog
1530-
protected void parse_DUP2_X1(final Frame frame) {
1527+
private void parse_DUP2_X1(final Frame frame) {
15311528
final Status outgoing = frame.copyIncomingToOutgoing();
15321529
assertMinimumStackSize(outgoing, 2);
15331530

@@ -1554,8 +1551,7 @@ protected void parse_DUP2_X1(final Frame frame) {
15541551
}
15551552
}
15561553

1557-
@Testbacklog
1558-
protected void parse_DUP2_X2(final Frame frame) {
1554+
private void parse_DUP2_X2(final Frame frame) {
15591555
final Status outgoing = frame.copyIncomingToOutgoing();
15601556
assertMinimumStackSize(outgoing, 2);
15611557

@@ -1570,14 +1566,14 @@ protected void parse_DUP2_X2(final Frame frame) {
15701566
assertMinimumStackSize(outgoing, 1);
15711567

15721568
final Value v3 = outgoing.pop();
1573-
if (!TypeUtils.isCategory2(v1.type) && !TypeUtils.isCategory2(v2.type) || TypeUtils.isCategory2(v3.type)) {
1569+
if (!TypeUtils.isCategory2(v1.type) && !TypeUtils.isCategory2(v2.type) && TypeUtils.isCategory2(v3.type)) {
15741570
// Form 3
15751571
outgoing.push(v2);
15761572
outgoing.push(v1);
15771573
outgoing.push(v3);
15781574
outgoing.push(v2);
15791575
outgoing.push(v1);
1580-
} else if (TypeUtils.isCategory2(v1.type) || !TypeUtils.isCategory2(v2.type) && (!TypeUtils.isCategory2(v3.type))) {
1576+
} else if (TypeUtils.isCategory2(v1.type) && !TypeUtils.isCategory2(v2.type) && (!TypeUtils.isCategory2(v3.type))) {
15811577
// Form 2
15821578
outgoing.push(v1);
15831579
outgoing.push(v3);

src/test/java/de/mirkosertic/metair/ir/MethodAnalyzerTest.java

Lines changed: 292 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)