- private THashSet<BoundVar> usedParameters = new THashSet<BoundVar>();
-
- private void generateActivateI(int i) {
- PrioritizedPlan plan = constraint.plans.get(i);
- MethodBuilder mb = factClassBuilder.addMethod(Opcodes.ACC_PUBLIC, "activate" + i, TypeDesc.BOOLEAN, storeTypeDescArray);
- LocalVariable storeVar = mb.getParameter(0);
- LocalVariable factVar = new LocalVariable(0, factTypeDesc);
- mb.setLocalVariable(ruleset.this_, storeVar);
- mb.setLocalVariable(plan.implementation.getParameters()[0], factVar);
-
- // Set closure parameters
- usedParameters.clear();
- plan.implementation.forValRefs(valRef -> {
- if(valRef.getBinding() instanceof BoundVar)
- usedParameters.add((BoundVar)valRef.getBinding());
- });
- for(int j=0;j<ruleset.parameters.length;++j) {
- BoundVar parameter = ruleset.parameters[j];
- if(!usedParameters.contains(parameter))
- continue;
- mb.loadLocal(storeVar);
- mb.loadField(storeClassBuilder.getClassName(), "p"+j, ruleset.parameterTypeDescs[j]);
- mb.store(parameter);
- }
-
- // Generate code
- //System.out.println("=== activate" + i + " ==========================================================");
- //System.out.println(plan.implementation);
- plan.implementation.markGenerateOnFly();
- plan.implementation.generateCodeWithAlreadyPreparedParameters(mb);
- mb.finish();
- }
-
- private void generateActivate() {
- // @Override
- // public int activate(Object context, int priority) {
- // return -1;
- // }
-
- MethodBuilderBase mb = factClassBuilder.addMethodBase(Opcodes.ACC_PUBLIC, "activate", TypeDesc.INT, new TypeDesc[] {TypeDesc.OBJECT, TypeDesc.INT});
- Label defaultLabel = mb.createLabel();
-
- if(!constraint.isPassive()) {
- // Check if the fact is alive
- mb.loadThis();
- mb.loadField(factClassName, "id", TypeDesc.INT);
- mb.ifZeroComparisonBranch(defaultLabel, "<");
-
- mb.loadLocal(mb.getParameter(0));
- mb.checkCast(storeTypeDesc);
- LocalVariable storeVariable = new LocalVariable(1, storeTypeDesc);
- mb.storeLocal(storeVariable);
-
- TIntArrayList priorities = new TIntArrayList(constraint.plans.size());
- ArrayList<Label> labels = new ArrayList<Label>();
- int lastPriority = -1;
- for(PrioritizedPlan plan : constraint.plans)
- if(plan.priority != lastPriority) {
- priorities.add(plan.priority);
- labels.add(mb.createLabel());
- lastPriority = plan.priority;
- }
-
- mb.loadLocal(mb.getParameter(1));
- mb.switch_(priorities.toArray(), labels.toArray(new Label[labels.size()]), defaultLabel);
- int labelId = -1;
- for(int i=0;i<constraint.plans.size();++i) {
- PrioritizedPlan plan = constraint.plans.get(i);
- if(labelId == -1 || plan.priority != priorities.get(labelId)) {
- if(labelId >= 0) {
- mb.loadConstant(plan.priority);
- mb.returnValue(TypeDesc.INT);
- }
- ++labelId;
- mb.setLocation(labels.get(labelId));
- }
- mb.loadThis();
- mb.loadLocal(storeVariable);
- mb.invokeVirtual(factClassName, "activate" + i, TypeDesc.BOOLEAN, new TypeDesc[] {storeTypeDesc});
- mb.ifZeroComparisonBranch(defaultLabel, "==");
- }
- mb.setLocation(defaultLabel);
- }
- mb.loadConstant(-1);
- mb.returnValue(TypeDesc.INT);
- mb.finish();
- }
-