#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
//0x53: seen in builtin.abc
{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},
+/* dummy instructions. Warning: these are not actually supported by flash */
+{0xfd, "__fallthrough__", "s", 0, 0, 0, OP_INTERNAL},
+{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};
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);
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(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;