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%2Felaboration%2Fchr%2FCHRRulesetObject.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fchr%2FCHRRulesetObject.java;h=96e86aed1df99760e52a6f6184665c0f50364238;hp=a15e30e42638d6674a542478de4e3e8cd9aeaebb;hb=78f577368ba4c71ad6fb3d9f16c03c634585cf7b;hpb=a88529426319d66aa668882d767efb3f58a1a629 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRulesetObject.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRulesetObject.java index a15e30e42..96e86aed1 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRulesetObject.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRulesetObject.java @@ -1,16 +1,31 @@ package org.simantics.scl.compiler.elaboration.chr; +import org.cojen.classfile.TypeDesc; +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.constants.Constant; import org.simantics.scl.compiler.constants.JavaConstructor; import org.simantics.scl.compiler.internal.codegen.chr.CHRRuntimeRulesetCodeGenerator; import org.simantics.scl.compiler.internal.codegen.references.BoundVar; +import org.simantics.scl.compiler.internal.codegen.references.Val; +import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; import org.simantics.scl.compiler.internal.codegen.ssa.SSAObject; +import org.simantics.scl.compiler.internal.codegen.utils.LocalVariable; +import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; import org.simantics.scl.compiler.internal.codegen.utils.ModuleBuilder; import org.simantics.scl.compiler.types.Types; +import gnu.trove.map.hash.TObjectIntHashMap; +import gnu.trove.procedure.TIntProcedure; +import gnu.trove.set.hash.TIntHashSet; + public class CHRRulesetObject extends SSAObject { CHRRuleset ruleset; + public BoundVar this_; + public BoundVar[] parameters; + public TObjectIntHashMap parameterIndexMap; + public TypeDesc[] parameterTypeDescs; + public CHRRulesetObject(BoundVar target, CHRRuleset ruleset) { super(ruleset.runtimeRulesetType); this.setTarget(target); @@ -19,13 +34,50 @@ public class CHRRulesetObject extends SSAObject { @Override public Constant liftClosure(BoundVar newTarget, BoundVar[] parameters) { - ruleset.this_ = newTarget; - ruleset.parameters = parameters; - return new JavaConstructor(ruleset.runtimeRulesetName, Types.PROC, ruleset.runtimeRulesetType, Types.getTypes(parameters)); + ruleset.rulesetObject = this; + this.this_ = newTarget; + this.parameters = parameters; + this.parameterIndexMap = new TObjectIntHashMap<>(parameters.length); + for(int i=0;i { + Val binding = valRef.getBinding(); + if(parameterIndexMap.containsKey(binding)) + usedParameterIndices.add(parameterIndexMap.get((BoundVar)binding)); + }); + usedParameterIndices.forEach(new TIntProcedure() { + @Override + public boolean execute(int i) { + loader.defineParameter(i, parameters[i]); + return true; + } + }); + + // Generate code + function.markGenerateOnFly(); + function.generateCodeWithAlreadyPreparedParameters(mb); + } }