Fix for loop overflowing the stack. Fixes #122
This commit is contained in:
parent
584690596e
commit
f11d4b0716
12
resources/bytecode/javFiles/Bug122.jav
Normal file
12
resources/bytecode/javFiles/Bug122.jav
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import java.lang.Integer;
|
||||||
|
import java.lang.Boolean;
|
||||||
|
|
||||||
|
class Bug122 {
|
||||||
|
void main() {
|
||||||
|
if (true) {
|
||||||
|
for (Integer i = 0; i < 10; i++) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -886,8 +886,12 @@ public class Codegen {
|
|||||||
case TargetFor _for: {
|
case TargetFor _for: {
|
||||||
state.enterScope();
|
state.enterScope();
|
||||||
var localCounter = state.localCounter;
|
var localCounter = state.localCounter;
|
||||||
if (_for.init() != null)
|
if (_for.init() != null) {
|
||||||
_for.init().forEach(e -> generate(state, e));
|
for (var e : _for.init()) {
|
||||||
|
generate(state, e);
|
||||||
|
if (e instanceof TargetAssign) mv.visitInsn(POP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Label start = new Label();
|
Label start = new Label();
|
||||||
Label end = new Label();
|
Label end = new Label();
|
||||||
|
@ -513,8 +513,9 @@ public class StatementGenerator {
|
|||||||
} else {
|
} else {
|
||||||
return new ForStmt(
|
return new ForStmt(
|
||||||
stmt.getStart(),
|
stmt.getStart(),
|
||||||
convert(control.forInit().localVariableDeclaration()),
|
control.forInit() != null ? convert(control.forInit().localVariableDeclaration()) : List.of(),
|
||||||
convert(control.expression()), control.forUpdate.expression().stream().map(this::convert).toList(),
|
control.expression() != null ? convert(control.expression()) : null,
|
||||||
|
control.forUpdate != null ? control.forUpdate.expression().stream().map(this::convert).toList() : List.of(),
|
||||||
convert(stmt.statement())
|
convert(stmt.statement())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -141,7 +141,12 @@ public class StatementToTargetExpression implements ASTVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(ForStmt forStmt) {
|
public void visit(ForStmt forStmt) {
|
||||||
result = new TargetFor(forStmt.initializer.stream().map(converter::convert).toList(), converter.convert(forStmt.condition), forStmt.loopExpr.stream().map(converter::convert).toList(), converter.convert(forStmt.block));
|
result = new TargetFor(
|
||||||
|
forStmt.initializer.stream().map(converter::convert).toList(),
|
||||||
|
forStmt.condition != null ? converter.convert(forStmt.condition) : null,
|
||||||
|
forStmt.loopExpr.stream().map(converter::convert).toList(),
|
||||||
|
converter.convert(forStmt.block)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -129,6 +129,7 @@ public class TYPEStmt implements StatementVisitor {
|
|||||||
@Override
|
@Override
|
||||||
public void visit(ForStmt forStmt) {
|
public void visit(ForStmt forStmt) {
|
||||||
forStmt.initializer.forEach(s -> s.accept(this));
|
forStmt.initializer.forEach(s -> s.accept(this));
|
||||||
|
if (forStmt.condition != null)
|
||||||
forStmt.condition.accept(this);
|
forStmt.condition.accept(this);
|
||||||
forStmt.loopExpr.forEach(e -> e.accept(this));
|
forStmt.loopExpr.forEach(e -> e.accept(this));
|
||||||
forStmt.block.accept(this);
|
forStmt.block.accept(this);
|
||||||
|
@ -841,4 +841,11 @@ public class TestComplete {
|
|||||||
var clazz = classFiles.get("Op2");
|
var clazz = classFiles.get("Op2");
|
||||||
var instance = clazz.getDeclaredConstructor().newInstance();
|
var instance = clazz.getDeclaredConstructor().newInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBug122() throws Exception {
|
||||||
|
var classFiles = generateClassFiles(new ByteArrayClassLoader(), "Bug122.jav");
|
||||||
|
var clazz = classFiles.get("Bug122");
|
||||||
|
var instance = clazz.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user