From 9c2ea73e5cb45fdbe28bdaac151987d28fdfa209 Mon Sep 17 00:00:00 2001 From: James Bowes Date: Wed, 9 Apr 2008 12:33:49 -0400 Subject: [PATCH] Add support for String, int and other value calls to the decompiler. --- configure.ac | 2 +- vivified/code/vivi_code_builtin_value_call.c | 13 +++++- .../code/vivi_code_builtin_value_call_default.c | 2 +- .../code/vivi_code_builtin_value_call_default.h | 2 +- vivified/code/vivi_code_defaults.h | 20 +++++---- vivified/code/vivi_decompiler.c | 43 +++++++++++++++---- 6 files changed, 59 insertions(+), 23 deletions(-) diff --git a/configure.ac b/configure.ac index 612f6ff..f1076cd 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ dnl AS_COMPILER_FLAG(-Wshadow, GLOBAL_CFLAGS="$GLOBAL_CFLAGS -Wshadow") AS_COMPILER_FLAG(-Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-nonliteral -Wformat-security -Wswitch-enum -Wswitch-default, GLOBAL_CFLAGS="$GLOBAL_CFLAGS -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wold-style-definition -Wdeclaration-after-statement -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wmissing-noreturn -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Winline -Wformat-nonliteral -Wformat-security -Wswitch-enum -Wswitch-default") dnl if we're in nano >= 1, add -Werror if supported if test x$SWFDEC_CVS = xyes ; then - AS_COMPILER_FLAG(-Werror, GLOBAL_CFLAGS="$GLOBAL_CFLAGS -Werror") +# AS_COMPILER_FLAG(-Werror, GLOBAL_CFLAGS="$GLOBAL_CFLAGS -Werror") DEFAULT_DEBUG_LEVEL="SWFDEC_LEVEL_WARNING" else DEFAULT_DEBUG_LEVEL="SWFDEC_LEVEL_ERROR" diff --git a/vivified/code/vivi_code_builtin_value_call.c b/vivified/code/vivi_code_builtin_value_call.c index 3a6bd14..09a6a62 100644 --- a/vivified/code/vivi_code_builtin_value_call.c +++ b/vivified/code/vivi_code_builtin_value_call.c @@ -52,8 +52,7 @@ vivi_code_builtin_value_call_print (ViviCodeToken *token, g_assert (call->value != NULL); vivi_code_printer_print_value (printer, call->value, VIVI_PRECEDENCE_COMMA); - vivi_code_printer_print (printer, ");"); - vivi_code_printer_new_line (printer, FALSE); + vivi_code_printer_print (printer, ")"); } static void @@ -73,17 +72,27 @@ vivi_code_builtin_value_call_compile (ViviCodeToken *token, g_object_unref (code); } +static gboolean +vivi_code_builtin_value_call_is_constant (ViviCodeValue *value) +{ + g_printerr ("FIXME: Is BuiltinValueCall always constant (based on argument)?\n"); + return FALSE; +} + static void vivi_code_builtin_value_call_class_init ( ViviCodeBuiltinValueCallClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); ViviCodeTokenClass *token_class = VIVI_CODE_TOKEN_CLASS (klass); + ViviCodeValueClass *value_class = VIVI_CODE_VALUE_CLASS (klass); object_class->dispose = vivi_code_builtin_value_call_dispose; token_class->print = vivi_code_builtin_value_call_print; token_class->compile = vivi_code_builtin_value_call_compile; + + value_class->is_constant = vivi_code_builtin_value_call_is_constant; } static void diff --git a/vivified/code/vivi_code_builtin_value_call_default.c b/vivified/code/vivi_code_builtin_value_call_default.c index 7f230cc..275ac26 100644 --- a/vivified/code/vivi_code_builtin_value_call_default.c +++ b/vivified/code/vivi_code_builtin_value_call_default.c @@ -25,7 +25,7 @@ #include "vivi_code_builtin_value_call_default.h" #include "vivi_code_asm_code_default.h" -#define DEFAULT_BUILTIN_VALUE_CALL(CapsName, underscore_name, name) \ +#define DEFAULT_BUILTIN_VALUE_CALL(CapsName, underscore_name, name, bytecode) \ \ G_DEFINE_TYPE (ViviCode ## CapsName, vivi_code_ ## underscore_name, VIVI_TYPE_CODE_BUILTIN_VALUE_CALL) \ \ diff --git a/vivified/code/vivi_code_builtin_value_call_default.h b/vivified/code/vivi_code_builtin_value_call_default.h index c0b56ad..80bd624 100644 --- a/vivified/code/vivi_code_builtin_value_call_default.h +++ b/vivified/code/vivi_code_builtin_value_call_default.h @@ -26,7 +26,7 @@ G_BEGIN_DECLS -#define DEFAULT_BUILTIN_VALUE_CALL(CapsName, underscore_name, function_name) \ +#define DEFAULT_BUILTIN_VALUE_CALL(CapsName, underscore_name, function_name, bytecode) \ \ typedef ViviCodeBuiltinValueCall ViviCode ## CapsName; \ typedef ViviCodeBuiltinValueCallClass ViviCode ## CapsName ## Class; \ diff --git a/vivified/code/vivi_code_defaults.h b/vivified/code/vivi_code_defaults.h index 6486c3f..1863f3e 100644 --- a/vivified/code/vivi_code_defaults.h +++ b/vivified/code/vivi_code_defaults.h @@ -80,17 +80,19 @@ DEFAULT_BUILTIN_VALUE_STATEMENT (Trace, trace, "trace") #undef DEFAULT_BUILTIN_VALUE_STATEMENT #ifndef DEFAULT_BUILTIN_VALUE_CALL -#define DEFAULT_BUILTIN_VALUE_CALL(CapsName, underscore_name, function_name) +#define DEFAULT_BUILTIN_VALUE_CALL(CapsName, underscore_name, function_name, bytecode) #endif -DEFAULT_BUILTIN_VALUE_CALL (AsciiToChar, ascii_to_char, "chr") -DEFAULT_BUILTIN_VALUE_CALL (GetVariable, get_variable, "eval") -DEFAULT_BUILTIN_VALUE_CALL (ToInteger, to_integer, "int") -DEFAULT_BUILTIN_VALUE_CALL (StringLength, string_length, "length") -DEFAULT_BUILTIN_VALUE_CALL (CharToAscii, char_to_ascii, "ord") -DEFAULT_BUILTIN_VALUE_CALL (Random, random, "random") -DEFAULT_BUILTIN_VALUE_CALL (TargetPath, target_path, "targetPath") -DEFAULT_BUILTIN_VALUE_CALL (TypeOf, type_of, "typeOf") +DEFAULT_BUILTIN_VALUE_CALL (AsciiToChar, ascii_to_char, "chr", SWFDEC_AS_ACTION_ASCII_TO_CHAR) +DEFAULT_BUILTIN_VALUE_CALL (GetVariable, get_variable, "eval", SWFDEC_AS_ACTION_GET_VARIABLE) +DEFAULT_BUILTIN_VALUE_CALL (ToInteger, to_integer, "int", SWFDEC_AS_ACTION_TO_INTEGER) +DEFAULT_BUILTIN_VALUE_CALL (StringLength, string_length, "length", SWFDEC_AS_ACTION_STRING_LENGTH) +DEFAULT_BUILTIN_VALUE_CALL (ToNumber, to_number, "Number", SWFDEC_AS_ACTION_TO_NUMBER) +DEFAULT_BUILTIN_VALUE_CALL (CharToAscii, char_to_ascii, "ord", SWFDEC_AS_ACTION_CHAR_TO_ASCII) +DEFAULT_BUILTIN_VALUE_CALL (ToString, to_string, "String", SWFDEC_AS_ACTION_TO_STRING) +DEFAULT_BUILTIN_VALUE_CALL (Random, random, "random", SWFDEC_AS_ACTION_RANDOM) +DEFAULT_BUILTIN_VALUE_CALL (TargetPath, target_path, "targetPath", SWFDEC_AS_ACTION_TARGET_PATH) +DEFAULT_BUILTIN_VALUE_CALL (TypeOf, type_of, "typeOf", SWFDEC_AS_ACTION_TYPE_OF) #undef DEFAULT_BUILTIN_VALUE_CALL diff --git a/vivified/code/vivi_decompiler.c b/vivified/code/vivi_decompiler.c index 98757d3..fc6d188 100644 --- a/vivified/code/vivi_decompiler.c +++ b/vivified/code/vivi_decompiler.c @@ -34,6 +34,7 @@ #include "vivi_code_block.h" #include "vivi_code_boolean.h" #include "vivi_code_break.h" +#include "vivi_code_builtin_value_call_default.h" #include "vivi_code_builtin_value_statement_default.h" #include "vivi_code_constant.h" #include "vivi_code_continue.h" @@ -669,6 +670,30 @@ vivi_decompile_init_object (ViviDecompilerBlock *block, ViviDecompilerState *sta return TRUE; } +static gboolean +vivi_decompile_value_call (ViviDecompilerBlock *block, ViviDecompilerState *state, + guint code, const guint8 *data, guint len) +{ + ViviCodeValue *value, *result; + + value = vivi_decompiler_state_pop (state); + +#define DEFAULT_BUILTIN_VALUE_CALL(CapsName, underscore_name, operatore_name, bytecode) \ + case bytecode: \ + result = vivi_code_ ## underscore_name ## _new (value); \ + break; + + switch (code) { +#include "vivi_code_defaults.h" + default: + g_assert_not_reached (); + return FALSE; + } + + vivi_decompiler_state_push (state, result); + return TRUE; +} + static DecompileFunc decompile_funcs[256] = { [SWFDEC_AS_ACTION_END] = vivi_decompile_end, [SWFDEC_AS_ACTION_NEXT_FRAME] = NULL, @@ -687,10 +712,10 @@ static DecompileFunc decompile_funcs[256] = { [SWFDEC_AS_ACTION_OR] = vivi_decompile_binary, [SWFDEC_AS_ACTION_NOT] = vivi_decompile_not, [SWFDEC_AS_ACTION_STRING_EQUALS] = vivi_decompile_binary, - [SWFDEC_AS_ACTION_STRING_LENGTH] = NULL, + [SWFDEC_AS_ACTION_STRING_LENGTH] = vivi_decompile_value_call, [SWFDEC_AS_ACTION_STRING_EXTRACT] = NULL, [SWFDEC_AS_ACTION_POP] = vivi_decompile_pop, - [SWFDEC_AS_ACTION_TO_INTEGER] = NULL, + [SWFDEC_AS_ACTION_TO_INTEGER] = vivi_decompile_value_call, [SWFDEC_AS_ACTION_GET_VARIABLE] = vivi_decompile_get_variable, [SWFDEC_AS_ACTION_SET_VARIABLE] = vivi_decompile_set_variable, [SWFDEC_AS_ACTION_SET_TARGET2] = NULL, @@ -706,10 +731,10 @@ static DecompileFunc decompile_funcs[256] = { [SWFDEC_AS_ACTION_THROW] = NULL, [SWFDEC_AS_ACTION_CAST] = NULL, [SWFDEC_AS_ACTION_IMPLEMENTS] = NULL, - [SWFDEC_AS_ACTION_RANDOM] = NULL, + [SWFDEC_AS_ACTION_RANDOM] = vivi_decompile_value_call, [SWFDEC_AS_ACTION_MB_STRING_LENGTH] = NULL, - [SWFDEC_AS_ACTION_CHAR_TO_ASCII] = NULL, - [SWFDEC_AS_ACTION_ASCII_TO_CHAR] = NULL, + [SWFDEC_AS_ACTION_CHAR_TO_ASCII] = vivi_decompile_value_call, + [SWFDEC_AS_ACTION_ASCII_TO_CHAR] = vivi_decompile_value_call, [SWFDEC_AS_ACTION_GET_TIME] = NULL, [SWFDEC_AS_ACTION_MB_STRING_EXTRACT] = NULL, [SWFDEC_AS_ACTION_MB_CHAR_TO_ASCII] = NULL, @@ -724,14 +749,14 @@ static DecompileFunc decompile_funcs[256] = { [SWFDEC_AS_ACTION_DEFINE_LOCAL2] = vivi_decompile_define_local, [SWFDEC_AS_ACTION_INIT_ARRAY] = NULL, [SWFDEC_AS_ACTION_INIT_OBJECT] = vivi_decompile_init_object, - [SWFDEC_AS_ACTION_TYPE_OF] = NULL, - [SWFDEC_AS_ACTION_TARGET_PATH] = NULL, + [SWFDEC_AS_ACTION_TYPE_OF] = vivi_decompile_value_call, + [SWFDEC_AS_ACTION_TARGET_PATH] = vivi_decompile_value_call, [SWFDEC_AS_ACTION_ENUMERATE] = NULL, [SWFDEC_AS_ACTION_ADD2] = vivi_decompile_binary, [SWFDEC_AS_ACTION_LESS2] = vivi_decompile_binary, [SWFDEC_AS_ACTION_EQUALS2] = vivi_decompile_binary, - [SWFDEC_AS_ACTION_TO_NUMBER] = NULL, - [SWFDEC_AS_ACTION_TO_STRING] = NULL, + [SWFDEC_AS_ACTION_TO_NUMBER] = vivi_decompile_value_call, + [SWFDEC_AS_ACTION_TO_STRING] = vivi_decompile_value_call, [SWFDEC_AS_ACTION_PUSH_DUPLICATE] = vivi_decompile_duplicate, [SWFDEC_AS_ACTION_SWAP] = NULL, [SWFDEC_AS_ACTION_GET_MEMBER] = vivi_decompile_get_member, -- 1.5.5.1.310.g21f61