X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Futils%2FMethodBuilder.java;h=52d19cc5474526386485205bc1cce5be35015af9;hb=9fafa930ec59d0001415f5cff3579456ec38ae65;hp=d740de293824b33e9241c6addd9bc66eebad46a6;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilder.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilder.java index d740de293..52d19cc54 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilder.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/MethodBuilder.java @@ -4,6 +4,7 @@ import org.cojen.classfile.TypeDesc; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; +import org.simantics.scl.compiler.constants.LocalVariableConstant; import org.simantics.scl.compiler.internal.codegen.continuations.Cont; import org.simantics.scl.compiler.internal.codegen.continuations.ContRef; import org.simantics.scl.compiler.internal.codegen.continuations.ReturnCont; @@ -208,6 +209,9 @@ public class MethodBuilder extends MethodBuilderBase { storeLocal(lv); } + /** + * Generates the continuation code if it does not already exist. + */ public void ensureExists(Cont continuation) { if(!generatedConts.contains(continuation)) ((SSABlock)continuation).generateCode(this); @@ -221,4 +225,19 @@ public class MethodBuilder extends MethodBuilderBase { public void addPreparation(PreparationStep step, T result) { preparationSteps.put(step, result); } + + public LocalVariable cacheValue(IVal val, Type type) { + if(val instanceof BoundVar) { + BoundVar boundVar = (BoundVar)val; + if(!boundVar.generateOnFly) + return getLocalVariable(boundVar); + } + else if(val instanceof LocalVariableConstant) { + return ((LocalVariableConstant)val).var; + } + push(val, type); + LocalVariable temp = createLocalVariable(null, getJavaTypeTranslator().toTypeDesc(type)); + storeLocal(temp); + return temp; + } }