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%2Frelations%2FCHRConstraint.java;h=ee73477912e3d8ff385f83a29e33562eae8ce0a2;hp=d3d6bdf90ee9f26da83142c76f91344dc66a8f13;hb=1ec0193a5a5b8f368b03adb24acd762838ddf8ea;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/CHRConstraint.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/CHRConstraint.java index d3d6bdf90..ee7347791 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/CHRConstraint.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/CHRConstraint.java @@ -6,22 +6,25 @@ import java.util.Collection; import org.cojen.classfile.TypeDesc; import org.simantics.scl.compiler.compilation.CompilationContext; import org.simantics.scl.compiler.constants.Constant; -import org.simantics.scl.compiler.constants.JavaConstructor; import org.simantics.scl.compiler.constants.JavaMethod; +import org.simantics.scl.compiler.constants.NoRepConstant; import org.simantics.scl.compiler.constants.generic.CallJava; +import org.simantics.scl.compiler.constants.generic.MethodRef.ConstructorRef; import org.simantics.scl.compiler.constants.generic.MethodRef.FieldRef; import org.simantics.scl.compiler.constants.generic.MethodRef.ObjectMethodRef; import org.simantics.scl.compiler.constants.generic.ParameterStackItem; import org.simantics.scl.compiler.constants.generic.StackItem; import org.simantics.scl.compiler.elaboration.chr.CHRRelation; import org.simantics.scl.compiler.elaboration.chr.CHRRuleset; -import org.simantics.scl.compiler.elaboration.chr.plan.PrioritizedPlan; -import org.simantics.scl.compiler.internal.codegen.chr.CHRCodeGenerator; +import org.simantics.scl.compiler.internal.codegen.chr.CHRCodeGenerationConstants; +import org.simantics.scl.compiler.internal.codegen.chr.CHRRuntimeRulesetCodeGenerator; import org.simantics.scl.compiler.internal.codegen.references.IVal; import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator; import org.simantics.scl.compiler.internal.codegen.types.StandardTypeConstructor; +import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter; import org.simantics.scl.compiler.internal.parsing.Symbol; import org.simantics.scl.compiler.types.TCon; +import org.simantics.scl.compiler.types.TPred; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; @@ -31,13 +34,14 @@ import gnu.trove.map.hash.TIntObjectHashMap; public class CHRConstraint extends Symbol implements CHRRelation { public final String name; public final Type[] parameterTypes; + public String[] fieldNames; public boolean implicitlyDeclared; // Analysis - public int firstPriorityAdded; + //public int firstPriorityAdded; public int lastPriorityAdded; - public int firstPriorityRemoved; + //public int firstPriorityRemoved; public int lastPriorityRemoved; // Transient info @@ -52,12 +56,10 @@ public class CHRConstraint extends Symbol implements CHRRelation { public Constant[] accessors; public Constant addProcedure; public Constant removeProcedure; - public Constant isAlive; - public TIntObjectHashMap indices; + public String nextContainerFieldName; - // Query plans - public ArrayList plans = new ArrayList(); + public TIntObjectHashMap indices; public static class IndexInfo { public final int indexMask; @@ -83,31 +85,51 @@ public class CHRConstraint extends Symbol implements CHRRelation { JavaTypeTranslator jtt = context.javaTypeTranslator; this.parentRuleset = parentRuleset; - this.factClassName = parentRuleset.storeClassName + "$" + name; - TCon factTypeConstructor = Types.con(parentRuleset.storeType.module, parentRuleset.storeType.name + "$" + name); + this.factClassName = parentRuleset.runtimeRulesetClassName + "$" + name; + TCon factTypeConstructor = Types.con(parentRuleset.runtimeRulesetType.module, parentRuleset.runtimeRulesetType.name + "$" + name); this.factType = Types.apply(factTypeConstructor, TVar.EMPTY_ARRAY); this.factTypeDesc = TypeDesc.forClass(factClassName); Type[] constructorTypes = new Type[parameterTypes.length+1]; constructorTypes[0] = Types.INTEGER; - for(int i=0;i stackItems = new ArrayList(constructorTypes.length); + stackItems.add(new ParameterStackItem(0, Types.INTEGER)); + for(int i=0;i(Math.min(10, 1 << parameterTypes.length)); if(context.module != null) // for unit testing context.module.addTypeDescriptor(factTypeConstructor.name, new StandardTypeConstructor(factTypeConstructor, TVar.EMPTY_ARRAY, factTypeDesc)); + + // next container + if(parentRuleset.extensible) { + nextContainerFieldName = CHRCodeGenerationConstants.nextContainerName(name); + } } @Override @@ -135,19 +157,19 @@ public class CHRConstraint extends Symbol implements CHRRelation { private IndexInfo createIndexInfo(CompilationContext context, int indexMask) { ArrayList keyTypeList = new ArrayList(parameterTypes.length+1); - keyTypeList.add(parentRuleset.storeType); + keyTypeList.add(parentRuleset.runtimeRulesetType); for(int i=0;i>i)&1)==1) keyTypeList.add(parameterTypes[i]); String indexName = nameOfIndex(indexMask, parameterTypes.length); Constant accessIndex; if(indexMask == 0) { - accessIndex = new CallJava(TVar.EMPTY_ARRAY, Types.PROC, factType, new Type[] {parentRuleset.storeType}, - null, new FieldRef(parentRuleset.storeClassName, name + "$" + indexName, factTypeDesc), null); + accessIndex = new CallJava(TVar.EMPTY_ARRAY, Types.PROC, factType, new Type[] {parentRuleset.runtimeRulesetType}, + null, new FieldRef(parentRuleset.runtimeRulesetClassName, name + "$" + indexName, factTypeDesc), null); } else { Type[] keyTypes = keyTypeList.toArray(new Type[keyTypeList.size()]); - accessIndex = new JavaMethod(true, parentRuleset.storeClassName, name + "$" + indexName, Types.PROC, factType, keyTypes); + accessIndex = new JavaMethod(true, parentRuleset.runtimeRulesetClassName, name + "$" + indexName, Types.PROC, factType, keyTypes); } return new IndexInfo( indexMask, @@ -157,18 +179,18 @@ public class CHRConstraint extends Symbol implements CHRRelation { null, new FieldRef(factClassName, indexName + "Next", factTypeDesc), null) ); } - - public Constant accessComponent(int i) { - return accessors[i]; - } - public IVal fetchFromIndex(CompilationContext context, int boundMask) { + public IndexInfo getOrCreateIndex(CompilationContext context, int boundMask) { IndexInfo indexInfo = indices.get(boundMask); if(indexInfo == null) { indexInfo = createIndexInfo(context, boundMask); indices.put(boundMask, indexInfo); } - return indexInfo.firstFact; + return indexInfo; + } + + public IVal fetchFromIndex(CompilationContext context, int boundMask) { + return getOrCreateIndex(context, boundMask).firstFact; } public Constant nextElement(CompilationContext context, int boundMask) { @@ -177,7 +199,7 @@ public class CHRConstraint extends Symbol implements CHRRelation { indexInfo = createIndexInfo(context, boundMask); indices.put(boundMask, indexInfo); } - return indexInfo.nextFact; + return getOrCreateIndex(context, boundMask).nextFact; } @@ -190,19 +212,27 @@ public class CHRConstraint extends Symbol implements CHRRelation { public void setMayBeRemoved() { if(removeProcedure == null) { - removeProcedure = new CallJava(TVar.EMPTY_ARRAY, Types.PROC, Types.UNIT, new Type[] {parentRuleset.storeType, factType}, - new StackItem[] {new ParameterStackItem(1, factType), new ParameterStackItem(0, parentRuleset.storeType)}, - new ObjectMethodRef(false, factClassName, "remove", TypeDesc.VOID, new TypeDesc[] {parentRuleset.storeTypeDesc}), + removeProcedure = new CallJava(TVar.EMPTY_ARRAY, Types.PROC, Types.UNIT, new Type[] {parentRuleset.runtimeRulesetType, factType}, + new StackItem[] {new ParameterStackItem(1, factType), new ParameterStackItem(0, parentRuleset.runtimeRulesetType)}, + new ObjectMethodRef(false, factClassName, "remove", TypeDesc.VOID, new TypeDesc[] {parentRuleset.runtimeRulesetTypeDesc}), null); - isAlive = new JavaMethod(true, factClassName, "isAlive", Types.PROC, Types.BOOLEAN, factType); } } - public int getMinimumPriority() { - return plans.get(0).priority; + public TPred[] getTypeConstraints() { + return TPred.EMPTY_ARRAY; + } + + public IVal accessComponent(long location, CodeWriter w, IVal fact, int i) { + Constant accessor = accessors[i]; + if(accessor == null) + return NoRepConstant.UNIT; + else + return w.apply(location, accessor, fact); } - public boolean isPassive() { - return plans.isEmpty(); + @Override + public String[] getFieldNames() { + return fieldNames; } }