-
- moduleBuilder.addClass(storeClassBuilder);
- }
-
- private static void generateFact(ClassBuilder storeClassBuilder, CHRConstraint constraint, ArrayList<StoreInitialization> hashIndexInitializations) {
- CHRRuleset ruleset = constraint.parentRuleset;
- boolean supportsRemoval = constraint.mayBeRemoved();
-
- ModuleBuilder moduleBuilder = storeClassBuilder.getModuleBuilder();
- JavaTypeTranslator jtt = moduleBuilder.getJavaTypeTranslator();
- TypeDesc storeTypeDesc = storeClassBuilder.getType();
- TypeDesc[] storeTypeDescArray = new TypeDesc[] { storeTypeDesc };
-
- String factClassName = storeClassBuilder.getClassName() + "$" + constraint.name;
- TypeDesc factTypeDesc = TypeDesc.forClass(factClassName);
- ClassBuilder factClassBuilder = new ClassBuilder(moduleBuilder, Opcodes.ACC_PUBLIC, factClassName, "java/lang/Object", Fact_name);
-
- // Fields
-
- /* public int id;
- public int c0; // key
- public int c1;
- public ExampleFact bfPrev;
- public ExampleFact bfNext;
- */
- TypeDesc[] parameterTypeDescs = jtt.toTypeDescs(constraint.parameterTypes);
- factClassBuilder.addField(Opcodes.ACC_PUBLIC, "id", FACT_ID_TYPE);
- for(int i=0;i<constraint.parameterTypes.length;++i)
- factClassBuilder.addField(Opcodes.ACC_PUBLIC, "c" + i, parameterTypeDescs[i]);
-
- for(IndexInfo indexInfo : constraint.getIndices()) {
- if(supportsRemoval)
- factClassBuilder.addField(Opcodes.ACC_PUBLIC, indexInfo.indexName + "Prev", factTypeDesc);
- factClassBuilder.addField(Opcodes.ACC_PUBLIC, indexInfo.indexName + "Next", factTypeDesc);
-
- String hashIndexField = constraint.name + "$" + indexInfo.indexName;
- if(indexInfo.indexMask == 0) {
- // If there are now bound parameters, use just a direct reference to a fact
- storeClassBuilder.addField(Opcodes.ACC_PUBLIC, hashIndexField, factTypeDesc);
- }
- else {
- ClassBuilder hashClass = generateSpecializedHashIndex(storeClassBuilder, constraint, indexInfo, factTypeDesc, factClassName);
- moduleBuilder.addClass(hashClass);
- hashIndexInitializations.add(new StoreInitialization(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, hashIndexField, CHRHashIndex, hashClass.getClassName()));
- }
- }
-
- // Method: get
-
- hashIndexInitializations.add(new StoreInitialization(Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL, constraint.name + "$temp", factTypeDesc, factClassName));
-
-
- {
- /*
- public ExampleFact ExampleFact$bf(int c0) {
- ExampleFact$temp.c0 = c0;
- return (ExampleFact)ExampleFact_bfIndex.getEqual(ExampleFact$temp);
- }
- */
- for(IndexInfo indexInfo : constraint.getIndices()) {
- /*if(indexInfo.indexMask == 0) {
- MethodBuilderBase mb = storeClassBuilder.addMethodBase(Opcodes.ACC_PUBLIC, constraint.name + "$" + indexInfo.indexName,
- factTypeDesc, Constants.EMPTY_TYPEDESC_ARRAY);
- mb.loadThis();
- mb.loadField(storeClassBuilder.getClassName(), constraint.name + "$" + indexInfo.indexName, factTypeDesc);
- mb.returnValue(factTypeDesc);
- mb.finish();
- }*/
- if(indexInfo.indexMask != 0) {
- ArrayList<TypeDesc> getParameterTypeDescs = new ArrayList<TypeDesc>(constraint.parameterTypes.length);
- for(int i=0;i<constraint.parameterTypes.length;++i)
- if(((indexInfo.indexMask>>i)&1)==1)
- getParameterTypeDescs.add(parameterTypeDescs[i]);
- MethodBuilderBase mb = storeClassBuilder.addMethodBase(Opcodes.ACC_PUBLIC, constraint.name + "$" + indexInfo.indexName, factTypeDesc,
- getParameterTypeDescs.toArray(new TypeDesc[getParameterTypeDescs.size()]));
- mb.loadThis();
- mb.loadField(storeClassBuilder.getClassName(), constraint.name + "$temp", factTypeDesc);
- LocalVariable tempFactVar = mb.createLocalVariable("temp", factTypeDesc);
- mb.storeLocal(tempFactVar);
- int parameterId=0;
- for(int i=0;i<constraint.parameterTypes.length;++i)
- if(((indexInfo.indexMask>>i)&1)==1) {
- mb.loadLocal(tempFactVar);
- mb.loadLocal(mb.getParameter(parameterId++));
- mb.storeField(factClassName, "c"+i, parameterTypeDescs[i]);
- }
-
- mb.loadThis();
- mb.loadField(storeClassBuilder.getClassName(), constraint.name + "$" + indexInfo.indexName, CHRHashIndex);
- mb.loadLocal(tempFactVar);
- mb.invokeVirtual(CHRHashIndex_name, supportsRemoval ? "getEqual" : "getEqualNoRemovals", TypeDesc.OBJECT, Constants.OBJECTS[1]);
- mb.checkCast(factTypeDesc);
-
- mb.returnValue(factTypeDesc);
- mb.finish();
- }
- }
- }
-
- // Method: add
-
- {
- MethodBuilderBase mb = factClassBuilder.addMethodBase(Opcodes.ACC_PUBLIC, "add", TypeDesc.VOID, storeTypeDescArray);
- LocalVariable storeParameter = mb.getParameter(0);
- for(IndexInfo indexInfo : constraint.getIndices()) {
- String linkedListPrev = indexInfo.indexName + "Prev";
- String linkedListNext = indexInfo.indexName + "Next";
- String storeHashIndexName = constraint.name + "$" + indexInfo.indexName;
-
- // public void add(ExampleStore store) {
- // bfNext = (ExampleFact)store.ExampleFact_bfIndex.addFreshAndReturnOld(this);
- // if(bfNext != null)
- // bfNext.bfPrev = this;
- // }
-
- if(indexInfo.indexMask == 0) {
- mb.loadThis();
- mb.loadLocal(storeParameter);
- mb.loadField(storeClassBuilder.getClassName(), storeHashIndexName, factTypeDesc);
- if(supportsRemoval)
- mb.dupX1();
- mb.storeField(factClassName, linkedListNext, factTypeDesc);
- if(supportsRemoval) {
- Label cont = new Label();
- mb.ifNullBranch(cont, true);
- mb.loadThis();
- mb.loadField(factClassName, linkedListNext, factTypeDesc);
- mb.loadThis();
- mb.storeField(factClassName, linkedListPrev, factTypeDesc);
- mb.setLocation(cont);
- }
- mb.loadLocal(storeParameter);
- mb.loadThis();
- mb.storeField(storeClassBuilder.getClassName(), storeHashIndexName, factTypeDesc);
- }
- else {
- // bfNext = (ExampleFact)store.ExampleFact_bfIndex.addFreshAndReturnOld(this);
- mb.loadThis();
- mb.loadLocal(storeParameter);
- mb.loadField(storeClassBuilder.getClassName(), storeHashIndexName, CHRHashIndex);
- mb.loadThis();
- mb.invokeVirtual(CHRHashIndex_name, supportsRemoval ? "addFreshAndReturnOld" : "addFreshAndReturnOld", TypeDesc.OBJECT, Constants.OBJECTS[1]);
- mb.checkCast(factTypeDesc);
- if(supportsRemoval)
- mb.dupX1();
- mb.storeField(factClassName, linkedListNext, factTypeDesc);
- // leaves bfNext on the stack
-
- //if(bfNext != null)
- // bfNext.bfPrev = this;
- if(supportsRemoval) {
- Label cont = new Label();
- mb.ifNullBranch(cont, true);
- mb.loadThis();
- mb.loadField(factClassName, linkedListNext, factTypeDesc);
- mb.loadThis();
- mb.storeField(factClassName, linkedListPrev, factTypeDesc);
- mb.setLocation(cont);
- }
- }
- }
- if(!constraint.isPassive()) {
- mb.loadLocal(storeParameter);
- mb.loadField(storeClassBuilder.getClassName(), QUEUE, FactActivationQueue);
- mb.loadConstant(constraint.getMinimumPriority());
- mb.loadThis();
- mb.invokeVirtual(FactActivationQueue_name, "add", TypeDesc.VOID, new TypeDesc[] {TypeDesc.INT, Fact});
- }
- mb.returnVoid();
- mb.finish();
- }
-
- // Method: remove
-
- if(supportsRemoval) {
- // public void remove(ExampleStore store) {
- // if(bfPrev == null) {
- // if(bfNext == null)
- // store.ExampleFact_bfIndex.removeKnownToExistKey(this);
- // else {
- // bfNext.bfPrev = null;
- // store.ExampleFact_bfIndex.replaceKnownToExistKey(this, bfNext);
- // }
- // }
- // else {
- // bfPrev.bfNext = bfNext;
- // if(bfNext != null)
- // bfNext.bfPrev = bfPrev;
- // }
- // }
-
- MethodBuilderBase mb = factClassBuilder.addMethodBase(Opcodes.ACC_PUBLIC, "remove", TypeDesc.VOID, storeTypeDescArray);
- LocalVariable storeParameter = mb.getParameter(0);
- for(IndexInfo indexInfo : constraint.getIndices()) {
- String linkedListPrev = indexInfo.indexName + "Prev";
- String linkedListNext = indexInfo.indexName + "Next";
- String storeHashIndexName = constraint.name + "$" + indexInfo.indexName;
-
- Label nextIndex = mb.createLabel();
-
- // if(bfPrev == null) {
- mb.loadThis();
- mb.loadField(factClassName, linkedListPrev, factTypeDesc);
- Label else1 = new Label();
- mb.ifNullBranch(else1, false);
-
- // if(bfNext == null)
- mb.loadThis();
- mb.loadField(factClassName, linkedListNext, factTypeDesc);
- Label else2 = new Label();
- mb.ifNullBranch(else2, false);
-
- // store.ExampleFact_bfIndex.removeKnownToExistKey(this);
- if(indexInfo.indexMask == 0) {
- mb.loadLocal(storeParameter);
- mb.loadNull();
- mb.storeField(storeClassBuilder.getClassName(), storeHashIndexName, factTypeDesc);
- }
- else {
- mb.loadLocal(storeParameter);
- mb.loadField(storeClassBuilder.getClassName(), storeHashIndexName, CHRHashIndex);
- mb.loadThis();
- mb.invokeVirtual(CHRHashIndex_name, "removeKnownToExistKey", TypeDesc.VOID, Constants.OBJECTS[1]);
- }
- mb.branch(nextIndex);
-
- // else {
- mb.setLocation(else2);
- // bfNext.bfPrev = null;
- mb.loadThis();
- mb.loadField(factClassName, linkedListNext, factTypeDesc);
- mb.loadNull();
- mb.storeField(factClassName, linkedListPrev, factTypeDesc);
- // store.ExampleFact_bfIndex.replaceKnownToExistKey(this, bfNext);
- if(indexInfo.indexMask == 0) {
- mb.loadLocal(storeParameter);
- mb.loadThis();
- mb.loadField(factClassName, linkedListNext, factTypeDesc);
- mb.storeField(storeClassBuilder.getClassName(), storeHashIndexName, factTypeDesc);
- }
- else {
- mb.loadLocal(storeParameter);
- mb.loadField(storeClassBuilder.getClassName(), storeHashIndexName, CHRHashIndex);
- mb.loadThis();
- mb.loadThis();
- mb.loadField(factClassName, linkedListNext, factTypeDesc);
- mb.invokeVirtual(CHRHashIndex_name, "replaceKnownToExistKey", TypeDesc.VOID, Constants.OBJECTS[2]);
- }
- mb.branch(nextIndex);
- // }
-
- // else {
- mb.setLocation(else1);
- // bfPrev.bfNext = bfNext;
- mb.loadThis();
- mb.loadField(factClassName, linkedListPrev, factTypeDesc);
- mb.loadThis();
- mb.loadField(factClassName, linkedListNext, factTypeDesc);
- mb.storeField(factClassName, linkedListNext, factTypeDesc);
- // if(bfNext != null)
- mb.loadThis();
- mb.loadField(factClassName, linkedListNext, factTypeDesc);
- Label else3 = new Label();
- mb.ifNullBranch(else3, true);
- // bfNext.bfPrev = bfPrev;
- mb.loadThis();
- mb.loadField(factClassName, linkedListNext, factTypeDesc);
- mb.loadThis();
- mb.loadField(factClassName, linkedListPrev, factTypeDesc);
- mb.storeField(factClassName, linkedListPrev, factTypeDesc);
- mb.setLocation(else3);
- mb.branch(nextIndex);
- // }
-
- mb.setLocation(nextIndex);
- }
- mb.loadThis();
- mb.loadConstant(-1);
- mb.storeField(factClassName, "id", FACT_ID_TYPE);
- mb.returnVoid();
- mb.finish();
- }
-
- // Method: isAlive
-
- {
- // @Override
- // public boolean isAlive() {
- // return id >= 0;
- // }
-
- MethodBuilderBase mb = factClassBuilder.addMethodBase(Opcodes.ACC_PUBLIC, "isAlive", TypeDesc.BOOLEAN, Constants.EMPTY_TYPEDESC_ARRAY);
- if(supportsRemoval) {
- mb.loadThis();
- mb.loadField(factClassName, "id", FACT_ID_TYPE);