X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Fcode.c;h=0b22b2856a0b1913d614f84dc6dc8e112be62626;hb=207d9e7c1d108915492ec59cfc3376b30e016b78;hp=51998978b871197699cc7d4c95dc7b05e84e2b6d;hpb=5dd20ed93c0693d4312e492f08dde5221f856ee1;p=swftools.git diff --git a/lib/as3/code.c b/lib/as3/code.c index 5199897..0b22b28 100644 --- a/lib/as3/code.c +++ b/lib/as3/code.c @@ -27,7 +27,7 @@ u = u30 r = register */ - + opcode_t opcodes[]={ {0xa0, "add", "", -2, 1, 0, 0}, {0xc5, "add_i", "", -2, 1, 0, 0}, @@ -130,7 +130,9 @@ 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}, @@ -384,7 +386,7 @@ void codelookup_free(codelookup_t*codelookup) code_t*code_find_start(code_t*c) { - while(c->prev) + while(c && c->prev) c=c->prev; return c; } @@ -590,7 +592,7 @@ static void dumpstack(currentstats_t*stats) printf(" 00000000\n"); } if(op->params[0]=='2') { - printf(" %s", multiname_to_string(c->data[0])); + printf(" %s", multiname_tostring(c->data[0])); } printf("\n"); } @@ -645,6 +647,17 @@ static char callcode(currentstats_t*stats, int pos, int stack, int scope) stats->flags |= FLAGS_SET_DXNS; if(op->flags & OP_NEED_ACTIVATION) stats->flags |= FLAGS_ACTIVATION; + + if(c->opcode == OP_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) { + 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; + } if(op->flags & OP_REGISTER) { char*p = op->params; @@ -744,7 +757,7 @@ static currentstats_t* code_get_stats(code_t*code, exception_list_t*exceptions) if(op->flags & (OP_JUMP|OP_BRANCH)) { printf("%5d) %s %08x\n", t, op->name, c->branch); } else if(op->params[0]=='2') { - printf("%5d) %s %s\n", t, op->name, multiname_to_string(c->data[0])); + printf("%5d) %s %s\n", t, op->name, multiname_tostring(c->data[0])); } else { printf("%5d) %s\n", t, op->name); } @@ -802,8 +815,8 @@ int code_dump(code_t*c, exception_list_t*exceptions, abc_file_t*file, char*prefi if(c==e->exception->from) fprintf(fo, "%s TRY {\n", prefix); if(c==e->exception->target) { - char*s1 = multiname_to_string(e->exception->exc_type); - char*s2 = multiname_to_string(e->exception->var_name); + char*s1 = multiname_tostring(e->exception->exc_type); + char*s2 = multiname_tostring(e->exception->var_name); fprintf(fo, "%s CATCH(%s %s)\n", prefix, s1, s2); free(s1); free(s2); @@ -838,7 +851,7 @@ int code_dump(code_t*c, exception_list_t*exceptions, abc_file_t*file, char*prefi fprintf(fo, "%d params", n); } else if(*p == '2') { multiname_t*n = (multiname_t*)data; - char* m = multiname_to_string(n); + char* m = multiname_tostring(n); fprintf(fo, "%s", m); free(m); } else if(*p == 'm') { @@ -846,7 +859,7 @@ int code_dump(code_t*c, exception_list_t*exceptions, abc_file_t*file, char*prefi fprintf(fo, "[method %s]", m->name); } else if(*p == 'c') { abc_class_t*cls = (abc_class_t*)data; - char*classname = multiname_to_string(cls->classname); + char*classname = multiname_tostring(cls->classname); fprintf(fo, "[classinfo %s]", classname); free(classname); } else if(*p == 'i') { @@ -945,6 +958,7 @@ code_t* add_opcode(code_t*atag, U8 op) tmp->next = 0; if(atag) { tmp->prev = atag; + tmp->next = atag->next; atag->next = tmp; } else { tmp->prev = 0; @@ -959,3 +973,23 @@ void codestats_print(codestats_t*stats) printf("scope_depth: %d\n", stats->max_scope_depth); } +code_t* code_append(code_t*code, code_t*toappend) +{ + if(!code) + return toappend; + if(!toappend) + return code; + //find end of first list + while(code->next) { + code = code->next; + } + code_t*start=toappend; + //and start of second list + while(start->prev) { + start = start->prev; + } + code->next = start; + start->prev = code; + return toappend; +} +