X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Fabc.c;h=a0994e990626507efa25c020e867bd88fbb64349;hb=015233e6dbf54b574dd7f55d11c0d0d614802fde;hp=43753000c42f973f92e8553656d6b3a763fb0765;hpb=3e3788c55ee5a26eb9973274c3c5ad9bb7495b4d;p=swftools.git diff --git a/lib/as3/abc.c b/lib/as3/abc.c index 4375300..a0994e9 100644 --- a/lib/as3/abc.c +++ b/lib/as3/abc.c @@ -157,10 +157,9 @@ void abc_class_add_interface(abc_class_t*c, multiname_t*interface) list_append(c->interfaces, multiname_clone(interface)); } -abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body) +void abc_method_init(abc_method_t*m, abc_file_t*file, multiname_t*returntype, char body) { /* construct method object */ - NEW(abc_method_t,m); m->index = array_length(file->methods); array_append(file->methods, NO_KEY, m); m->return_type = returntype; @@ -178,7 +177,11 @@ abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body) m->body = c; c->method = m; } - +} +abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body) +{ + NEW(abc_method_t,m); + abc_method_init(m, file, returntype, body); return m; } @@ -281,11 +284,11 @@ trait_t* abc_class_staticslot(abc_class_t*cls, multiname_t*name, multiname_t*typ } -trait_t* abc_class_find_slotid(abc_class_t*cls, int slotid) +trait_t* traits_find_slotid(trait_list_t*traits, int slotid) { trait_list_t*l; trait_t*t=0; - for(l=cls->traits;l;l=l->next) { + for(l=traits;l;l=l->next) { if(l->trait->slot_id==slotid) { t=l->trait; break; @@ -930,6 +933,8 @@ static pool_t*writeABC(TAG*abctag, void*code, pool_t*pool) abc_file_t*file = (abc_file_t*)code; if(!pool) pool = pool_new(); + if(!file) + file = abc_file_new(); TAG*tmp = swf_InsertTag(0,0); TAG*tag = tmp; @@ -944,6 +949,10 @@ static pool_t*writeABC(TAG*abctag, void*code, pool_t*pool) NEW(abc_method_body_t,body);array_append(file->method_bodies, NO_KEY, body); // don't bother to set m->index body->method = m; m->body = body; + if(c->superclass && c->superclass->name && strcmp(c->superclass->name,"Object")) { + __ getlocal_0(body); + __ constructsuper(body, 0); + } __ returnvoid(body); c->constructor = m; } else {