// Define the __SPEC_CLEAN__ function for clean-up
newCode.add(COMMENT("Cleanup routine of sequential variables"));
- newCode.add("static void __SPEC_CLEANUP__() {");
- addAllCodeWithIndent(newCode, construct.code.cleanupCode, "\t");
+ newCode.add("static bool __SPEC_CLEANUP__() {");
+ if (construct.code.cleanupCode.size() > 0) {
+ addAllCodeWithIndent(newCode, construct.code.cleanupCode, "\t");
+ } else {
+ newCode.add("\treturn true;"); // If not specified return true
+ }
+
newCode.add("}");
newCode.add("");
newCode.add("\t" + STRUCT_NEW_DECLARE_DEFINE(ANNO_INIT, structName));
newCode.add("\t"
+ ASSIGN_TO_PTR(structName, "init_func",
- "(void_func_t*) __SPEC_INIT__"));
+ "(void_func_t) __SPEC_INIT__"));
newCode.add("\t"
+ ASSIGN_TO_PTR(structName, "cleanup_func",
- "(void_func_t*) __SPEC_CLEANUP__"));
+ "(cleanup_func_t) __SPEC_CLEANUP__"));
newCode.add("\t"
+ ASSIGN_TO_PTR(structName, "func_table", "func_ptr_table"));
newCode.add("\t"
if (templateList == null) {
newCode.add(DECLARE("void**", varPrefix + "func_ptr_table"));
newCode.add(DECLARE("hb_rule**", varPrefix + "hb_rule_table"));
+ newCode.add(DECLARE("commutativity_rule**", varPrefix + "commutativity_rule_table"));
for (int i = 0; i < construct.code.declareVar.size(); i++) {
VariableDeclaration varDecl = construct.code.declareVar.get(i);
newCode.add(DECLARE(varDecl.type, varPrefix + varDecl.name));
newCode.add(DECLARE("void**", varPrefix + "func_ptr_table"));
newCode.add(templateDecl);
newCode.add(DECLARE("hb_rule**", varPrefix + "hb_rule_table"));
+ newCode.add(templateDecl);
+ newCode.add(DECLARE("commutativity_rule**", varPrefix + "commutativity_rule_table"));
for (int i = 0; i < construct.code.declareVar.size(); i++) {
VariableDeclaration varDecl = construct.code.declareVar.get(i);
newCode.add(templateDecl);
for (int i = 0; i < rules.size(); i++) {
CommutativityRule rule = rules.get(i);
- String interfaceNumBefore = Integer
- .toString(semantics.interface2Num.get(rule.method1));
+ Integer method = semantics.interface2Num.get(rule.method1);
+ if (method == null) {
+ System.out.println("Wrong method label in commutativity rule: " + rule.method1);
+ }
+ String interfaceNumBefore = Integer.toString(method);
String interfaceNumAfter = Integer.toString(semantics.interface2Num
.get(rule.method2));
String conditionFuncName = "CommutativityCondition" + i;
newCode.add("\t"
+ ASSIGN_TO_PTR("rule", "interface_num_after",
interfaceNumAfter));
+ newCode.add("\t"
+ + ASSIGN_TO_PTR("rule", "rule",
+ "\"" + rule.condition + "\""));
+
newCode.add("\t"
+ ASSIGN_TO_PTR("rule", "condition", conditionFuncName));
String structName = "cp_clear", anno = "annotation_cp_clear";
newCode.add("\t\t"
+ STRUCT_NEW_DECLARE_DEFINE(ANNO_CP_CLEAR, structName));
- // String labelNum = Integer.toString(semantics.commitPointLabel2Num
- // .get(construct.label));
- // String interfaceNum = getCPInterfaceNum(semantics, construct.label);
- // newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_num",
- // labelNum));
- // newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "interface_num",
- // interfaceNum));
+
+ String labelNum = Integer.toString(semantics.commitPointLabel2Num
+ .get(construct.label));
+ String labelName = construct.label;
+ newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_name",
+ "\"" + labelName + "\""));
+ newCode.add("\t\t" + ASSIGN_TO_PTR(structName, "label_num",
+ labelNum));
+
newCode.add("\t\t" + STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno));
newCode.add("\t\t"
+ ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_CP_CLEAR));