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=56b5c8e6767141bfae285180962016409a7ed975;hb=refs%2Fchanges%2F21%2F221%2F6;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..56b5c8e67 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 @@ -208,6 +208,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 +224,16 @@ 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); + } + push(val, type); + LocalVariable temp = createLocalVariable(null, getJavaTypeTranslator().toTypeDesc(type)); + storeLocal(temp); + return temp; + } }