new function code_dup
[swftools.git] / lib / as3 / code.c
index d8fc1b3..62dd2a1 100644 (file)
@@ -152,9 +152,7 @@ opcode_t opcodes[]={
 {0x57, "newactivation", "",     0, 1, 0, OP_NEED_ACTIVATION},
 {0x56, "newarray", "n",         0, 1, 0, OP_STACK_ARGS},
 {0x5a, "newcatch", "u",         0, 1, 0, 0}, //u = index into exception_info
-#define OP_NEWCLASS 0x58
 {0x58, "newclass", "c",        -1, 1, 0, 0}, //c = index into class_info
-#define OP_NEWFUNCTION 0x40
 {0x40, "newfunction", "m",      0, 1, 0, 0}, //i = index into method_info
 {0x55, "newobject", "n",        0, 1, 0, OP_STACK_ARGS2},
 {0x1e, "nextname", "",         -2, 1, 0, 0},
@@ -198,9 +196,8 @@ opcode_t opcodes[]={
 {0xa7, "urshift", "",          -2, 1, 0, 0},
 
 /* opcodes not documented, but seen in the wild */
-//0x53: seen in builtin.abc- followed by 0x01 (might be the number of stack params)
-{0x53, "xxx1", "",             -1, 0, 0, 0},
-{0x01, "xxx2", "",              0, 0, 0, 0},
+//0x53: seen in builtin.abc
+{0x53, "applytype", "n",       -1, 1, 0, OP_STACK_ARGS},
 
 /* dummy instruction. Warning: this one is not actually supported by flash */
 {0xff, "__break__", "",             0, 0, 0, OP_RETURN},
@@ -684,12 +681,12 @@ static char callcode(currentstats_t*stats, int pos, int stack, int scope)
         if(op->flags & OP_NEED_ACTIVATION)
             stats->flags |= FLAGS_ACTIVATION;
 
-        if(c->opcode == OP_NEWCLASS) {
+        if(c->opcode == OPCODE_NEWCLASS) {
             abc_class_t*cls = (abc_class_t*)(c->data[0]);
             if(scope > cls->init_scope_depth)
                 cls->init_scope_depth = scope;
         }
-        if(c->opcode == OP_NEWFUNCTION) {
+        if(c->opcode == OPCODE_NEWFUNCTION) {
             abc_method_t*m = (abc_method_t*)(c->data[0]);
             if(m->body && scope > m->body->init_scope_depth)
                 m->body->init_scope_depth = scope;
@@ -1048,3 +1045,33 @@ code_t* code_append(code_t*code, code_t*toappend)
     return code_end(toappend);
 }
 
+code_t*code_dup(code_t*c)
+{
+    if(!c) return 0;
+
+    while(c->prev) c = c->prev;
+
+    code_t*last = 0;
+    while(c) {
+        NEW(code_t, n);
+        memcpy(n, c, sizeof(code_t));
+        n->prev = last;
+        if(last) {
+            last->next = n;
+        }
+        last = n;
+        c = c->next;
+    }
+    return last;
+}
+
+code_t*code_cutlast(code_t*c)
+{
+    assert(!c->next);
+    code_t*prev = c->prev;
+    c->prev = 0;
+    prev->next=0;
+    code_free(c);
+    return prev;
+}
+