]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilderBase.java
SCL compiler generates line numbers to bytecode
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / utils / MethodBuilderBase.java
index 843659d6c12abe1f86fad86c0fda9b16e11e89f3..51a93c53c8c09589198e3c62b79ac1f1c2eeef74 100644 (file)
@@ -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);
     }