as3: improved protected handling, xml support. added 'arguments' keyword
[swftools.git] / lib / as3 / abc.c
index 60ad6e7..59aa880 100644 (file)
@@ -119,7 +119,8 @@ abc_file_t*abc_file_new()
 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);
+    if(file)
+        array_append(file->classes, NO_KEY, c);
 
     c->file = file;
     c->classname = multiname_clone(classname);
@@ -284,11 +285,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;
@@ -308,7 +309,7 @@ void abc_method_body_addClassTrait(abc_method_body_t*code, char*multiname, int s
 
 /* notice: traits of a method (body) belonging to an init script
    and traits of the init script are *not* the same thing */
-int abc_initscript_addClassTrait(abc_script_t*script, multiname_t*multiname, abc_class_t*cls)
+trait_t* abc_initscript_addClassTrait(abc_script_t*script, multiname_t*multiname, abc_class_t*cls)
 {
     abc_file_t*file = script->file;
     multiname_t*m = multiname_clone(multiname);
@@ -316,7 +317,7 @@ int abc_initscript_addClassTrait(abc_script_t*script, multiname_t*multiname, abc
     trait_t*trait = trait_new(TRAIT_CLASS, m, slotid, 0, 0);
     trait->cls = cls;
     list_append(script->traits, trait);
-    return slotid;
+    return trait;
 }
 
 abc_script_t* abc_initscript(abc_file_t*file)
@@ -345,7 +346,7 @@ static void dump_method(FILE*fo, const char*prefix,
     if(m->return_type)
         return_type = multiname_tostring(m->return_type);
     else
-        return_type = strdup("void");
+        return_type = strdup("*");
 
     fprintf(fo, "%s", prefix);
     fprintf(fo, "%s %s ", attr, type);
@@ -591,7 +592,7 @@ static void traits_dump(FILE*fo, const char*prefix, trait_list_t*traits, abc_fil
             char*value = constant_tostring(trait->value);
            fprintf(fo, "%sslot %d: %s %s:%s %s %s\n", prefix, trait->slot_id, 
                     kind==TRAIT_CONST?"const":"var", name, type_name, 
-                    value?"=":"", value?value:"");
+                    trait->value?"=":"", trait->value?value:"");
             if(value) free(value);
             free(type_name);
        } else {
@@ -647,6 +648,8 @@ void* swf_DumpABC(FILE*fo, void*code, char*prefix)
             char*supername = multiname_tostring(cls->superclass);
             fprintf(fo, " extends %s", supername);
             free(supername);
+        }
+        if(cls->interfaces) {
             multiname_list_t*ilist = cls->interfaces;
             if(ilist)
                 fprintf(fo, " implements");
@@ -949,7 +952,11 @@ 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;
-                __ returnvoid(body);
+               if(c->superclass && c->superclass->name && strcmp(c->superclass->name,"Object")) {
+                   body->code = abc_getlocal_0(body->code);
+                   body->code = abc_constructsuper(body->code, 0);
+               }
+                body->code = abc_returnvoid(body->code);
                 c->constructor = m;
             } else {
                 NEW(abc_method_t,m);array_append(file->methods, NO_KEY, m);
@@ -960,7 +967,7 @@ static pool_t*writeABC(TAG*abctag, void*code, pool_t*pool)
             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);
+            body->code = abc_returnvoid(0);
             c->static_constructor = m;
         }
     }
@@ -1124,6 +1131,9 @@ static pool_t*writeABC(TAG*abctag, void*code, pool_t*pool)
     swf_SetU30(tag, file->scripts->num);
     for(t=0;t<file->scripts->num;t++) {
        abc_script_t*s = (abc_script_t*)array_getvalue(file->scripts, t);
+        if(!s->method->body || !s->method->body->code) {
+            fprintf(stderr, "Internal Error: initscript has no body\n");
+        }
        swf_SetU30(tag, s->method->index); //!=t!
        traits_write(pool, tag, s->traits);
     }