X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Fmkabc.py;h=029ebfc50485ec012e9cedb4e3b13dc91a36a59c;hb=62a83d162b254d91da418cee25f5b87b067a3f92;hp=6de1e7b78eb0e45ae68caeb9e59daaf46024cc12;hpb=5158486e21a043e8f4c5147cb5a7766a065aa518;p=swftools.git diff --git a/lib/as3/mkabc.py b/lib/as3/mkabc.py index 6de1e7b..029ebfc 100644 --- a/lib/as3/mkabc.py +++ b/lib/as3/mkabc.py @@ -1,4 +1,24 @@ #!/usr/bin/python +# +# mkops.py +# +# Generate opcodes.h, opcodes.h +# +# Copyright (c) 2008 Matthias Kramm +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ import re @@ -21,84 +41,122 @@ 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] - - 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"): - 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") - - foh.write("#define "+name+"(") - foh.write(",".join(["method"]+names)) - foh.write(") (method->code = abc_"+name+"(") - foh.write(",".join(["method->code"]+names)) - foh.write("))\n") + + iterations=1 + if "2" in params or "s" in params: + iterations=2 + + for iteration in range(iterations): + if iteration==1: + name=name+"2" + params = params.strip() + paramstr = "" + seen = {} + names = [] + + for c in params: + paramstr += ", " + if c == "2": + if iteration==0: + type,pname="char*","name" + else: + type,pname="multiname_t*","name" + elif c == "s": + if iteration==0: + type,pname="char*","name" + else: + type,pname="string_t*","s" + elif c == "N": + type,pname="namespace_t*","ns" + elif c in "nubs": + type,pname="int","v" + elif c == "m": + type,pname="abc_method_t*","m" + elif c == "i": + type,pname="abc_method_body_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("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 "N"): + foc.write(" self->data[%d] = namespace_clone(%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"): + if iteration==0: + foc.write(" self->data[%d] = string_new4(%s);\n" % (i,pname)) + else: + foc.write(" self->data[%d] = string_dup3(%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("#define OPCODE_"+name.upper()+" "+op+"\n") foh.write("#endif\n")