small bugfixes
[swftools.git] / lib / as3 / abc.c
index e07a066..18be42b 100644 (file)
@@ -720,7 +720,8 @@ void* swf_ReadABC(TAG*tag)
     }
 
     pool_read(pool, tag);
-    //pool_dump(pool, stdout);
+    pool_dump(pool, stdout, 2);
+    printf("pool is %d bytes\n", tag->pos);
 
     int num_methods = swf_GetU30(tag);
     DEBUG printf("%d methods\n", num_methods);
@@ -737,7 +738,7 @@ void* swf_ReadABC(TAG*tag)
        for(s=0;s<param_count;s++) {
            int type_index = swf_GetU30(tag);
             
-            /* type_index might be 0, which probably means "..." (varargs) */
+            /* type_index might be 0 ("*") */
             multiname_t*param = type_index?multiname_clone(pool_lookup_multiname(pool, type_index)):0;
             list_append(m->parameters, param);
         }
@@ -876,7 +877,7 @@ void* swf_ReadABC(TAG*tag)
        array_append(file->method_bodies, NO_KEY, c);
     }
     if(tag->len - tag->pos) {
-       fprintf(stderr, "%d unparsed bytes remaining in ABC block\n", tag->len - tag->pos);
+       fprintf(stderr, "ERROR: %d unparsed bytes remaining in ABC block\n", tag->len - tag->pos);
        return 0;
     }
 
@@ -926,10 +927,11 @@ void* swf_ReadABC(TAG*tag)
     return file;
 }
 
-void swf_WriteABC(TAG*abctag, void*code)
+static pool_t*writeABC(TAG*abctag, void*code, pool_t*pool)
 {
     abc_file_t*file = (abc_file_t*)code;
-    pool_t*pool = pool_new();
+    if(!pool) 
+        pool = pool_new();
 
     TAG*tmp = swf_InsertTag(0,0);
     TAG*tag = tmp;
@@ -1188,11 +1190,22 @@ void swf_WriteABC(TAG*abctag, void*code)
     swf_SetBlock(tag, tmp->data, tmp->len);
 
     swf_DeleteTag(0, tmp);
+    return pool;
+}
+
+void swf_WriteABC(TAG*abctag, void*code)
+{
+    pool_t*pool = writeABC(abctag, code, 0);
+    pool_optimize(pool);
+    swf_ResetTag(abctag, abctag->id);
+    writeABC(abctag, code, pool);
     pool_destroy(pool);
 }
 
 void abc_file_free(abc_file_t*file)
 {
+    if(!file)
+        return;
     int t;
     if(file->metadata) {
         for(t=0;t<file->metadata->num;t++) {