X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Futils%2FMethodBuilderBase.java;h=51a93c53c8c09589198e3c62b79ac1f1c2eeef74;hp=7fb83fb49e3fd210dddd0ed7228a9febdaa792da;hb=91682baa9a8252390f09b80fd724f47e5957b234;hpb=593a8f75d9dbc363234002dc500c346afbeba040 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilderBase.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilderBase.java index 7fb83fb49..51a93c53c 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilderBase.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilderBase.java @@ -12,6 +12,7 @@ public class MethodBuilderBase { private MethodVisitor methodVisitor; private LocalVariable[] parameters; private int localVariableCount = 0; + private int currentLineNumber = -1; public MethodBuilderBase(ClassBuilder classBuilder, boolean isStatic, MethodVisitor methodVisitor, TypeDesc[] parameterTypes) { this.classBuilder = classBuilder; @@ -25,6 +26,10 @@ public class MethodBuilderBase { } methodVisitor.visitCode(); } + + public LocalVariable getThis(TypeDesc type) { + return new LocalVariable(0, type); + } public void loadConstant(boolean value) { if(value) @@ -83,6 +88,20 @@ public class MethodBuilderBase { methodVisitor.visitLdcInsn(Type.getType(value.getDescriptor())); } + + public int lineNumber(int lineNumber) { + if(lineNumber != currentLineNumber) { + int oldLineNumber = currentLineNumber; + Label label = createLabel(); + setLocation(label); + methodVisitor.visitLineNumber(lineNumber, label); + currentLineNumber = lineNumber; + return oldLineNumber; + } + else + return currentLineNumber; + } + public void dup() { methodVisitor.visitInsn(Opcodes.DUP); } @@ -379,6 +398,7 @@ public class MethodBuilderBase { public void invokeInterface(String className, String methodName, TypeDesc ret, TypeDesc[] params) { checkClassName(className); + checkParameters(params); methodVisitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, className, methodName, MethodDesc.forArguments(ret, params).getDescriptor(), true); } @@ -391,6 +411,7 @@ public class MethodBuilderBase { public void invokeVirtual(String className, String methodName, TypeDesc ret, TypeDesc[] params) { checkClassName(className); + checkParameters(params); methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, className, methodName, MethodDesc.forArguments(ret, params).getDescriptor(), false); } @@ -402,6 +423,7 @@ public class MethodBuilderBase { public void invokeConstructor(String className, TypeDesc[] params) { checkClassName(className); + checkParameters(params); methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, className, "", MethodDesc.forArguments(TypeDesc.VOID, params).getDescriptor(), false); } @@ -417,6 +439,7 @@ public class MethodBuilderBase { public void invokeStatic(String className, String methodName, TypeDesc ret, TypeDesc[] params) { checkClassName(className); + checkParameters(params); methodVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, className, methodName, MethodDesc.forArguments(ret, params).getDescriptor(), false); } @@ -606,4 +629,10 @@ public class MethodBuilderBase { else methodVisitor.visitLookupSwitchInsn(defaultLabel, values, labels); } + + private static void checkParameters(TypeDesc[] params) { + for(TypeDesc param : params) + if(param.equals(TypeDesc.VOID)) + throw new IllegalArgumentException(); + } }