write 2 functions for multiname ops
authorkramm <kramm>
Mon, 24 Nov 2008 16:14:45 +0000 (16:14 +0000)
committerkramm <kramm>
Mon, 24 Nov 2008 16:14:45 +0000 (16:14 +0000)
lib/as3/mkabc.py

index 6de1e7b..0a946d6 100644 (file)
@@ -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")