mirror of
https://github.com/JonathanFleischmann/CompilerULTIMATE.git
synced 2024-12-28 01:18:03 +00:00
add methodcall
This commit is contained in:
parent
acf7b4eff8
commit
99ed3a322b
@ -81,7 +81,7 @@ public class TypedAssignment implements TypedStatement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void codeGen(MethodContext ctx) {
|
public void codeGen(MethodContext ctx) {
|
||||||
if(value instanceof TypedNew) {
|
if(value instanceof TypedNew || value instanceof TypedMethodCall) {
|
||||||
value.codeGen(ctx);
|
value.codeGen(ctx);
|
||||||
getOwnerChain(ctx);
|
getOwnerChain(ctx);
|
||||||
} else {
|
} else {
|
||||||
@ -104,6 +104,7 @@ public class TypedAssignment implements TypedStatement {
|
|||||||
System.out.println("ASTORE " + ctx.getLocalVar(location.getName()).get().index());
|
System.out.println("ASTORE " + ctx.getLocalVar(location.getName()).get().index());
|
||||||
ctx.getMv().visitVarInsn(Opcodes.ASTORE, ctx.getLocalVar(location.getName()).get().index());
|
ctx.getMv().visitVarInsn(Opcodes.ASTORE, ctx.getLocalVar(location.getName()).get().index());
|
||||||
} else {
|
} else {
|
||||||
|
System.out.println("ISTORE " + ctx.getLocalVar(location.getName()).get().index());
|
||||||
ctx.getMv().visitVarInsn(Opcodes.ISTORE, ctx.getLocalVar(location.getName()).get().index());
|
ctx.getMv().visitVarInsn(Opcodes.ISTORE, ctx.getLocalVar(location.getName()).get().index());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -113,7 +114,6 @@ public class TypedAssignment implements TypedStatement {
|
|||||||
private void getOwnerChain(MethodContext ctx) {
|
private void getOwnerChain(MethodContext ctx) {
|
||||||
if (location.getRecursiveOwnerChain() != null) {
|
if (location.getRecursiveOwnerChain() != null) {
|
||||||
location.getRecursiveOwnerChain().codeGen(ctx);
|
location.getRecursiveOwnerChain().codeGen(ctx);
|
||||||
ctx.pushAnonToStack();
|
|
||||||
}
|
}
|
||||||
if (location.getRecursiveOwnerChain() == null && location.getField()) {
|
if (location.getRecursiveOwnerChain() == null && location.getField()) {
|
||||||
ctx.pushStack("this");
|
ctx.pushStack("this");
|
||||||
|
@ -108,12 +108,20 @@ public class TypedFieldVarAccess implements TypedExpression {
|
|||||||
public void codeGen(MethodContext ctx) {
|
public void codeGen(MethodContext ctx) {
|
||||||
if (recursiveOwnerChain != null) {
|
if (recursiveOwnerChain != null) {
|
||||||
recursiveOwnerChain.codeGen(ctx);
|
recursiveOwnerChain.codeGen(ctx);
|
||||||
|
ctx.popStack();
|
||||||
}
|
}
|
||||||
if (field && recursiveOwnerChain == null) {
|
if (field && recursiveOwnerChain == null) {
|
||||||
ctx.pushStack("this");
|
ctx.pushStack("this");
|
||||||
|
ctx.popStack();
|
||||||
}
|
}
|
||||||
if (field) {
|
if (field) {
|
||||||
ctx.getMv().visitFieldInsn(Opcodes.GETFIELD, recursiveOwnerChain.getType().getReference(), name, type.getDescriptor());
|
String ownerChainName;
|
||||||
|
if (recursiveOwnerChain != null) {
|
||||||
|
ownerChainName = recursiveOwnerChain.getType().getReference();
|
||||||
|
} else {
|
||||||
|
ownerChainName = type.getReference();
|
||||||
|
}
|
||||||
|
ctx.getMv().visitFieldInsn(Opcodes.GETFIELD, ownerChainName, name, type.getDescriptor());
|
||||||
} else {
|
} else {
|
||||||
int loadOpcode = type.getKind() == Type.Kind.REFERENCE ? Opcodes.ALOAD : Opcodes.ILOAD;
|
int loadOpcode = type.getKind() == Type.Kind.REFERENCE ? Opcodes.ALOAD : Opcodes.ILOAD;
|
||||||
ctx.getMv().visitVarInsn(loadOpcode, ctx.getLocalVar(name).get().index());
|
ctx.getMv().visitVarInsn(loadOpcode, ctx.getLocalVar(name).get().index());
|
||||||
|
@ -5,6 +5,7 @@ import de.maishai.ast.records.MethodCall;
|
|||||||
import de.maishai.typedast.*;
|
import de.maishai.typedast.*;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -83,6 +84,31 @@ public class TypedMethodCall implements TypedExpression, TypedStatement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void codeGen(MethodContext ctx) {
|
public void codeGen(MethodContext ctx) {
|
||||||
|
getOwnerChain(ctx);
|
||||||
|
for (TypedExpression arg : args) {
|
||||||
|
arg.codeGen(ctx);
|
||||||
|
}
|
||||||
|
String descriptor = CodeGenUtils.generateDescriptor(args.stream().map(TypedExpression::getType).toList(), type);
|
||||||
|
String methodOwnerClass;
|
||||||
|
if (recipient.getRecursiveOwnerChain() == null) {
|
||||||
|
methodOwnerClass = ctx.getClassContext().getName();
|
||||||
|
} else {
|
||||||
|
methodOwnerClass = recipient.getRecursiveOwnerChain().getType().getReference();
|
||||||
|
}
|
||||||
|
ctx.getMv().visitMethodInsn(Opcodes.INVOKEVIRTUAL, methodOwnerClass, recipient.getName(), descriptor, false);
|
||||||
|
System.out.println("INVOKEVIRTUAL " + methodOwnerClass + " " + recipient.getName() + " " + descriptor);
|
||||||
|
ctx.popStack(); // pop the owner
|
||||||
|
for (TypedExpression arg : args) {
|
||||||
|
ctx.popStack();
|
||||||
|
}
|
||||||
|
ctx.pushAnonToStack();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getOwnerChain(MethodContext ctx) {
|
||||||
|
if (recipient.getRecursiveOwnerChain() != null) {
|
||||||
|
recipient.getRecursiveOwnerChain().codeGen(ctx);
|
||||||
|
} else {
|
||||||
|
ctx.pushStack("this");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,16 @@
|
|||||||
public class ClassCanBeBytecoded {
|
public class ClassCanBeBytecoded {
|
||||||
public ClassCanBeBytecoded c;
|
public ClassCanBeBytecoded c;
|
||||||
|
public int x;
|
||||||
public ClassCanBeBytecoded() {
|
public ClassCanBeBytecoded() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClassCanBeBytecoded(int var1) {
|
public int callable() {
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClassCanBeBytecoded test(int var1) {
|
public int test(int var1) {
|
||||||
int result;
|
int i;
|
||||||
if (var1 > 10) {
|
i = this.c.c.callable();
|
||||||
result = var1 - 10;
|
return i;
|
||||||
} else {
|
|
||||||
result = var1 + 10;
|
|
||||||
}
|
|
||||||
ClassCanBeBytecoded c;
|
|
||||||
c = new ClassCanBeBytecoded(result);
|
|
||||||
result = var1 + var1;
|
|
||||||
this.c = c;
|
|
||||||
return c;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user