generateFact(storeClassBuilder, constraint, hashIndexInitializations);
// Fields
- for(int i=0;i<ruleset.parameterTypeDescs.length;++i)
- storeClassBuilder.addField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "p" + i, ruleset.parameterTypeDescs[i]);
+ for(int i=0;i<ruleset.parameterTypeDescs.length;++i) {
+ TypeDesc typeDesc = ruleset.parameterTypeDescs[i];
+ if(typeDesc.equals(TypeDesc.VOID))
+ continue;
+ storeClassBuilder.addField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "p" + i, typeDesc);
+ }
storeClassBuilder.addField(Opcodes.ACC_PUBLIC, "currentId", FACT_ID_TYPE);
for(StoreInitialization ini : hashIndexInitializations)
storeClassBuilder.addField(ini.access, ini.fieldName, ini.fieldType);
mb.loadThis();
mb.invokeConstructor(storeClassBuilder.getSuperClassName(), Constants.EMPTY_TYPEDESC_ARRAY);
for(int i=0;i<ruleset.parameterTypeDescs.length;++i) {
+ TypeDesc typeDesc = ruleset.parameterTypeDescs[i];
+ if(typeDesc.equals(TypeDesc.VOID))
+ continue;
mb.loadThis();
mb.loadLocal(mb.getParameter(i));
mb.storeField(ruleset.storeClassName, "p" + i, ruleset.parameterTypeDescs[i]);
*/
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(int i=0;i<constraint.parameterTypes.length;++i) {
+ TypeDesc typeDesc = parameterTypeDescs[i];
+ if(typeDesc.equals(TypeDesc.VOID))
+ continue;
+ if(parameterTypeDescs[i] != TypeDesc.VOID)
+ factClassBuilder.addField(Opcodes.ACC_PUBLIC, fieldName(i), typeDesc);
+ }
for(IndexInfo indexInfo : constraint.getIndices()) {
if(supportsRemoval)
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]);
+ TypeDesc typeDesc = parameterTypeDescs[i];
+ if(!typeDesc.equals(TypeDesc.VOID)) {
+ mb.loadLocal(tempFactVar);
+ mb.loadLocal(mb.getParameter(parameterId));
+ mb.storeField(factClassName, fieldName(i), typeDesc);
+ }
+ ++parameterId;
}
mb.loadThis();
// this.c1 = c1;
// }
- TypeDesc[] constructorParameters = new TypeDesc[parameterTypeDescs.length+1];
- constructorParameters[0] = FACT_ID_TYPE;
- for(int i=0;i<parameterTypeDescs.length;++i)
- constructorParameters[i+1] = parameterTypeDescs[i];
- MethodBuilderBase mb = factClassBuilder.addConstructor(Opcodes.ACC_PUBLIC, constructorParameters);
+ ArrayList<TypeDesc> constructorParameters = new ArrayList<TypeDesc>(parameterTypeDescs.length+1);
+ constructorParameters.add(FACT_ID_TYPE);
+ for(TypeDesc typeDesc : parameterTypeDescs) {
+ if(typeDesc.equals(TypeDesc.VOID))
+ continue;
+ constructorParameters.add(typeDesc);
+ }
+ MethodBuilderBase mb = factClassBuilder.addConstructor(Opcodes.ACC_PUBLIC, constructorParameters.toArray(new TypeDesc[constructorParameters.size()]));
mb.loadThis();
mb.invokeConstructor(factClassBuilder.getSuperClassName(), Constants.EMPTY_TYPEDESC_ARRAY);
mb.loadThis();
mb.loadLocal(mb.getParameter(0));
mb.storeField(factClassName, "id", FACT_ID_TYPE);
- for(int i=0;i<constraint.parameterTypes.length;++i) {
+ for(int i=0,parameterId=1;i<constraint.parameterTypes.length;++i) {
+ TypeDesc typeDesc = parameterTypeDescs[i];
+ if(typeDesc.equals(TypeDesc.VOID))
+ continue;
mb.loadThis();
- mb.loadLocal(mb.getParameter(i+1));
- mb.storeField(factClassName, "c" + i, parameterTypeDescs[i]);
+ mb.loadLocal(mb.getParameter(parameterId++));
+ mb.storeField(factClassName, fieldName(i), typeDesc);
}
mb.returnVoid();
mb.finish();
if(fieldTypeDesc.equals(TypeDesc.VOID))
continue;
mb.loadLocal(aVar);
- mb.loadField(factClassName, "c"+i, fieldTypeDesc);
+ mb.loadField(factClassName, fieldName(i), fieldTypeDesc);
mb.loadLocal(bVar);
- mb.loadField(factClassName, "c"+i, fieldTypeDesc);
+ mb.loadField(factClassName, fieldName(i), fieldTypeDesc);
CodeBuilderUtils.equals(mb, fieldTypeDesc, failure);
}
if(fieldTypeDesc.equals(TypeDesc.VOID))
continue;
mb.loadLocal(factVar);
- mb.loadField(factClassName, "c"+i, fieldTypeDesc);
+ mb.loadField(factClassName, fieldName(i), fieldTypeDesc);
CodeBuilderUtils.hashCode(mb, fieldTypeDesc);
mb.math(Opcodes.IXOR);
mb.loadConstant(16777619);
return hashIndexClassBuilder;
}
+
+ public static String fieldName(int id) {
+ return "c" + id;
+ }
}