#include "abc.h"
#include "registry.h"
#include "common.h"
-#include "common.h"
#include "tokenizer.h"
+#include "assets.h"
#include "../os.h"
-static void import_code(void*_abc, char*filename, int pass);
+static void import_code(void*_abc, char*filename, int pass, asset_bundle_t*a);
void as3_import_abc(char*filename)
{
tag->data = file->data;
tag->len = file->len;
abc_file_t*abc = swf_ReadABC(tag);
- import_code(abc, filename, 0);
- import_code(abc, filename, 1);
+ import_code(abc, filename, 0, 0);
+ import_code(abc, filename, 1, 0);
swf_FreeABC(abc);
memfile_close(file);
free(tag);
SWF* swf = swf_OpenSWF(filename);
if(!swf)
return;
+ swf_FoldAll(swf);
+
TAG*tag = swf->firstTag;
+ asset_resolver_t* assets = swf_ParseAssets(swf);
+
/* pass 1 */
while(tag) {
if(tag->id == ST_DOABC || tag->id == ST_RAWABC) {
abc_file_t*abc = swf_ReadABC(tag);
- import_code(abc, filename, 0);
+ import_code(abc, filename, 0, 0);
swf_FreeABC(abc);
}
tag = tag->next;
/* pass 2 */
while(tag) {
if(tag->id == ST_DOABC || tag->id == ST_RAWABC) {
- abc_file_t*abc = swf_ReadABC(tag);
- import_code(abc, filename, 1);
- swf_FreeABC(abc);
+ abc_file_t*abc = swf_ReadABC(tag); //FIXME: mem leak
+ swf_ResolveAssets(assets, abc);
+ NEW(asset_bundle_t, a);
+ a->file = abc;
+ registry_add_asset(a);
+ import_code(abc, filename, 1, a);
}
tag = tag->next;
}
- swf_FreeTags(swf);
+ //swf_FreeTags(swf); // FIXME: mem leak
free(swf);
+
}
void as3_import_file(char*filename)
static classinfo_t*resolve_class(char*filename, char*what, multiname_t*n)
{
if(!n) return 0;
- if(!n->name[0] || !strcmp(n->name, "void")) return 0;
+ if(!n->name[0]) return 0;
+ if(!strcmp(n->name, "void"))
+ return &voidclass;
classinfo_t*c = 0;
if(n->ns && n->ns->name) {
return c;
}
-static void import_code(void*_abc, char*filename, int pass)
+static void import_code(void*_abc, char*filename, int pass, asset_bundle_t*asset_bundle)
{
abc_file_t*abc = _abc;
int t;
const char*package = strdup(cls->classname->ns->name);
const char*name = strdup(cls->classname->name);
-
+
multiname_list_t*i=cls->interfaces;
classinfo_t*c = classinfo_register(access, package, name, list_length(i));
- c->flags|=FLAG_BUILTIN;
+ c->flags|=FLAG_ASSET;
if(cls->flags & CLASS_FINAL)
c->flags |= FLAG_FINAL;
classinfo_t*c = (classinfo_t*)registry_find(package, name);
if(!c) continue;
+ if(cls->asset) {
+ c->assets = asset_bundle;
+ }
+
int nr = 0;
multiname_list_t*i = cls->interfaces;
while(i) {
trait_list_t*l=0;
char is_static = 0;
l = cls->traits;
+ if(!l) {
+ l = cls->static_traits;
+ is_static = 1;
+ }
+ dict_t*names = dict_new();
while(l) {
trait_t*trait = l->trait;
U8 access = trait->name->ns->access;
+
if(access==ACCESS_PRIVATE)
goto cont;
const char*name = trait->name->name;
- char* ns= ACCESS_NAMESPACE?strdup(trait->name->ns->name):"";
- if(registry_findmember(c, ns, name, 0))
+ char* ns = access==ACCESS_NAMESPACE?strdup(trait->name->ns->name):"";
+
+ if(registry_findmember(c, ns, name, 0, is_static))
goto cont;
+
name = strdup(name);
memberinfo_t*s = 0;
if(trait->kind == TRAIT_METHOD) {
- s = (memberinfo_t*)methodinfo_register_onclass(c, access, ns, name);
+ s = (memberinfo_t*)methodinfo_register_onclass(c, access, ns, name, is_static);
s->return_type = resolve_class(filename, "return type", trait->method->return_type);
- } else if(trait->kind == TRAIT_SLOT ||
- trait->kind == TRAIT_GETTER) {
- s = (memberinfo_t*)varinfo_register_onclass(c, access, ns, name);
+ dict_put(names, name, 0);
+ } else if(trait->kind == TRAIT_SLOT) {
+ s = (memberinfo_t*)varinfo_register_onclass(c, access, ns, name, is_static);
s->type = resolve_class(filename, "type", trait->type_name);
+ dict_put(names, name, 0);
+ } else if(trait->kind == TRAIT_GETTER) {
+ s = (memberinfo_t*)varinfo_register_onclass(c, access, ns, name, is_static);
+ s->type = resolve_class(filename, "type", trait->method->return_type);
+ dict_put(names, name, 0);
+ } else if(trait->kind == TRAIT_CONST) {
+ /* some variables (e.g. XML.length) are apparently both a method and a slot.
+ needs split of static/non-static first */
+ if(!dict_contains(names, name)) {
+ varinfo_t*v = (varinfo_t*)varinfo_register_onclass(c, access, ns, name, is_static);
+ v->type = resolve_class(filename, "type", trait->type_name);
+ v->flags |= FLAG_CONST;
+ /* leave this alone for now- it blows up the file too much
+ v->value = constant_clone(trait->value);*/
+ s = (memberinfo_t*)v;
+ dict_put(names, name, 0);
+ } else
+ goto cont;
+
} else {
goto cont;
}
is_static = 1;
}
}
+ dict_destroy(names);
}
# define IS_PUBLIC_MEMBER(trait) ((trait)->kind != TRAIT_CLASS && (trait)->name->ns->access != ACCESS_PRIVATE)
varinfo_t*v = varinfo_register_global(access, package, name);
v->type = resolve_class(filename, "type", trait->type_name);
v->value = constant_clone(trait->value);
+ v->flags |= trait->kind==TRAIT_CONST?FLAG_CONST:0;
m = (memberinfo_t*)v;
}
- m->flags |= FLAG_BUILTIN;
+ m->flags |= FLAG_ASSET;
m->parent = 0;
}
}
void as3_import_code(void*_abc)
{
- import_code(_abc, "", 0);
- import_code(_abc, "", 1);
+ import_code(_abc, "", 0, 0);
+ import_code(_abc, "", 1, 0);
}