+ foh.write("code_t* abc_%s(code_t*prev%s);\n" % (name, paramstr))
+
+ foc.write("code_t* abc_%s(code_t*prev%s)\n" % (name, paramstr))
+ foc.write("{\n")
+ foc.write(" code_t*self = add_opcode(prev, %s);\n" % op)
+ i = 0
+ for pname,c in zip(names,params):
+ if(c == "2"):
+ if iteration==0:
+ foc.write(" self->data[%d] = multiname_fromstring(%s);\n" % (i,pname));
+ else:
+ foc.write(" self->data[%d] = multiname_clone(%s);\n" % (i,pname));
+ elif(c in "nur"):
+ foc.write(" self->data[%d] = (void*)(ptroff_t)%s;\n" % (i,pname))
+ elif(c in "IU"):
+ foc.write(" self->data[%d] = (void*)(ptroff_t)%s;\n" % (i,pname))
+ elif(c in "f"):
+ foc.write(" double*fp = malloc(sizeof(double));\n")
+ foc.write(" *fp = %s;\n" % (pname))
+ foc.write(" self->data[%d] = fp;\n" % (i))
+ elif(c == "b"):
+ foc.write(" self->data[%d] = (void*)(ptroff_t)%s;\n" % (i,pname))
+ elif(c == "s"):
+ foc.write(" self->data[%d] = strdup(%s);\n" % (i,pname))
+ elif(c == "m"):
+ foc.write(" self->data[%d] = %s;\n" % (i,pname))
+ elif(c == "c"):
+ foc.write(" self->data[%d] = %s;\n" % (i,pname))
+ elif(c == "i"):
+ foc.write(" self->data[%d] = %s;\n" % (i,pname))
+ elif(c == "j"):
+ foc.write(" self->data[%d] = 0; //placeholder\n" % i)
+ foc.write(" self->branch = %s;\n" % pname)
+ elif(c == "S"):
+ foc.write(" self->data[%d] = %s;\n" % (i,pname))
+ elif(c == "D"):
+ foc.write(" /* FIXME: write debuginfo %s */\n" % pname)
+ else:
+ raise "Unknown type "+c
+ i = i+1
+ foc.write(" return self;\n")
+ foc.write("}\n")
+
+ foh.write("#define "+name+"(")
+ foh.write(",".join(["method"]+names))
+ foh.write(") (method->code = abc_"+name+"(")
+ foh.write(",".join(["method->code"]+names))
+ foh.write("))\n")