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; } }