X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;ds=inline;f=lib%2Fas3%2Fabc.c;h=d545a98122f0f7db2bb07857cf23dde599d6bc37;hb=95706ae1c7ff59b6396c54da046b61eca7f3982f;hp=97b5884ab37dd7c36da6733869c93b79189ba156;hpb=2839fd9b16fe61e2bc4b93b5a034ef26776cd4fc;p=swftools.git diff --git a/lib/as3/abc.c b/lib/as3/abc.c index 97b5884..d545a98 100644 --- a/lib/as3/abc.c +++ b/lib/as3/abc.c @@ -322,14 +322,14 @@ static void dump_method(FILE*fo, const char*prefix, const char*type, const char* return; } - fprintf(fo, "%s[%d %d %d %d %d]\n", prefix, c->max_stack, c->local_count, c->init_scope_depth, c->max_scope_depth, c->exception_count); + fprintf(fo, "%s[%d %d %d %d %d]\n", prefix, c->max_stack, c->local_count, c->init_scope_depth, c->max_scope_depth, list_length(c->exceptions)); char prefix2[80]; sprintf(prefix2, "%s ", prefix); if(c->traits) dump_traits(fo, prefix, c->traits, file); fprintf(fo, "%s{\n", prefix); - code_dump(c->code, file, prefix2, fo); + code_dump(c->code, c->exceptions, file, prefix2, fo); fprintf(fo, "%s}\n\n", prefix); } @@ -634,8 +634,9 @@ void* swf_ReadABC(TAG*tag) int s; for(s=0;sparameters, param); } @@ -735,18 +736,27 @@ void* swf_ReadABC(TAG*tag) m->body = c; int pos = tag->pos + code_length; - c->code = code_parse(tag, code_length, file, pool); + codelookup_t*codelookup = 0; + c->code = code_parse(tag, code_length, file, pool, &codelookup); tag->pos = pos; int exception_count = swf_GetU30(tag); int s; + c->exceptions = list_new(); for(s=0;sfrom = code_atposition(codelookup, swf_GetU30(tag)); + e->to = code_atposition(codelookup, swf_GetU30(tag)); + e->target = code_atposition(codelookup, swf_GetU30(tag)); + + e->exc_type = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); + e->var_name = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); + //e->var_name = pool_lookup_string(pool, swf_GetU30(tag)); + //if(e->var_name) e->var_name = strdup(e->var_name); + list_append(c->exceptions, e); } + codelookup_free(codelookup); c->traits = traits_parse(tag, pool, file); DEBUG printf("method_body %d) (method %d), %d bytes of code", t, methodnr, code_length); @@ -808,24 +818,6 @@ void* swf_ReadABC(TAG*tag) return file; } -static void code_write(TAG*tag, abc_code_t*code, pool_t*pool, abc_file_t*file) -{ - int len = 0; - abc_code_t*c = code; - while(c) { - len += opcode_write(0, c, pool, file); - c = c->next; - } - swf_SetU30(tag, len); - int pos = tag->len; - c = code; - while(c) { - opcode_write(tag, c, pool, file); - c = c->next; - } - assert(tag->len - pos == len); -} - void swf_WriteABC(TAG*abctag, void*code) { abc_file_t*file = (abc_file_t*)code; @@ -966,7 +958,18 @@ void swf_WriteABC(TAG*abctag, void*code) code_write(tag, c->code, pool, file); - swf_SetU30(tag, c->exception_count); + swf_SetU30(tag, list_length(c->exceptions)); + exception_list_t*l = c->exceptions; + while(l) { + // warning: assumes "pos" in each code_t is up-to-date + swf_SetU30(tag, l->exception->from->pos); + swf_SetU30(tag, l->exception->to->pos); + swf_SetU30(tag, l->exception->target->pos); + swf_SetU30(tag, pool_register_multiname(pool, l->exception->exc_type)); + swf_SetU30(tag, pool_register_multiname(pool, l->exception->var_name)); + l = l->next; + } + traits_write(pool, tag, c->traits); } @@ -990,9 +993,8 @@ void swf_WriteABC(TAG*abctag, void*code) pool_destroy(pool); } -void swf_FreeABC(void*code) +void abc_file_free(abc_file_t*file) { - abc_file_t*file= (abc_file_t*)code; int t; for(t=0;tmetadata->num;t++) { @@ -1073,6 +1075,12 @@ void swf_FreeABC(void*code) free(file); } +void swf_FreeABC(void*code) +{ + abc_file_t*file= (abc_file_t*)code; + abc_file_free(file); +} + void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events) { int num_frames = 0;