git.asbjorn.biz
/
swftools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dump out a method id for opcodes with a method index
[swftools.git]
/
lib
/
as3
/
code.c
diff --git
a/lib/as3/code.c
b/lib/as3/code.c
index
e92d6c9
..
9fce3a8
100644
(file)
--- a/
lib/as3/code.c
+++ b/
lib/as3/code.c
@@
-37,6
+37,7
@@
#define OP_LOOKUPSWITCH 512
#define OP_NEED_ACTIVATION 1024
#define OP_STACK_ARGS2 2048
#define OP_LOOKUPSWITCH 512
#define OP_NEED_ACTIVATION 1024
#define OP_STACK_ARGS2 2048
+#define OP_INTERNAL 32768
/* 2 = u30 index into multiname
m = u30 index into method
/* 2 = u30 index into multiname
m = u30 index into method
@@
-200,7
+201,8
@@
opcode_t opcodes[]={
{0x53, "applytype", "n", -1, 1, 0, OP_STACK_ARGS},
/* dummy instruction. Warning: this one is not actually supported by flash */
{0x53, "applytype", "n", -1, 1, 0, OP_STACK_ARGS},
/* dummy instruction. Warning: this one is not actually supported by flash */
-{0xff, "__break__", "", 0, 0, 0, OP_RETURN},
+{0xfe, "__continue__", "s", 0, 0, 0, OP_RETURN|OP_INTERNAL},
+{0xff, "__break__", "s", 0, 0, 0, OP_RETURN|OP_INTERNAL},
};
static U8 op2index[256] = {254};
};
static U8 op2index[256] = {254};
@@
-325,7
+327,8
@@
code_t*code_parse(TAG*tag, int len, abc_file_t*file, pool_t*pool, codelookup_t**
int j = swf_GetS24(tag);
data = (void*)(ptroff_t)j;
} else if(*p == 's') { // string
int j = swf_GetS24(tag);
data = (void*)(ptroff_t)j;
} else if(*p == 's') { // string
- data = strdup((char*)pool_lookup_string(pool, swf_GetU30(tag)));
+ string_t s = pool_lookup_string2(pool, swf_GetU30(tag));
+ data = string_dup3(&s);
} else if(*p == 'D') { // debug
/*type, usually 1*/
U8 type = swf_GetU8(tag);
} else if(*p == 'D') { // debug
/*type, usually 1*/
U8 type = swf_GetU8(tag);
@@
-457,6
+460,15
@@
static int opcode_write(TAG*tag, code_t*c, pool_t*pool, abc_file_t*file, int len
swf_SetU8(tag, c->opcode);
len++;
swf_SetU8(tag, c->opcode);
len++;
+ if(op->flags & OP_INTERNAL) {
+ if(c->opcode == OPCODE___BREAK__ ||
+ c->opcode == OPCODE___CONTINUE__) {
+ fprintf(stderr, "Unresolved %s\n", op->name);
+ } else {
+ fprintf(stderr, "Error: writing undefined internal opcode %s", op->name);
+ }
+ }
+
while(*p) {
void*data = c->data[pos++];
assert(pos<=2);
while(*p) {
void*data = c->data[pos++];
assert(pos<=2);
@@
-494,7
+506,7
@@
static int opcode_write(TAG*tag, code_t*c, pool_t*pool, abc_file_t*file, int len
skip = (c->branch->pos) - c->pos - 4;
len += swf_SetS24(tag, skip);
} else if(*p == 's') { // string
skip = (c->branch->pos) - c->pos - 4;
len += swf_SetS24(tag, skip);
} else if(*p == 's') { // string
- int index = pool_register_string(pool, data);
+ int index = pool_register_string2(pool, (string_t*)data);
len += swf_SetU30(tag, index);
} else if(*p == 'D') { // debug statement
if(tag)
len += swf_SetU30(tag, index);
} else if(*p == 'D') { // debug statement
if(tag)
@@
-899,7
+911,7
@@
int code_dump(code_t*c, abc_exception_list_t*exceptions, abc_file_t*file, char*p
free(m);
} else if(*p == 'm') {
abc_method_t*m = (abc_method_t*)data;
free(m);
} else if(*p == 'm') {
abc_method_t*m = (abc_method_t*)data;
- fprintf(fo, "[method %s]", m->name);
+ fprintf(fo, "[method %08x %s]", m, m->name);
} else if(*p == 'c') {
abc_class_t*cls = (abc_class_t*)data;
char*classname = multiname_tostring(cls->classname);
} else if(*p == 'c') {
abc_class_t*cls = (abc_class_t*)data;
char*classname = multiname_tostring(cls->classname);
@@
-926,7
+938,9
@@
int code_dump(code_t*c, abc_exception_list_t*exceptions, abc_file_t*file, char*p
else
fprintf(fo, "%08x", c->branch);
} else if(*p == 's') {
else
fprintf(fo, "%08x", c->branch);
} else if(*p == 's') {
- fprintf(fo, "\"%s\"", data);
+ char*s = string_escape((string_t*)data);
+ fprintf(fo, "\"%s\"", s);
+ free(s);
} else if(*p == 'D') {
fprintf(fo, "[register %02x=%s]", (ptroff_t)c->data[1], (char*)c->data[0]);
} else if(*p == 'S') {
} else if(*p == 'D') {
fprintf(fo, "[register %02x=%s]", (ptroff_t)c->data[1], (char*)c->data[0]);
} else if(*p == 'S') {
@@
-1074,7
+1088,9
@@
code_t*code_dup(code_t*c)
while(*p) {
if(*p == '2') { //multiname
c->data[pos] = multiname_clone(c->data[pos]);
while(*p) {
if(*p == '2') { //multiname
c->data[pos] = multiname_clone(c->data[pos]);
- } else if(*p == 's' || *p == 'D') {
+ } else if(*p == 's') {
+ c->data[pos] = string_dup3(c->data[pos]);
+ } else if(*p == 'D') {
c->data[pos] = strdup(c->data[pos]);
} else if(*p == 'f') {
double old = *(double*)c->data[pos];
c->data[pos] = strdup(c->data[pos]);
} else if(*p == 'f') {
double old = *(double*)c->data[pos];
@@
-1098,10
+1114,12
@@
code_t*code_dup(code_t*c)
code_t*code_cutlast(code_t*c)
{
code_t*code_cutlast(code_t*c)
{
+ if(!c) return c;
assert(!c->next);
code_t*prev = c->prev;
c->prev = 0;
assert(!c->next);
code_t*prev = c->prev;
c->prev = 0;
- prev->next=0;
+ if(prev)
+ prev->next=0;
code_free(c);
return prev;
}
code_free(c);
return prev;
}
@@
-1135,6
+1153,11
@@
code_t* cut_last_push(code_t*c)
} else if(c->opcode == OPCODE_CALLSUPER) {
c->opcode = OPCODE_CALLSUPERVOID;
return c;
} else if(c->opcode == OPCODE_CALLSUPER) {
c->opcode = OPCODE_CALLSUPERVOID;
return c;
+ } else if(c->opcode == OPCODE_NEWOBJECT ||
+ c->opcode == OPCODE_NEWARRAY) {
+ // we can discard these if they're not eating up stack parameters
+ if(!c->data[0])
+ return code_cutlast(c);
}
else
break;
}
else
break;