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
aef16ed
..
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,8
+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 */
-{0xfe, "__continue__", "s", 0, 0, 0, OP_RETURN},
-{0xff, "__break__", "s", 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};
@@
-459,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);
@@
-901,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);
@@
-1143,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;