diff --git a/output/ClassCanBeTyped.class b/output/ClassCanBeTyped.class deleted file mode 100644 index 404c65b..0000000 Binary files a/output/ClassCanBeTyped.class and /dev/null differ diff --git a/src/main/java/de/maishai/Compiler.java b/src/main/java/de/maishai/Compiler.java index 08a70a1..9a06d14 100644 --- a/src/main/java/de/maishai/Compiler.java +++ b/src/main/java/de/maishai/Compiler.java @@ -98,9 +98,7 @@ public class Compiler { } public static void main(String[] args) { - generateByteCodeFileFromFile(List.of("src/main/resources/JavaTestfiles/ClassWithConstructor.java", - "src/main/resources/JavaTestfiles/ClassWithConstructorAndMethodCall.java", - "src/main/resources/JavaTestfiles/ComplexClass.java"), - List.of("ClassWithConstructor","ClassWithConstructorAndMethodCall","ComplexClass")); + generateByteCodeFileFromFile(List.of("src/main/resources/JavaTestfiles/ClassCanBeBytecoded.java"), + List.of("ClassCanBeBytecoded")); } } diff --git a/src/main/java/de/maishai/typedast/typedclass/TypedAssignment.java b/src/main/java/de/maishai/typedast/typedclass/TypedAssignment.java index 7985d3f..922664c 100644 --- a/src/main/java/de/maishai/typedast/typedclass/TypedAssignment.java +++ b/src/main/java/de/maishai/typedast/typedclass/TypedAssignment.java @@ -85,13 +85,11 @@ public class TypedAssignment implements TypedStatement { value.codeGen(ctx); getOwnerChain(ctx); } else { - ctx.pushStack("this"); getOwnerChain(ctx); value.codeGen(ctx); } - - //save value in field + //save value if (location.getField()) { String receiver = ctx.getClassContext().getName(); @@ -100,6 +98,7 @@ public class TypedAssignment implements TypedStatement { } ctx.getMv().visitFieldInsn(Opcodes.PUTFIELD, receiver, location.getName(), value.getType().getDescriptor()); System.out.println("PUTFIELD: " + receiver + " " + location.getName() + " " + value.getType().getDescriptor()); + } else { if(value.getType().getKind() == Type.Kind.REFERENCE) { System.out.println("ASTORE " + ctx.getLocalVar(location.getName()).get().index()); @@ -108,8 +107,7 @@ public class TypedAssignment implements TypedStatement { ctx.getMv().visitVarInsn(Opcodes.ISTORE, ctx.getLocalVar(location.getName()).get().index()); } } - //ctx.popStack(); - //ctx.popStack(); + ctx.popStack(); } private void getOwnerChain(MethodContext ctx) { diff --git a/src/main/java/de/maishai/typedast/typedclass/TypedBinary.java b/src/main/java/de/maishai/typedast/typedclass/TypedBinary.java index 5ebe4fd..e9a1c83 100644 --- a/src/main/java/de/maishai/typedast/typedclass/TypedBinary.java +++ b/src/main/java/de/maishai/typedast/typedclass/TypedBinary.java @@ -206,5 +206,7 @@ public class TypedBinary implements TypedExpression { } } ctx.popStack(); + ctx.popStack(); + ctx.pushAnonToStack(); } } diff --git a/src/main/java/de/maishai/typedast/typedclass/TypedFieldVarAccess.java b/src/main/java/de/maishai/typedast/typedclass/TypedFieldVarAccess.java index 74ab48a..ceb0f44 100644 --- a/src/main/java/de/maishai/typedast/typedclass/TypedFieldVarAccess.java +++ b/src/main/java/de/maishai/typedast/typedclass/TypedFieldVarAccess.java @@ -119,5 +119,6 @@ public class TypedFieldVarAccess implements TypedExpression { ctx.getMv().visitVarInsn(loadOpcode, ctx.getLocalVar(name).get().index()); System.out.println(loadOpcode == Opcodes.ALOAD ? "ALOAD " + ctx.getLocalVar(name).get().index() : "ILOAD " + ctx.getLocalVar(name).get().index()); } + ctx.pushAnonToStack(); } } diff --git a/src/main/java/de/maishai/typedast/typedclass/TypedIfElse.java b/src/main/java/de/maishai/typedast/typedclass/TypedIfElse.java index 69a5240..985d464 100644 --- a/src/main/java/de/maishai/typedast/typedclass/TypedIfElse.java +++ b/src/main/java/de/maishai/typedast/typedclass/TypedIfElse.java @@ -49,6 +49,7 @@ public class TypedIfElse implements TypedStatement { Label end = new Label(); typedCon.codeGen(ctx); ctx.getMv().visitJumpInsn(Opcodes.IFEQ, falseLabel); + ctx.popStack(); ifTypedBlock.codeGen(ctx); ctx.getMv().visitJumpInsn(Opcodes.GOTO, end); diff --git a/src/main/java/de/maishai/typedast/typedclass/TypedNew.java b/src/main/java/de/maishai/typedast/typedclass/TypedNew.java index 9c8497e..3ee9c4a 100644 --- a/src/main/java/de/maishai/typedast/typedclass/TypedNew.java +++ b/src/main/java/de/maishai/typedast/typedclass/TypedNew.java @@ -55,11 +55,6 @@ public class TypedNew implements TypedExpression, TypedStatement { @Override public void codeGen(MethodContext ctx) { - //pop the stack - //ctx.popStack(); - //ctx.getMv().visitInsn(Opcodes.POP); - //System.out.println("Popped stack"); - ctx.getMv().visitTypeInsn(Opcodes.NEW, type.getReference()); System.out.println("NEW " + type.getReference()); ctx.pushAnonToStack(); @@ -70,6 +65,9 @@ public class TypedNew implements TypedExpression, TypedStatement { arg.codeGen(ctx); } ctx.getMv().visitMethodInsn(Opcodes.INVOKESPECIAL, type.getReference(), "", CodeGenUtils.generateDescriptor(args.stream().map(TypedExpression::getType).toList(), Type.VOID), false); + for (TypedExpression arg : args) { + ctx.popStack(); + } System.out.println("INVOKESPECIAL " + type.getReference() + " " + CodeGenUtils.generateDescriptor(args.stream().map(TypedExpression::getType).toList(), Type.VOID)); } } diff --git a/src/main/resources/JavaTestfiles/ClassCanBeBytecoded.java b/src/main/resources/JavaTestfiles/ClassCanBeBytecoded.java new file mode 100644 index 0000000..a4f48ad --- /dev/null +++ b/src/main/resources/JavaTestfiles/ClassCanBeBytecoded.java @@ -0,0 +1,20 @@ +public class ClassCanBeBytecoded { + public ClassCanBeBytecoded() { + } + + public ClassCanBeBytecoded(int var1) { + } + + public ClassCanBeBytecoded test(int var1) { + int result; + if (var1 > 10) { + result = var1 - 10; + } else { + result = var1 + 10; + } + ClassCanBeBytecoded c; + c = new ClassCanBeBytecoded(result); + result = var1 + var1; + return c; + } +} \ No newline at end of file