From: kramm Date: Mon, 24 Nov 2008 16:14:45 +0000 (+0000) Subject: write 2 functions for multiname ops X-Git-Tag: release-0-9-0~760 X-Git-Url: http://git.asbjorn.it/?a=commitdiff_plain;h=fee0a4873844d57b2889e24330c3b2afc425c503;p=swftools.git write 2 functions for multiname ops --- diff --git a/lib/as3/mkabc.py b/lib/as3/mkabc.py index 6de1e7b..0a946d6 100644 --- a/lib/as3/mkabc.py +++ b/lib/as3/mkabc.py @@ -21,84 +21,110 @@ for line in fi.readlines(): m = R.match(line) if m: op,name,params = m.group(1),m.group(2),m.group(3) - params = params.strip() - paramstr = "" - seen = {} - names = [] - for c in params: - paramstr += ", " - if c == "2": - type,pname="char*","name" - elif c == "s": - type,pname="char*","s" - elif c in "nubs": - type,pname="int","v" - elif c == "m": - type,pname="abc_method_body_t*","m" - elif c == "i": - type,pname="abc_method_t*","m" - elif c == "c": - type,pname="abc_class_t*","m" - elif c == "j": - type,pname="code_t*","label" - elif c == "S": - type,pname="lookupswitch_t*","l" - elif c == "D": - type,pname="void*","debuginfo" - elif c == "r": - type,pname="int","reg" - else: - raise "Unknown type "+c - paramstr += type - paramstr += " " - if pname in seen: - seen[pname]+=1 - pname += str(seen[pname]) - else: - seen[pname]=1 - paramstr += pname - names += [pname] + iterations=1 + if "2" in params: + iterations=2 - foh.write("code_t* abc_%s(code_t*prev%s);\n" % (name, paramstr)) + for iteration in range(iterations): + if iteration==1: + name=name+"2" + params = params.strip() + paramstr = "" + seen = {} + names = [] - 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"): - foc.write(" self->data[%d] = multiname_fromstring(%s); // FIXME\n" % (i,pname)); - elif(c in "nur"): - foc.write(" self->data[%d] = (void*)(ptroff_t)%s;\n" % (i,pname)) - 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") + for c in params: + paramstr += ", " + if c == "2": + if iteration==0: + type,pname="char*","name" + else: + type,pname="multiname_t*","name" + elif c == "s": + type,pname="char*","s" + elif c in "nubs": + type,pname="int","v" + elif c == "m": + type,pname="abc_method_body_t*","m" + elif c == "i": + type,pname="abc_method_t*","m" + elif c == "c": + type,pname="abc_class_t*","m" + elif c == "j": + type,pname="code_t*","label" + elif c == "S": + type,pname="lookupswitch_t*","l" + elif c == "D": + type,pname="void*","debuginfo" + elif c == "r": + type,pname="int","reg" + elif c == "f": + type,pname="double","f" + elif c == "I": + type,pname="int","i" + elif c == "U": + type,pname="unsigned int","u" + else: + raise "Unknown type "+c + paramstr += type + paramstr += " " + if pname in seen: + seen[pname]+=1 + pname += str(seen[pname]) + else: + seen[pname]=1 + paramstr += pname + names += [pname] - foh.write("#define "+name+"(") - foh.write(",".join(["method"]+names)) - foh.write(") (method->code = abc_"+name+"(") - foh.write(",".join(["method->code"]+names)) - foh.write("))\n") + 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") foh.write("#endif\n")