]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/constants/generic/CallJava.java
(refs #7536) Implemented deconstruct in CallJava for static fields
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / constants / generic / CallJava.java
index 1dd4477151e0a255dd21c0f7884dbb47d6a5c686..0e3ad1f52c5daa3aad92cdb733374fb2b9c8373a 100644 (file)
@@ -1,9 +1,13 @@
 package org.simantics.scl.compiler.constants.generic;
 
 import org.cojen.classfile.TypeDesc;
+import org.objectweb.asm.Label;
 import org.simantics.scl.compiler.constants.FunctionValue;
+import org.simantics.scl.compiler.internal.codegen.continuations.Cont;
+import org.simantics.scl.compiler.internal.codegen.references.IVal;
 import org.simantics.scl.compiler.internal.codegen.references.Val;
 import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidator;
+import org.simantics.scl.compiler.internal.codegen.utils.Constants;
 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
 import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
@@ -92,4 +96,16 @@ public class CallJava extends FunctionValue {
         for(StackItem item : stackItems)
             item.prepare(mb);
     }
+    
+    @Override
+    public void deconstruct(MethodBuilder mb, IVal parameter, Cont success,
+            Label failure) {
+        if(parameterTypes.length != 0)
+            super.deconstruct(mb, parameter, success, failure);
+        push(mb);
+        mb.push(parameter, getType());
+        mb.invokeVirtual(TypeDesc.OBJECT, "equals", TypeDesc.BOOLEAN, Constants.OBJECTS[1]);
+        mb.ifZeroComparisonBranch(failure, "==");
+        mb.jump(success);
+    }
 }