return_type = strdup("void");
fprintf(fo, "%s", prefix);
- fprintf(fo, "%s %s", attr, type);
+ fprintf(fo, "%s %s ", attr, type);
fprintf(fo, "%s %s=%s", return_type, name, m->name);
params_dump(fo, m->parameters, m->optional_parameters);
fprintf(fo, "(%d params, %d optional)\n", list_length(m->parameters), list_length(m->optional_parameters));
}
pool_read(pool, tag);
- //pool_dump(pool, stdout);
int num_methods = swf_GetU30(tag);
DEBUG printf("%d methods\n", num_methods);
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);
}
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;
}
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;
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++) {
ActionTAG*oldaction = swf_ButtonGetAction(tag);
if(oldaction && oldaction->op == ACTION__GOTOFRAME) {
int framenr = GET16(oldaction->data);
- if(framenr>254) {
- fprintf(stderr, "Warning: Couldn't translate jump to frame %d to flash 9 actionscript\n", framenr);
- }
if(!events) {
__ findpropstrict(h,"[package]::gotoAndStop");
- __ pushbyte(h,framenr+1);
+ __ pushuint(h,framenr+1);
__ callpropvoid(h,"[package]::gotoAndStop", 1);
} else {
char framename[80];