+
+ // Registration
+
+ for(IncludeStatement include : ruleset.includes) {
+ {
+ MethodBuilderBase mb = storeClassBuilder.addMethodBase(Opcodes.ACC_PUBLIC, "register", TypeDesc.VOID,
+ new TypeDesc[] {CHRContext, include.ruleset.runtimeRulesetTypeDesc});
+ LocalVariable contextVar = mb.getParameter(0);
+ LocalVariable importedStore = mb.getParameter(1);
+ ArrayList<CHRConstraint> list = ruleset.inverseActiveConstraintSourceMap.get(include);
+ if(list != null)
+ for(CHRConstraint constraint : list) {
+ int minimumPriority = ruleset.getMinimumPriority(constraint);
+ if(minimumPriority == Integer.MAX_VALUE)
+ continue;
+ mb.loadLocal(importedStore);
+ mb.loadThis();
+ mb.loadField(storeClassBuilder.getClassName(), CHRCodeGenerationConstants.priorityName(minimumPriority), CHRPriorityFactContainer);
+ mb.storeField(include.ruleset.runtimeRulesetClassName, CHRCodeGenerationConstants.nextContainerName(constraint.name), CHRPriorityFactContainer);
+ }
+
+ // update context id
+ mb.loadLocal(contextVar);
+ mb.loadLocal(contextVar);
+ mb.loadField(CHRContext_name, "currentId", FACT_ID_TYPE);
+ mb.loadLocal(importedStore);
+ mb.loadField(include.ruleset.runtimeRulesetClassName, "currentId", FACT_ID_TYPE);
+ mb.invokeStatic("java/lang/Math", "max", FACT_ID_TYPE, new TypeDesc[] {FACT_ID_TYPE, FACT_ID_TYPE});
+ mb.storeField(CHRContext_name, "currentId", FACT_ID_TYPE);
+
+ mb.returnVoid();
+ mb.finish();
+ }
+
+ {
+ MethodBuilderBase mb = storeClassBuilder.addMethodBase(Opcodes.ACC_PUBLIC, "unregister", TypeDesc.VOID,
+ new TypeDesc[] {CHRContext, include.ruleset.runtimeRulesetTypeDesc});
+ LocalVariable contextVar = mb.getParameter(0);
+ LocalVariable importedStore = mb.getParameter(1);
+ ArrayList<CHRConstraint> list = ruleset.inverseActiveConstraintSourceMap.get(include);
+ if(list != null)
+ for(CHRConstraint constraint : list) {
+ int minimumPriority = ruleset.getMinimumPriority(constraint);
+ if(minimumPriority == Integer.MAX_VALUE)
+ continue;
+ mb.loadLocal(importedStore);
+ mb.loadNull();
+ mb.storeField(include.ruleset.runtimeRulesetClassName, CHRCodeGenerationConstants.nextContainerName(constraint.name), CHRPriorityFactContainer);
+ }
+
+ // store context id
+ mb.loadLocal(importedStore);
+ mb.loadLocal(contextVar);
+ mb.loadField(CHRContext_name, "currentId", FACT_ID_TYPE);
+ mb.storeField(include.ruleset.runtimeRulesetClassName, "currentId", FACT_ID_TYPE);
+
+ mb.returnVoid();
+ mb.finish();
+ }
+ }
+
+ if(ruleset.initializer != null) {
+ MethodBuilder mb = storeClassBuilder.addMethod(Opcodes.ACC_PUBLIC, "initialize", TypeDesc.VOID, new TypeDesc[] {CHRContext});
+ ruleset.rulesetObject.realizeMethod(mb,
+ (i, target) -> {
+ mb.loadThis();
+ mb.loadField(ruleset.runtimeRulesetClassName, CHRCodeGenerationConstants.parameterName(i), parameterTypeDescs[i]);
+ mb.store(target);
+ },
+ ruleset.initializer, mb.getThis(ruleset.runtimeRulesetTypeDesc), mb.getParameter(0));
+ mb.finish();
+ }
+ if(ruleset.deinitializer != null) {
+ MethodBuilder mb = storeClassBuilder.addMethod(Opcodes.ACC_PUBLIC, "deinitialize", TypeDesc.VOID, new TypeDesc[] {CHRContext});
+ ruleset.rulesetObject.realizeMethod(mb,
+ (i, target) -> {
+ mb.loadThis();
+ mb.loadField(ruleset.runtimeRulesetClassName, CHRCodeGenerationConstants.parameterName(i), parameterTypeDescs[i]);
+ mb.store(target);
+ },
+ ruleset.deinitializer, mb.getThis(ruleset.runtimeRulesetTypeDesc), mb.getParameter(0));
+ mb.finish();
+ }