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%2FCHRRuleset.java;h=47d57dabca1efb45e9fc42e8648c7244a2603a64;hp=55bbcfe34f9c245968083ab39e374b9814fc8908;hb=e12e3ad357853a07b24923b341c4732962a94623;hpb=fe1a2f532761669e67da4db4ae15096ced8a04db diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRuleset.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRuleset.java index 55bbcfe34..47d57dabc 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRuleset.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRuleset.java @@ -3,6 +3,7 @@ package org.simantics.scl.compiler.elaboration.chr; import java.util.ArrayList; import org.cojen.classfile.TypeDesc; +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.compilation.CompilationContext; import org.simantics.scl.compiler.constants.BooleanConstant; import org.simantics.scl.compiler.constants.Constant; @@ -84,7 +85,12 @@ public class CHRRuleset extends Symbol { public CHRRuleset() { initConstraint = new CHRConstraint(Locations.NO_LOCATION, INIT_CONSTRAINT, Type.EMPTY_ARRAY); - constraints.add(initConstraint); + addConstraint(initConstraint); + } + + public void addConstraint(CHRConstraint constraint) { + constraints.add(constraint); + constraint.setParent(this); } public void resolve(TranslationContext context) { @@ -162,33 +168,37 @@ public class CHRRuleset extends Symbol { } } - public void compile(SimplificationContext context) { - initializeCodeGeneration(context.getCompilationContext()); - if(extensible) - applyExtensibleDefaults(); - UsageAnalysis.analyzeUsage(this); - for(CHRRule rule : rules) { - rule.compile(context.getCompilationContext(), initConstraint); - for(CHRSearchPlan plan : rule.plans) { - CHRConstraint constraint = plan.constraint; - if(!activeConstraintGGInfo.containsKey(constraint)) { - activeConstraintGGInfo.put(constraint, new CHRConstraintGGInfo(rule.priority)); - IncludeStatement include = constraintSourceMap.get(constraint); - if(include != null) { - ArrayList list = inverseActiveConstraintSourceMap.get(include); - if(list == null) { - list = new ArrayList(4); - inverseActiveConstraintSourceMap.put(include, list); + private void compile(SimplificationContext context) { + try { + initializeCodeGeneration(context.getCompilationContext()); + if(extensible) + applyExtensibleDefaults(); + UsageAnalysis.analyzeUsage(this); + for(CHRRule rule : rules) { + rule.compile(context.getCompilationContext(), initConstraint); + for(CHRSearchPlan plan : rule.plans) { + CHRConstraint constraint = plan.constraint; + if(!activeConstraintGGInfo.containsKey(constraint)) { + activeConstraintGGInfo.put(constraint, new CHRConstraintGGInfo(rule.priority)); + IncludeStatement include = constraintSourceMap.get(constraint); + if(include != null) { + ArrayList list = inverseActiveConstraintSourceMap.get(include); + if(list == null) { + list = new ArrayList(4); + inverseActiveConstraintSourceMap.put(include, list); + } + list.add(constraint); } - list.add(constraint); } } } - } - // remove init constraint if it is not useful - if(getMinimumPriority(initConstraint) == Integer.MAX_VALUE) { - constraints.remove(0); - initConstraint = null; + // remove init constraint if it is not useful + if(getMinimumPriority(initConstraint) == Integer.MAX_VALUE) { + constraints.remove(0); + initConstraint = null; + } + } catch(Exception e) { + throw InternalCompilerError.injectLocation(location, e); } } @@ -206,13 +216,22 @@ public class CHRRuleset extends Symbol { } } - public void simplify(SimplificationContext context) { - for(IncludeStatement include : includes) + private void simplify(SimplificationContext context) { + for(IncludeStatement include : includes) { + //include.ruleset.simplifyAndCompileIfNeeded(context); include.value = include.value.simplify(context); + } for(CHRRule rule : rules) rule.simplify(context); } + public void simplifyAndCompileIfNeeded(SimplificationContext context) { + if(runtimeRulesetTypeDesc == null) { + simplify(context); + compile(context); + } + } + public void setRulesetType(TCon type, String className) { this.runtimeRulesetType = type; this.runtimeRulesetClassName = className; @@ -257,7 +276,7 @@ public class CHRRuleset extends Symbol { PlanRealizer realizer = new PlanRealizer(cachedContext, this, runtimeRulesetVariable, implementationParameters[0], plan.ops); realizer.nextOp(methodWriter); if(methodWriter.isUnfinished()) - methodWriter.return_(BooleanConstant.TRUE); + methodWriter.return_(rule.location, BooleanConstant.TRUE); } } if(!includes.isEmpty() || extensible) { @@ -273,7 +292,7 @@ public class CHRRuleset extends Symbol { methodWriter.apply(Locations.NO_LOCATION, new JavaMethod(true, runtimeRulesetClassName, "register", Types.PROC, Types.UNIT, new Type[] {runtimeRulesetType, Types.CHRContext}), object.getTarget(), methodWriter.getParameters()[0]); - methodWriter.return_(NoRepConstant.UNIT); + methodWriter.return_(location, NoRepConstant.UNIT); } { CodeWriter methodWriter = object.createMethod(w.getModuleWriter(), TVar.EMPTY_ARRAY, Types.PROC, Types.UNIT, new Type[] {Types.CHRContext}); @@ -287,7 +306,7 @@ public class CHRRuleset extends Symbol { methodWriter.apply(Locations.NO_LOCATION, new JavaMethod(true, runtimeRulesetClassName, "unregister", Types.PROC, Types.UNIT, new Type[] {runtimeRulesetType, Types.CHRContext}), object.getTarget(), methodWriter.getParameters()[0]); - methodWriter.return_(NoRepConstant.UNIT); + methodWriter.return_(location, NoRepConstant.UNIT); } } if(initConstraint != null) {