git.asbjorn.biz
/
swftools.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
3168523
)
fixed swf_AddButtonLinks()
author
kramm
<kramm>
Sun, 23 Nov 2008 13:53:07 +0000
(13:53 +0000)
committer
kramm
<kramm>
Sun, 23 Nov 2008 13:53:07 +0000
(13:53 +0000)
lib/as3/abc.c
patch
|
blob
|
history
diff --git
a/lib/as3/abc.c
b/lib/as3/abc.c
index
c01ff61
..
cefbffa
100644
(file)
--- a/
lib/as3/abc.c
+++ b/
lib/as3/abc.c
@@
-218,6
+218,9
@@
opcode_t* opcode_get(U8 op)
return 0;
}
return 0;
}
+/* TODO: switch to a datastructure with just values */
+#define NO_KEY ""
+
abc_code_t*code_parse(TAG*tag, int len, abc_file_t*file, pool_t*pool)
{
abc_code_t*head=0;
abc_code_t*code_parse(TAG*tag, int len, abc_file_t*file, pool_t*pool)
{
abc_code_t*head=0;
@@
-547,9
+550,10
@@
abc_file_t*abc_file_new()
#define CLASS_PROTECTED_NS 8
abc_class_t* abc_class_new(abc_file_t*pool, multiname_t*classname, multiname_t*superclass) {
#define CLASS_PROTECTED_NS 8
abc_class_t* abc_class_new(abc_file_t*pool, multiname_t*classname, multiname_t*superclass) {
- abc_class_t* c = malloc(sizeof(abc_class_t));
- memset(c, 0, sizeof(abc_class_t));
- c->index = array_append(pool->classes, classname->name, c);
+
+ NEW(abc_class_t,c);
+ array_append(pool->classes, NO_KEY, c);
+
c->pool = pool;
c->classname = classname;
c->superclass = superclass;
c->pool = pool;
c->classname = classname;
c->superclass = superclass;
@@
-589,16
+593,16
@@
void abc_class_add_interface(abc_class_t*c, multiname_t*interface)
abc_method_body_t* add_method(abc_file_t*pool, abc_class_t*cls, char*returntype, int num_params, va_list va)
{
/* construct code (method body) object */
abc_method_body_t* add_method(abc_file_t*pool, abc_class_t*cls, char*returntype, int num_params, va_list va)
{
/* construct code (method body) object */
- abc_method_body_t* c = malloc(sizeof(abc_method_body_t));
- memset(c, 0, sizeof(abc_method_body_t));
- c->index = array_append(pool->method_bodies, 0, c);
+ NEW(abc_method_body_t,c);
+ array_append(pool->method_bodies, NO_KEY, c);
c->pool = pool;
c->traits = list_new();
c->code = 0;
/* construct method object */
NEW(abc_method_t,m);
c->pool = pool;
c->traits = list_new();
c->code = 0;
/* construct method object */
NEW(abc_method_t,m);
- m->index = array_append(pool->methods, 0, m);
+ array_append(pool->methods, NO_KEY, m);
+
if(returntype && strcmp(returntype, "void")) {
m->return_type = multiname_fromstring(returntype);
} else {
if(returntype && strcmp(returntype, "void")) {
m->return_type = multiname_fromstring(returntype);
} else {
@@
-650,6
+654,17
@@
trait_t*trait_new(int type, multiname_t*name, int data1, int data2, int vindex,
trait->vkind = vkind;
return trait;
}
trait->vkind = vkind;
return trait;
}
+trait_t*trait_new_method(multiname_t*name, abc_method_t*m)
+{
+ int type = TRAIT_METHOD;
+ trait_t*trait = malloc(sizeof(trait_t));
+ memset(trait, 0, sizeof(trait_t));
+ trait->kind = type&0x0f;
+ trait->attributes = type&0xf0;
+ trait->name = name;
+ trait->method = m;
+ return trait;
+}
abc_method_body_t* abc_class_method(abc_class_t*cls, char*returntype, char*name, int num_params, ...)
{
abc_method_body_t* abc_class_method(abc_class_t*cls, char*returntype, char*name, int num_params, ...)
{
@@
-658,7
+673,7
@@
abc_method_body_t* abc_class_method(abc_class_t*cls, char*returntype, char*name,
va_start(va, num_params);
abc_method_body_t* c = add_method(cls->pool, cls, returntype, num_params, va);
va_end(va);
va_start(va, num_params);
abc_method_body_t* c = add_method(cls->pool, cls, returntype, num_params, va);
va_end(va);
- list_append(cls->traits, trait_new(TRAIT_METHOD, multiname_fromstring(name), 0, c->method->index, 0, 0));
+ list_append(cls->traits, trait_new_method(multiname_fromstring(name), c->method));
return c;
}
return c;
}
@@
-698,7
+713,7
@@
abc_script_t* abc_initscript(abc_file_t*pool, char*returntype, int num_params, .
s->method = c->method;
s->traits = list_new();
s->pool = pool;
s->method = c->method;
s->traits = list_new();
s->pool = pool;
- array_append(pool->scripts, 0, s);
+ array_append(pool->scripts, NO_KEY, s);
va_end(va);
return s;
}
va_end(va);
return s;
}
@@
-707,7
+722,7
@@
static void dump_traits(FILE*fo, const char*prefix, trait_list_t*traits, abc_fil
static void dump_method(FILE*fo, const char*prefix, const char*type, const char*name, abc_method_t*m, abc_file_t*file)
{
static void dump_method(FILE*fo, const char*prefix, const char*type, const char*name, abc_method_t*m, abc_file_t*file)
{
- const char*return_type = "";
+ const char*return_type = "void";
if(m->return_type)
return_type = multiname_to_string(m->return_type);
if(m->return_type)
return_type = multiname_to_string(m->return_type);
@@
-1024,7
+1039,10
@@
void* swf_ReadABC(TAG*tag)
NEW(abc_method_t,m);
int param_count = swf_GetU30(tag);
int return_type_index = swf_GetU30(tag);
NEW(abc_method_t,m);
int param_count = swf_GetU30(tag);
int return_type_index = swf_GetU30(tag);
- m->return_type = multiname_clone(pool_lookup_multiname(pool, return_type_index));
+ if(return_type_index)
+ m->return_type = multiname_clone(pool_lookup_multiname(pool, return_type_index));
+ else
+ m->return_type = 0;
int s;
for(s=0;s<param_count;s++) {
int s;
for(s=0;s<param_count;s++) {
@@
-1061,7
+1079,7
@@
void* swf_ReadABC(TAG*tag)
l = l->next;
}
}
l = l->next;
}
}
- array_append(file->methods, m->name, m);
+ array_append(file->methods, NO_KEY, m);
}
parse_metadata(tag, file, pool);
}
parse_metadata(tag, file, pool);
@@
-1075,12
+1093,11
@@
void* swf_ReadABC(TAG*tag)
memset(cls, 0, sizeof(abc_class_t));
DEBUG printf("class %d\n", t);
memset(cls, 0, sizeof(abc_class_t));
DEBUG printf("class %d\n", t);
- int name_index = swf_GetU30(tag); //classname
- char*name = pool_lookup_string(pool, name_index);
-
- array_append(file->classes, name, cls);
-
+ swf_GetU30(tag); //classname
swf_GetU30(tag); //supername
swf_GetU30(tag); //supername
+
+ array_append(file->classes, NO_KEY, cls);
+
cls->flags = swf_GetU8(tag);
if(cls->flags&8)
swf_GetU30(tag); //protectedNS
cls->flags = swf_GetU8(tag);
if(cls->flags&8)
swf_GetU30(tag); //protectedNS
@@
-1147,7
+1164,7
@@
void* swf_ReadABC(TAG*tag)
DEBUG printf("method_body %d) (method %d), %d bytes of code", t, methodnr, code_length);
DEBUG printf("method_body %d) (method %d), %d bytes of code", t, methodnr, code_length);
- array_append(file->method_bodies, m->name, c);
+ 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);
}
if(tag->len - tag->pos) {
fprintf(stderr, "%d unparsed bytes remaining in ABC block\n", tag->len - tag->pos);
@@
-1193,7
+1210,7
@@
void* swf_ReadABC(TAG*tag)
memset(s, 0, sizeof(abc_script_t));
s->method = m;
s->traits = traits_parse(tag, pool, file);
memset(s, 0, sizeof(abc_script_t));
s->method = m;
s->traits = traits_parse(tag, pool, file);
- array_append(file->scripts, "script", s);
+ array_append(file->scripts, NO_KEY, s);
if(!s->traits) {
fprintf(stderr, "Can't parse script traits\n");
return 0;
if(!s->traits) {
fprintf(stderr, "Can't parse script traits\n");
return 0;