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%2Fchr%2FCHRRuntimeRulesetCodeGenerator.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Fchr%2FCHRRuntimeRulesetCodeGenerator.java;h=003086704522773d11ebaa0e43bf4b659e00c28d;hb=a2df536f7fc878982c6c960a79ed49f350cddc6f;hp=0000000000000000000000000000000000000000;hpb=5f0ad7a26810df602600c5eddad317588fce0ac4;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRRuntimeRulesetCodeGenerator.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRRuntimeRulesetCodeGenerator.java new file mode 100644 index 000000000..003086704 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRRuntimeRulesetCodeGenerator.java @@ -0,0 +1,90 @@ +package org.simantics.scl.compiler.internal.codegen.chr; + +import java.util.ArrayList; + +import org.cojen.classfile.TypeDesc; +import org.objectweb.asm.Opcodes; +import org.simantics.scl.compiler.elaboration.chr.CHRRule; +import org.simantics.scl.compiler.elaboration.chr.CHRRuleset; +import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint; +import org.simantics.scl.compiler.internal.codegen.references.BoundVar; +import org.simantics.scl.compiler.internal.codegen.utils.ClassBuilder; +import org.simantics.scl.compiler.internal.codegen.utils.Constants; +import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilderBase; +import org.simantics.scl.compiler.internal.codegen.utils.ModuleBuilder; + +public class CHRRuntimeRulesetCodeGenerator implements CHRCodeGenerationConstants { + + public static void generateRuntimeRuleset(ModuleBuilder moduleBuilder, CHRRuleset ruleset) { + ClassBuilder storeClassBuilder = new ClassBuilder(moduleBuilder, Opcodes.ACC_PUBLIC, ruleset.runtimeRulesetName, CHRRuntimeRuleset_name); + if(ruleset.parameters == null) + ruleset.parameters = new BoundVar[0]; + ruleset.parameterTypeDescs = moduleBuilder.getJavaTypeTranslator().getTypeDescs(ruleset.parameters); + + ArrayList hashIndexInitializations = new ArrayList(); + for(CHRConstraint constraint : ruleset.constraints) + generateFact(storeClassBuilder, constraint, hashIndexInitializations); + + for(int i=ruleset.rules.size()-1;i>=0;--i) + generateFactContainer(storeClassBuilder, ruleset, ruleset.rules.get(i)); + + // Fields + for(int i=0;i hashIndexInitializations) { + CHRFactCodeGenerator generator = new CHRFactCodeGenerator(storeClassBuilder, constraint); + generator.generate(hashIndexInitializations); + } + + private static void generateFactContainer(ClassBuilder storeClassBuilder, CHRRuleset ruleset, CHRRule rule) { + CHRPriorityFactContainerCodeGenerator generator = new CHRPriorityFactContainerCodeGenerator(storeClassBuilder, ruleset, rule); + generator.generate(); + rule.containerClassName = generator.containerClassName; + } +}