X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=lib%2Fas3%2Fabc.c;h=5c9b87b51d95a3880cf95ec70871ae21d4088d60;hb=70080bc309ba2a414647d27e2f413f22bc7823e4;hp=f1243d9c22ca7886678eddfb0289b6425c433ff6;hpb=398fa92330471e3e133c504b20b6197504fc45ce;p=swftools.git diff --git a/lib/as3/abc.c b/lib/as3/abc.c index f1243d9..5c9b87b 100644 --- a/lib/as3/abc.c +++ b/lib/as3/abc.c @@ -129,19 +129,14 @@ abc_file_t*abc_file_new() return f; } -#define CLASS_SEALED 1 -#define CLASS_FINAL 2 -#define CLASS_INTERFACE 4 -#define CLASS_PROTECTED_NS 8 - abc_class_t* abc_class_new(abc_file_t*file, multiname_t*classname, multiname_t*superclass) { NEW(abc_class_t,c); array_append(file->classes, NO_KEY, c); c->file = file; - c->classname = classname; - c->superclass = superclass; + c->classname = multiname_clone(classname); + c->superclass = multiname_clone(superclass); c->flags = 0; c->constructor = 0; c->static_constructor = 0; @@ -172,7 +167,7 @@ void abc_class_protectedNS(abc_class_t*c, char*namespace) } void abc_class_add_interface(abc_class_t*c, multiname_t*interface) { - list_append(c->interfaces, interface); + list_append(c->interfaces, multiname_clone(interface)); } abc_method_body_t* add_method(abc_file_t*file, abc_class_t*cls, multiname_t*returntype, int num_params, va_list va) @@ -269,14 +264,15 @@ abc_method_body_t* abc_class_method(abc_class_t*cls, multiname_t*returntype, cha return c; } -void abc_AddSlot(abc_class_t*cls, char*name, int slot, char*type) +trait_t* abc_class_slot(abc_class_t*cls, char*name, multiname_t*type) { abc_file_t*file = cls->file; multiname_t*m_name = multiname_fromstring(name); - multiname_t*m_type = multiname_fromstring(type); + multiname_t*m_type = type; trait_t*t = trait_new_member(m_type, m_name, 0); t->slot_id = list_length(cls->traits); list_append(cls->traits, t); + return t; } void abc_method_body_addClassTrait(abc_method_body_t*code, char*multiname, int slotid, abc_class_t*cls) @@ -689,7 +685,7 @@ void* swf_ReadABC(TAG*tag) m->flags = swf_GetU8(tag); - DEBUG printf("method %d) %s flags=%02x\n", t, params_tostring(m->parameters), m->flags); + DEBUG printf("method %d) %s %s flags=%02x\n", t, m->name, params_tostring(m->parameters), m->flags); if(m->flags&0x08) { /* TODO optional parameters */ @@ -724,13 +720,13 @@ void* swf_ReadABC(TAG*tag) abc_class_t*cls = malloc(sizeof(abc_class_t)); memset(cls, 0, sizeof(abc_class_t)); - DEBUG printf("class %d\n", t); swf_GetU30(tag); //classname swf_GetU30(tag); //supername array_append(file->classes, NO_KEY, cls); cls->flags = swf_GetU8(tag); + DEBUG printf("class %d %02x\n", t, cls->flags); if(cls->flags&8) swf_GetU30(tag); //protectedNS int s; @@ -743,12 +739,14 @@ void* swf_ReadABC(TAG*tag) DEBUG printf(" class %d interface: %s\n", t, m->name); } - swf_GetU30(tag); //iinit + int iinit = swf_GetU30(tag); //iinit + DEBUG printf("--iinit-->%d\n", iinit); traits_skip(tag); } for(t=0;tclasses, t); int cinit = swf_GetU30(tag); + DEBUG printf("--cinit(%d)-->%d\n", t, cinit); cls->static_constructor = (abc_method_t*)array_getvalue(file->methods, cinit); traits_skip(tag); } @@ -805,7 +803,7 @@ void* swf_ReadABC(TAG*tag) 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); + DEBUG printf("method_body %d) (method %d), %d bytes of code\n", t, methodnr, code_length); array_append(file->method_bodies, NO_KEY, c); } @@ -832,7 +830,7 @@ void* swf_ReadABC(TAG*tag) int num_interfaces = swf_GetU30(tag); //interface count int s; for(s=0;sconstructor = (abc_method_t*)array_getvalue(file->methods, iinit); @@ -868,15 +866,21 @@ void swf_WriteABC(TAG*abctag, void*code) TAG*tmp = swf_InsertTag(0,0); TAG*tag = tmp; int t; - + + /* add method bodies where needed */ for(t=0;tclasses->num;t++) { abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); if(!c->constructor) { - NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); - NEW(abc_method_body_t,body);array_append(file->method_bodies, NO_KEY, body); - body->method = m; m->body = body; - __ returnvoid(body); - c->constructor = m; + if(!(c->flags&CLASS_INTERFACE)) { + NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); + NEW(abc_method_body_t,body);array_append(file->method_bodies, NO_KEY, body); + body->method = m; m->body = body; + __ returnvoid(body); + c->constructor = m; + } else { + NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); + c->constructor = m; + } } if(!c->static_constructor) { NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m); @@ -926,11 +930,11 @@ void swf_WriteABC(TAG*abctag, void*code) for(t=0;tclasses->num;t++) { abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t); trait_list_t*traits = c->traits; - if(c->constructor && + if(c->constructor && c->constructor->body && c->constructor->body->init_scope_depth < c->init_scope_depth) { c->constructor->body->init_scope_depth = c->init_scope_depth; } - if(c->static_constructor && + if(c->static_constructor && c->static_constructor->body && c->static_constructor->body->init_scope_depth < c->init_scope_depth) { c->static_constructor->body->init_scope_depth = c->init_scope_depth; } @@ -1298,6 +1302,10 @@ void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events) __ debugline(f, 1); __ getlocal_0(f); __ pushscope(f); + if(stop_each_frame) { + __ findpropstrict(f, "[package]::stop"); + __ callpropvoid(f, "[package]::stop", 0); + } } if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) { @@ -1310,10 +1318,6 @@ void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events) __ getlex(f,functionname); __ callpropvoid(f, "::addEventListener" ,2); - if(stop_each_frame) { - __ findpropstrict(f, "[package]::stop"); - __ callpropvoid(f, "[package]::stop", 0); - } needs_framescript = 1; abc_method_body_t*h = @@ -1391,7 +1395,8 @@ void swf_AddButtonLinks(SWF*swf, char stop_each_frame, char events) if(tag->id == ST_DEFINEBUTTON || tag->id == ST_DEFINEBUTTON2) { char buttonname[80]; sprintf(buttonname, "::button%d", swf_GetDefineID(tag)); - abc_AddSlot(cls, buttonname, 0, "flash.display::SimpleButton"); + multiname_t*s = multiname_fromstring(buttonname); + abc_class_slot(cls, buttonname, s); } tag = tag->next; }