{0x57, "newactivation", "", 0, 1, 0, OP_NEED_ACTIVATION},
{0x56, "newarray", "n", 0, 1, 0, OP_STACK_ARGS},
{0x5a, "newcatch", "u", 0, 1, 0, 0}, //u = index into exception_info
-#define OP_NEWCLASS 0x58
{0x58, "newclass", "c", -1, 1, 0, 0}, //c = index into class_info
-#define OP_NEWFUNCTION 0x40
{0x40, "newfunction", "m", 0, 1, 0, 0}, //i = index into method_info
{0x55, "newobject", "n", 0, 1, 0, OP_STACK_ARGS2},
{0x1e, "nextname", "", -2, 1, 0, 0},
{0x95, "typeof", "", -1, 1, 0, 0},
{0xa7, "urshift", "", -2, 1, 0, 0},
-/* dummy instruction. Warning: this one are not actually supported by flash */
+/* opcodes not documented, but seen in the wild */
+//0x53: seen in builtin.abc- followed by 0x01 (might be the number of stack params)
+{0x53, "xxx1", "", -1, 0, 0, 0},
+{0x01, "xxx2", "", 0, 0, 0, 0},
+
+/* dummy instruction. Warning: this one is not actually supported by flash */
{0xff, "__break__", "", 0, 0, 0, OP_RETURN},
};
opcode_t*op = opcode_get(opcode);
if(!op) {
fprintf(stderr, "Can't parse opcode %02x\n", opcode);
- return head;
+ continue;
}
//printf("%s\n", op->name);fflush(stdout);
NEW(code_t,c);
if(op->flags & OP_NEED_ACTIVATION)
stats->flags |= FLAGS_ACTIVATION;
- if(c->opcode == OP_NEWCLASS) {
+ if(c->opcode == OPCODE_NEWCLASS) {
abc_class_t*cls = (abc_class_t*)(c->data[0]);
if(scope > cls->init_scope_depth)
cls->init_scope_depth = scope;
}
- if(c->opcode == OP_NEWFUNCTION) {
+ if(c->opcode == OPCODE_NEWFUNCTION) {
abc_method_t*m = (abc_method_t*)(c->data[0]);
if(m->body && scope > m->body->init_scope_depth)
m->body->init_scope_depth = scope;
return 1;
}
-static currentstats_t* code_get_stats(code_t*code, exception_list_t*exceptions)
+static currentstats_t* code_get_stats(code_t*code, abc_exception_list_t*exceptions)
{
code = code_find_start(code);
int num = 0;
free(current);
return 0;
}
- exception_list_t*e = exceptions;
+ abc_exception_list_t*e = exceptions;
while(e) {
- if(e->exception->target)
- callcode(current, e->exception->target->pos, 1, 0);
+ if(e->abc_exception->target)
+ callcode(current, e->abc_exception->target->pos, 1, 0);
e = e->next;
}
}
}
-int code_dump(code_t*c, exception_list_t*exceptions, abc_file_t*file, char*prefix, FILE*fo)
+int code_dump(code_t*c, abc_exception_list_t*exceptions, abc_file_t*file, char*prefix, FILE*fo)
{
- exception_list_t*e = exceptions;
+ abc_exception_list_t*e = exceptions;
c = code_find_start(c);
currentstats_t*stats = code_get_stats(c, exceptions);
e = exceptions;
while(e) {
- if(c==e->exception->from)
+ if(c==e->abc_exception->from)
fprintf(fo, "%s TRY {\n", prefix);
- if(c==e->exception->target) {
- char*s1 = multiname_tostring(e->exception->exc_type);
- char*s2 = multiname_tostring(e->exception->var_name);
+ if(c==e->abc_exception->target) {
+ char*s1 = multiname_tostring(e->abc_exception->exc_type);
+ char*s2 = multiname_tostring(e->abc_exception->var_name);
fprintf(fo, "%s CATCH(%s %s)\n", prefix, s1, s2);
free(s1);
free(s2);
e = exceptions;
while(e) {
- if(c==e->exception->to) {
- if(e->exception->target)
- fprintf(fo, "%s } // END TRY (HANDLER: %d)\n", prefix, e->exception->target->pos);
+ if(c==e->abc_exception->to) {
+ if(e->abc_exception->target)
+ fprintf(fo, "%s } // END TRY (HANDLER: %d)\n", prefix, e->abc_exception->target->pos);
else
fprintf(fo, "%s } // END TRY (HANDLER: 00000000)\n", prefix);
}
return 1;
}
-codestats_t* code_get_statistics(code_t*code, exception_list_t*exceptions)
+codestats_t* code_get_statistics(code_t*code, abc_exception_list_t*exceptions)
{
currentstats_t*current = code_get_stats(code, exceptions);
if(!current)