/* TODO: switch to a datastructure with just values */
#define NO_KEY ""
-static char* params_tostring(multiname_list_t*list)
+static void params_dump(FILE*fo, multiname_list_t*l, constant_list_t*o)
{
- multiname_list_t*l;
- int n = list_length(list);
- char**names = (char**)malloc(sizeof(char*)*n);
-
- l = list;
- n = 0;
- int size = 0;
- while(l) {
- names[n] = multiname_tostring(l->multiname);
- size += strlen(names[n]) + 2;
- n++;l=l->next;
- }
+ int n = list_length(l);
+ int no = list_length(o);
+ int i = 0;
- char* params = malloc(size+15);
- params[0]='(';
- params[1]=0;
- l = list;
- int s=0;
- n = 0;
+ fprintf(fo, "(");
while(l) {
- if(s)
- strcat(params, ", ");
- strcat(params, names[n]);
- free(names[n]);
- l = l->next;
- n++;
- s=1;
+ char*s = multiname_tostring(l->multiname);
+ fprintf(fo, s);
+ free(s);
+ if(i>=n-no) {
+ s = constant_tostring(o->constant);
+ fprintf(fo, " = ");
+ fprintf(fo, s);
+ free(s);
+ o = o->next;
+ }
+
+ if(l->next)
+ fprintf(fo, ", ");
+ l = l->next;i++;
}
- free(names);
- /*char num[20];
- sprintf(num, "[%d params]", n);
- strcat(params, num);*/
- strcat(params, ")");
- int t;
- return params;
+ fprintf(fo, ")");
}
//#define DEBUG
return slotid;
}
-abc_script_t* abc_initscript(abc_file_t*file, multiname_t*returntype)
+abc_script_t* abc_initscript(abc_file_t*file)
{
- abc_method_t*m = abc_method_new(file, returntype, 1);
+ abc_method_t*m = abc_method_new(file, 0, 1);
abc_script_t* s = malloc(sizeof(abc_script_t));
s->method = m;
s->traits = list_new();
return_type = multiname_tostring(m->return_type);
else
return_type = strdup("void");
- char*paramstr = params_tostring(m->parameters);
- fprintf(fo, "%s%s%s %s %s=%s %s (%d params, %d optional)\n", prefix, attr, type, return_type, name, m->name, paramstr,
- list_length(m->parameters),
- list_length(m->optional_parameters)
- );
- free(paramstr);paramstr=0;
+
+ fprintf(fo, "%s", prefix);
+ 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));
+
free(return_type);return_type=0;
abc_method_body_t*c = m->body;
if(c->traits)
traits_dump(fo, prefix, c->traits, file, methods_seen);
fprintf(fo, "%s{\n", prefix);
- code_dump(c->code, c->exceptions, file, prefix2, fo);
+ code_dump2(c->code, c->exceptions, file, prefix2, fo);
fprintf(fo, "%s}\n\n", prefix);
}
trait->cls = (abc_class_t*)array_getvalue(file->classes, swf_GetU30(tag));
DEBUG printf(" class %s %d %d\n", name, trait->slot_id, trait->cls);
} else if(kind == TRAIT_SLOT || kind == TRAIT_CONST) { // slot, const
- /* a slot is a variable in a class that is shared amonst all instances
- of the same type, but which has a unique location in each object
- (in other words, slots are non-static, traits are static)
- */
trait->slot_id = swf_GetU30(tag);
trait->type_name = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag)));
int vindex = swf_GetU30(tag);
int slot_id = trait->slot_id;
char*type_name = multiname_tostring(trait->type_name);
char*value = constant_tostring(trait->value);
- fprintf(fo, "%sslot %d: %s%s %s %s %s\n", prefix, trait->slot_id,
- kind==TRAIT_CONST?"const ":"", type_name, name,
- value?"=":"", 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:"");
if(value) free(value);
free(type_name);
} else {
void* swf_DumpABC(FILE*fo, void*code, char*prefix)
{
abc_file_t* file = (abc_file_t*)code;
-
+
if(file->name) {
fprintf(fo, "%s#\n", prefix);
fprintf(fo, "%s#name: %s\n", prefix, file->name);
fprintf(fo, "%s//internal (non-class non-script) methods:\n", prefix);
}
char name[18];
- sprintf(name, "%08x ", m);
+ sprintf(name, "%08x ", m->index);
dump_method(fo, prefix, "", "internalmethod", name, m, file, methods_seen);
}
}
}
pool_read(pool, tag);
+ //pool_dump(pool, stdout);
int num_methods = swf_GetU30(tag);
DEBUG printf("%d methods\n", num_methods);
m->flags = swf_GetU8(tag);
- DEBUG printf("method %d) %s %s flags=%02x\n", t, m->name, params_tostring(m->parameters), m->flags);
+ DEBUG printf("method %d) %s ", m->name);
+ DEBUG params_dump(stdout, m->parameters, m->optional_parameters);
+ DEBUG printf("flags=%02x\n", t, m->flags);
if(m->flags&0x08) {
m->optional_parameters = list_new();
U8 vkind = swf_GetU8(tag); // specifies index type for "val"
constant_t*c = constant_fromindex(pool, vindex, vkind);
list_append(m->optional_parameters, c);
+
}
}
if(m->flags&0x80) {
swf_SetU30(tag, list_length(m->optional_parameters));
constant_list_t*l = m->optional_parameters;
while(l) {
- swf_SetU30(tag, constant_get_index(pool, l->constant));
- swf_SetU8(tag, l->constant->type);
+ int i = constant_get_index(pool, l->constant);
+ swf_SetU30(tag, i);
+ if(!i) {
+ swf_SetU8(tag, CONSTANT_NULL);
+ } else {
+ swf_SetU8(tag, l->constant->type);
+ }
l = l->next;
}
}
//swf_SetU30(tag, c->old.max_scope_depth);
swf_SetU30(tag, c->stats->max_stack);
-
int param_num = list_length(c->method->parameters)+1;
if(c->method->flags&METHOD_NEED_REST)
param_num++;
char buttonname[80];
sprintf(buttonname, "::button%d", swf_GetDefineID(tag));
multiname_t*s = multiname_fromstring(buttonname);
- abc_class_slot(cls, multiname_fromstring(buttonname), s);
+ //abc_class_slot(cls, multiname_fromstring(buttonname), s);
+ abc_class_slot(cls, multiname_fromstring(buttonname),
+ multiname_fromstring("flash.display::SimpleButton"));
}
tag = tag->next;
}
- abc_script_t*s = abc_initscript(file, 0);
+ abc_script_t*s = abc_initscript(file);
c = s->method->body;
c->old.max_stack = 2;
c->old.local_count = 1;
swf_WriteABC(abctag, file);
}
+TAG*swf_AddAS3FontDefine(TAG*tag, U16 id, char*fontname)
+{
+ tag = swf_InsertTag(tag, ST_DOABC);
+ abc_file_t*file = abc_file_new();
+
+ //abc_class_t*cls = abc_class_new2(file, fontname, "flash.display::MovieClip");
+ //abc_class_slot(cls, multiname_fromstring(fontname), multiname_fromstring("flash.text::Font"));
+
+ abc_class_t*cls = abc_class_new2(file, fontname, "flash.text::Font");
+
+ abc_script_t*s = abc_initscript(file);
+ code_t*c = s->method->body->code;
+ c = abc_getlocal_0(c);
+ c = abc_pushscope(c);
+ c = abc_getscopeobject(c, 0);
+ c = abc_getlex(c,"flash.text::Font");
+ c = abc_pushscope(c);
+ c = abc_getlex(c,"flash.text::Font");
+ c = abc_newclass(c,cls);
+ c = abc_popscope(c);
+ c = abc_initproperty(c, fontname);
+ c = abc_returnvoid(c);
+ s->method->body->code = c;
+
+ abc_initscript_addClassTrait(s, multiname_fromstring(fontname), cls);
+ swf_WriteABC(tag, file);
+
+ tag = swf_InsertTag(tag, ST_SYMBOLCLASS);
+ swf_SetU16(tag, 1);
+ swf_SetU16(tag, id);
+ swf_SetString(tag, fontname);
+
+ return tag;
+}
+
+