[Swfdec-commits] 6 commits - vivified/code

Pekka Lampila medar at kemper.freedesktop.org
Thu Apr 24 01:27:23 PDT 2008


 vivified/code/vivi_code_assembler.c |   12 +++
 vivified/code/vivi_code_boolean.c   |   15 +++
 vivified/code/vivi_code_function.c  |   18 ++--
 vivified/code/vivi_code_goto.c      |   14 +++
 vivified/code/vivi_code_if.c        |   19 ++--
 vivified/code/vivi_code_label.c     |   14 ++-
 vivified/code/vivi_code_label.h     |    1 
 vivified/code/vivi_code_null.c      |   14 +++
 vivified/code/vivi_code_number.c    |   15 +++
 vivified/code/vivi_code_string.c    |   15 +++
 vivified/code/vivi_code_undefined.c |   15 +++
 vivified/code/vivi_parser.c         |  143 ++++++++++++++++++++++++++++++++----
 12 files changed, 257 insertions(+), 38 deletions(-)

New commits:
commit dc0766429534ef1a591ee4af7e4d302adc28cb84
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Apr 24 11:26:32 2008 +0300

    Fixes to asm block parsing

diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index ba1c3f8..37c1633 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -262,27 +262,20 @@ try_parse_token (ParseData *data, ViviParserScannerToken token)
   return TRUE;
 }
 
-static gboolean
-try_parse_automatic_semicolon (ParseData *data)
+static void
+parse_automatic_semicolon (ParseData *data)
 {
   if (try_parse_token (data, TOKEN_SEMICOLON))
-    return TRUE;
+    return;
   if (peek_line_terminator (data))
-    return TRUE;
+    return;
 
   vivi_parser_scanner_peek_next_token (data->scanner);
   if (data->scanner->next_token == TOKEN_BRACE_LEFT ||
       data->scanner->next_token == TOKEN_EOF)
-    return TRUE;
+    return;
 
-  return FALSE;
-}
-
-static void
-parse_automatic_semicolon (ParseData *data)
-{
-  if (!try_parse_automatic_semicolon (data))
-    vivi_parser_error_unexpected (data, TOKEN_SEMICOLON);
+  vivi_parser_error_unexpected (data, TOKEN_SEMICOLON);
 }
 
 G_GNUC_WARN_UNUSED_RESULT static gboolean
@@ -1098,6 +1091,7 @@ parse_asm_code (ParseData *data)
     if (asm_statements[i].parse != NULL) {
       return asm_statements[i].parse (data);
     } else {
+      parse_automatic_semicolon (data);
       g_assert (asm_statements[i].constructor != NULL);
       return asm_statements[i].constructor ();
     }
@@ -1130,13 +1124,11 @@ parse_asm_statement (ParseData *data)
       code = parse_asm_code (data);
       vivi_code_assembler_add_code (assembler, code);
       g_object_unref (code);
-    } while (try_parse_automatic_semicolon (data) &&
-	!peek_token (data, TOKEN_BRACE_RIGHT) &&
-	!peek_token (data, TOKEN_EOF));
+    } while (peek_token (data, TOKEN_IDENTIFIER));
 
     if (!try_parse_token (data, TOKEN_BRACE_RIGHT)) {
-      vivi_parser_error_unexpected_or (data, TOKEN_BRACE_RIGHT, TOKEN_COMMA,
-	  TOKEN_NONE);
+      vivi_parser_error_unexpected_or (data, TOKEN_BRACE_RIGHT,
+	  TOKEN_IDENTIFIER, TOKEN_NONE);
     }
   }
 
commit f00f4daaaabe151400e7193635cfec5a7e09ddcd
Merge: 862bd94... 95248fa...
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Apr 24 11:21:18 2008 +0300

    Merge branch 'master' of ssh://medar@git.freedesktop.org/git/swfdec/swfdec

commit 862bd94d76d096e191d56dd16f2be416a1341d4f
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Apr 24 10:16:49 2008 +0300

    Parse asm blocks. Codes that take parameters are not parsed yet

diff --git a/vivified/code/vivi_code_assembler.c b/vivified/code/vivi_code_assembler.c
index 02a0d91..428801a 100644
--- a/vivified/code/vivi_code_assembler.c
+++ b/vivified/code/vivi_code_assembler.c
@@ -70,6 +70,17 @@ vivi_code_assembler_print (ViviCodeToken *token, ViviCodePrinter *printer)
 }
 
 static void
+vivi_code_assembler_compile (ViviCodeToken *token, ViviCodeAssembler *other)
+{
+  ViviCodeAssembler *self = VIVI_CODE_ASSEMBLER (token);
+  guint i;
+
+  for (i = 0; i < self->codes->len; i++) {
+    vivi_code_assembler_add_code (other, g_ptr_array_index (self->codes, i));
+  }
+}
+
+static void
 vivi_code_assembler_class_init (ViviCodeAssemblerClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -79,6 +90,7 @@ vivi_code_assembler_class_init (ViviCodeAssemblerClass *klass)
   object_class->dispose = vivi_code_assembler_dispose;
 
   token_class->print = vivi_code_assembler_print;
+  token_class->compile = vivi_code_assembler_compile;
 
   code_class->optimize = vivi_code_assembler_optimize;
 }
diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index b741209..ba1c3f8 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -29,6 +29,7 @@
 #include "vivi_parser_scanner.h"
 
 #include "vivi_code_and.h"
+#include "vivi_code_asm_code_default.h"
 #include "vivi_code_assignment.h"
 #include "vivi_code_binary_default.h"
 #include "vivi_code_block.h"
@@ -65,6 +66,7 @@
 #include "vivi_compiler_goto_name.h"
 
 #include "vivi_code_text_printer.h"
+#include "vivi_code_assembler.h"
 
 enum {
   ERROR_TOKEN_LITERAL = TOKEN_LAST + 1,
@@ -260,20 +262,27 @@ try_parse_token (ParseData *data, ViviParserScannerToken token)
   return TRUE;
 }
 
-static void
-parse_automatic_semicolon (ParseData *data)
+static gboolean
+try_parse_automatic_semicolon (ParseData *data)
 {
   if (try_parse_token (data, TOKEN_SEMICOLON))
-    return;
+    return TRUE;
   if (peek_line_terminator (data))
-    return;
+    return TRUE;
 
   vivi_parser_scanner_peek_next_token (data->scanner);
   if (data->scanner->next_token == TOKEN_BRACE_LEFT ||
       data->scanner->next_token == TOKEN_EOF)
-    return;
+    return TRUE;
 
-  vivi_parser_error_unexpected (data, TOKEN_SEMICOLON);
+  return FALSE;
+}
+
+static void
+parse_automatic_semicolon (ParseData *data)
+{
+  if (!try_parse_automatic_semicolon (data))
+    vivi_parser_error_unexpected (data, TOKEN_SEMICOLON);
 }
 
 G_GNUC_WARN_UNUSED_RESULT static gboolean
@@ -1015,6 +1024,125 @@ parse_variable_declaration (ParseData *data)
   return vivi_parser_join_statements (statement_right, assignment);
 }
 
+// asm functions
+
+static ViviCodeAsm *
+parse_asm_if (ParseData *data)
+{
+  return NULL;
+}
+
+typedef ViviCodeAsm *(*AsmConstructor) (void);
+typedef ViviCodeAsm * (*ParseAsmFunction) (ParseData *data);
+
+typedef struct {
+  const char *			name;
+  AsmConstructor		constructor;
+  ParseAsmFunction		parse;
+} AsmStatement;
+
+static const AsmStatement asm_statements[] = {
+#define DEFAULT_ASM(CapsName, underscore_name, byte_code) \
+  { G_STRINGIFY (underscore_name), vivi_code_asm_ ## underscore_name ## _new, NULL },
+#include "vivi_code_defaults.h"
+#undef DEFAULT_ASM
+  { "if", NULL, parse_asm_if }
+};
+#if 0
+DEFAULT_ASM (GotoFrame, goto_frame, SWFDEC_AS_ACTION_GOTO_FRAME)
+DEFAULT_ASM (GetUrl, get_url, SWFDEC_AS_ACTION_GET_URL)
+DEFAULT_ASM (StoreRegister, store_register, SWFDEC_AS_ACTION_STORE_REGISTER)
+DEFAULT_ASM (ConstantPool, constant_pool, SWFDEC_AS_ACTION_CONSTANT_POOL)
+DEFAULT_ASM (StrictMode, strict_mode, SWFDEC_AS_ACTION_STRICT_MODE)
+DEFAULT_ASM (WaitForFrame, wait_for_frame, SWFDEC_AS_ACTION_WAIT_FOR_FRAME)
+DEFAULT_ASM (SetTarget, set_target, SWFDEC_AS_ACTION_SET_TARGET)
+DEFAULT_ASM (GotoLabel, goto_label, SWFDEC_AS_ACTION_GOTO_LABEL)
+DEFAULT_ASM (WaitForFrame2, wait_for_frame2, SWFDEC_AS_ACTION_WAIT_FOR_FRAME2)
+DEFAULT_ASM (DefineFunction2, define_function2, SWFDEC_AS_ACTION_DEFINE_FUNCTION2)
+DEFAULT_ASM (Try, try, SWFDEC_AS_ACTION_TRY)
+DEFAULT_ASM (With, with, SWFDEC_AS_ACTION_WITH)
+DEFAULT_ASM (Push, push, SWFDEC_AS_ACTION_PUSH)
+DEFAULT_ASM (Jump, jump, SWFDEC_AS_ACTION_JUMP)
+DEFAULT_ASM (GetUrl2, get_url2, SWFDEC_AS_ACTION_GET_URL2)
+DEFAULT_ASM (DefineFunction, define_function, SWFDEC_AS_ACTION_DEFINE_FUNCTION)
+DEFAULT_ASM (If, if, SWFDEC_AS_ACTION_IF)
+DEFAULT_ASM (Call, call, SWFDEC_AS_ACTION_CALL)
+DEFAULT_ASM (GotoFrame2, goto_frame2, SWFDEC_AS_ACTION_GOTO_FRAME2)
+#endif
+
+static ViviCodeAsm *
+parse_asm_code (ParseData *data)
+{
+  guint i;
+  char *identifier;
+
+  identifier = g_strdup (parse_identifier_value (data));
+
+  if (try_parse_token (data, TOKEN_COLON)) {
+    ViviCodeAsm *code = VIVI_CODE_ASM (vivi_code_label_new (identifier));
+    g_free (identifier);
+    return code;
+  } else {
+    for (i = 0; i < G_N_ELEMENTS (asm_statements); i++) {
+      if (g_ascii_strcasecmp (identifier, asm_statements[i].name) == 0)
+	break;
+    }
+    if (i >= G_N_ELEMENTS (asm_statements)) {
+      vivi_parser_error (data, "Unknown asm statement: %s", identifier);
+      // FIXME
+      vivi_parser_scanner_get_next_token (data->scanner);
+      i = 0;
+    }
+    g_free (identifier);
+
+    if (asm_statements[i].parse != NULL) {
+      return asm_statements[i].parse (data);
+    } else {
+      g_assert (asm_statements[i].constructor != NULL);
+      return asm_statements[i].constructor ();
+    }
+  }
+}
+
+static gboolean
+peek_asm_statement (ParseData *data)
+{
+  if (!peek_token (data, TOKEN_IDENTIFIER))
+    return FALSE;
+
+  return (g_ascii_strcasecmp (peek_identifier_value (data), "asm") == 0);
+}
+
+static ViviCodeStatement *
+parse_asm_statement (ParseData *data)
+{
+  ViviCodeAssembler *assembler;
+  ViviCodeAsm *code;
+
+  assembler = VIVI_CODE_ASSEMBLER (vivi_code_assembler_new ());
+
+  if (g_ascii_strcasecmp (parse_identifier_value (data), "asm") != 0)
+    vivi_parser_error (data, "Expected 'asm'");
+  parse_token (data, TOKEN_BRACE_LEFT);
+
+  if (!try_parse_token (data, TOKEN_BRACE_RIGHT)) {
+    do {
+      code = parse_asm_code (data);
+      vivi_code_assembler_add_code (assembler, code);
+      g_object_unref (code);
+    } while (try_parse_automatic_semicolon (data) &&
+	!peek_token (data, TOKEN_BRACE_RIGHT) &&
+	!peek_token (data, TOKEN_EOF));
+
+    if (!try_parse_token (data, TOKEN_BRACE_RIGHT)) {
+      vivi_parser_error_unexpected_or (data, TOKEN_BRACE_RIGHT, TOKEN_COMMA,
+	  TOKEN_NONE);
+    }
+  }
+
+  return VIVI_CODE_STATEMENT (assembler);
+}
+
 // builtin functions
 
 static ViviCodeStatement *
@@ -2606,6 +2734,7 @@ static const struct {
   PeekFunction peek;
   ParseStatementFunction parse;
 } statement_functions[] = {
+  { peek_asm_statement, parse_asm_statement },
   { peek_builtin_statement, parse_builtin_statement },
   { peek_block, parse_block },
   { peek_variable_statement, parse_variable_statement },
commit 9dcaba3f22b020fb0d5f500c54e5083c4d9756da
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Thu Apr 24 10:16:02 2008 +0300

    Add support for compiling if, function and goto to asm

diff --git a/vivified/code/vivi_code_function.c b/vivified/code/vivi_code_function.c
index 6ceb51d..1ddddb9 100644
--- a/vivified/code/vivi_code_function.c
+++ b/vivified/code/vivi_code_function.c
@@ -28,6 +28,7 @@
 #include "vivi_code_label.h"
 #include "vivi_code_printer.h"
 #include "vivi_code_assembler.h"
+#include "vivi_code_asm_function2.h"
 
 #include "vivi_decompiler.h"
 
@@ -84,30 +85,27 @@ vivi_code_function_print (ViviCodeToken *token, ViviCodePrinter*printer)
 static void
 vivi_code_function_compile (ViviCodeToken *token, ViviCodeAssembler *assembler)
 {
-  g_printerr ("Implement function");
-#if 0
   ViviCodeFunction *function = VIVI_CODE_FUNCTION (token);
   ViviCodeLabel *label_end;
-  ViviCodeAsmDefineFunction2 *function;
+  ViviCodeAsm *code;
   guint i;
 
-  label_end = vivi_code_label_new_internal ("function_end");
+  label_end = VIVI_CODE_LABEL (vivi_code_label_new_internal ("function_end"));
 
-  define_function = vivi_code_asm_define_function2_new (NULL, 0, 0, label_end)
+  code = vivi_code_asm_function2_new (label_end, function->name, 0, 0);
   for (i = 0; i < function->arguments->len; i++) {
-    vivi_code_asm_define_function2_add_argument (
+    vivi_code_asm_function2_add_argument (VIVI_CODE_ASM_FUNCTION2 (code),
 	g_ptr_array_index (function->arguments, i), 0);
   }
 
-  vivi_code_assembler_add_code (assembler, define_function);
-  g_object_unref (define_function);
+  vivi_code_assembler_add_code (assembler, code);
+  g_object_unref (code);
 
   if (function->body != NULL)
     vivi_code_statement_compile (function->body, assembler);
 
-  vivi_code_assembler_add_code (assembler, label_end);
+  vivi_code_assembler_add_code (assembler, VIVI_CODE_ASM (label_end));
   g_object_unref (label_end);
-#endif
 }
 
 static gboolean
diff --git a/vivified/code/vivi_code_goto.c b/vivified/code/vivi_code_goto.c
index 2d3ab2b..b535fc5 100644
--- a/vivified/code/vivi_code_goto.c
+++ b/vivified/code/vivi_code_goto.c
@@ -23,6 +23,8 @@
 
 #include "vivi_code_goto.h"
 #include "vivi_code_printer.h"
+#include "vivi_code_assembler.h"
+#include "vivi_code_asm_jump.h"
 
 G_DEFINE_TYPE (ViviCodeGoto, vivi_code_goto, VIVI_TYPE_CODE_STATEMENT)
 
@@ -49,6 +51,17 @@ vivi_code_goto_print (ViviCodeToken *token, ViviCodePrinter *printer)
 }
 
 static void
+vivi_code_goto_compile (ViviCodeToken *token, ViviCodeAssembler *assembler)
+{
+  ViviCodeGoto *gotoo = VIVI_CODE_GOTO (token);
+  ViviCodeAsm *code;
+
+  code = vivi_code_asm_jump_new (gotoo->label);
+  vivi_code_assembler_add_code (assembler, code);
+  g_object_unref (code);
+}
+
+static void
 vivi_code_goto_class_init (ViviCodeGotoClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -57,6 +70,7 @@ vivi_code_goto_class_init (ViviCodeGotoClass *klass)
   object_class->dispose = vivi_code_goto_dispose;
 
   token_class->print = vivi_code_goto_print;
+  token_class->compile = vivi_code_goto_compile;
 }
 
 static void
diff --git a/vivified/code/vivi_code_if.c b/vivified/code/vivi_code_if.c
index a1aa62b..267d6db 100644
--- a/vivified/code/vivi_code_if.c
+++ b/vivified/code/vivi_code_if.c
@@ -26,6 +26,8 @@
 #include "vivi_code_printer.h"
 #include "vivi_code_label.h"
 #include "vivi_code_assembler.h"
+#include "vivi_code_asm_if.h"
+#include "vivi_code_asm_jump.h"
 
 G_DEFINE_TYPE (ViviCodeIf, vivi_code_if, VIVI_TYPE_CODE_STATEMENT)
 
@@ -129,35 +131,32 @@ vivi_code_if_print (ViviCodeToken *token, ViviCodePrinter *printer)
 static void
 vivi_code_if_compile (ViviCodeToken *token, ViviCodeAssembler *assembler)
 {
-  g_printerr ("Implement if\n");
-#if 0
   ViviCodeIf *stmt = VIVI_CODE_IF (token);
-  ViviCodeLabel *label_if, *label_else;
+  ViviCodeLabel *label_if, *label_end;
   ViviCodeAsm *code;
 
   vivi_code_value_compile (stmt->condition, assembler);
 
-  label_if = vivi_code_label_new_internal ("if");
-  code = vivi_code_asm_if_new (label_if)
+  label_if = VIVI_CODE_LABEL (vivi_code_label_new_internal ("if"));
+  code = vivi_code_asm_if_new (label_if);
   vivi_code_assembler_add_code (assembler, code);
   g_object_unref (code);
 
   if (stmt->else_statement)
     vivi_code_statement_compile (stmt->else_statement, assembler);
 
-  label_end = vivi_code_label_new_internal ("end");
+  label_end = VIVI_CODE_LABEL (vivi_code_label_new_internal ("end"));
   code = vivi_code_asm_jump_new (label_end);
   vivi_code_assembler_add_code (assembler, code);
   g_object_unref (code);
 
-  vivi_code_assembler_add_code (assembler, label_if);
+  vivi_code_assembler_add_code (assembler, VIVI_CODE_ASM (label_if));
   g_object_unref (label_if);
 
-  vivi_code_assembler_compile_statement (assembler, stmt->if_statement);
+  vivi_code_statement_compile (stmt->if_statement, assembler);
 
-  vivi_code_assembler_add_code (assembler, label_end);
+  vivi_code_assembler_add_code (assembler, VIVI_CODE_ASM (label_end));
   g_object_unref (label_end);
-#endif
 }
 
 static void
diff --git a/vivified/code/vivi_code_label.c b/vivified/code/vivi_code_label.c
index db3604d..500d9dc 100644
--- a/vivified/code/vivi_code_label.c
+++ b/vivified/code/vivi_code_label.c
@@ -70,15 +70,12 @@ vivi_code_label_print (ViviCodeToken *token, ViviCodePrinter *printer)
 static void
 vivi_code_label_compile (ViviCodeToken *token, ViviCodeAssembler *assembler)
 {
-  g_printerr ("Implement label\n");
-#if 0
   ViviCodeLabel *label = VIVI_CODE_LABEL (token);
-  ViviCodeAsm *code =
-    VIVI_CODE_ASM (vivi_code_label_new_internal_from_label (label));
+  ViviCodeAsm *code;
 
+  code = VIVI_CODE_ASM (vivi_code_label_new_internal (label->name));
   vivi_code_assembler_add_code (assembler, code);
   g_object_unref (code);
-#endif
 }
 
 static gboolean
@@ -120,6 +117,13 @@ vivi_code_label_new (const char *name)
   return VIVI_CODE_STATEMENT (label);
 }
 
+ViviCodeStatement *
+vivi_code_label_new_internal (const char *prefix)
+{
+  // FIXME
+  return vivi_code_label_new (prefix);
+}
+
 const char *
 vivi_code_label_get_name (ViviCodeLabel *label)
 {
diff --git a/vivified/code/vivi_code_label.h b/vivified/code/vivi_code_label.h
index 342e728..44db2ec 100644
--- a/vivified/code/vivi_code_label.h
+++ b/vivified/code/vivi_code_label.h
@@ -50,6 +50,7 @@ struct _ViviCodeLabelClass
 GType			vivi_code_label_get_type   	(void);
 
 ViviCodeStatement *	vivi_code_label_new		(const char *		name);
+ViviCodeStatement *	vivi_code_label_new_internal	(const char *		prefix);
 
 const char *		vivi_code_label_get_name	(ViviCodeLabel *	label);
 
commit 94268e2a2299ee64af70794eb53a853b0bd738e3
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 23 15:44:30 2008 +0300

    Fix parsing of function declarations

diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index c3e473b..b741209 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -2668,12 +2668,10 @@ parse_source_element (ParseData *data);
 static ViviCodeValue *
 parse_function_definition (ParseData *data, gboolean name_required)
 {
-  ViviCodeValue *function, **arguments;
+  ViviCodeValue *function;
   ViviCodeStatement *body;
-  const char *name;
-  guint i;
+  char *name;
 
-  arguments = NULL;
   body = NULL;
 
   parse_token (data, TOKEN_FUNCTION);
@@ -2696,7 +2694,14 @@ parse_function_definition (ParseData *data, gboolean name_required)
     }
   }
 
+  function = vivi_code_function_new (name);
+  g_free (name);
+
   if (!try_parse_token (data, TOKEN_PARENTHESIS_RIGHT)) {
+    do {
+      vivi_code_function_add_argument (VIVI_CODE_FUNCTION (function),
+	  parse_identifier_value (data));
+    } while (try_parse_token (data, TOKEN_COMMA));
     parse_token (data, TOKEN_PARENTHESIS_RIGHT);
   }
 
@@ -2709,19 +2714,10 @@ parse_function_definition (ParseData *data, gboolean name_required)
 
   parse_token (data, TOKEN_BRACE_RIGHT);
 
-  function = vivi_code_function_new (name);
   if (body != NULL) {
     vivi_code_function_set_body (VIVI_CODE_FUNCTION (function), body);
     g_object_unref (body);
   }
-  if (arguments != NULL) {
-    for (i = 0; arguments[i] != NULL; i++) {
-      vivi_code_function_add_argument (VIVI_CODE_FUNCTION (function),
-	  vivi_code_constant_get_variable_name (VIVI_CODE_CONSTANT (
-	      VIVI_CODE_GET (arguments[i])->name)));
-    }
-    free_value_list (arguments);
-  }
 
   return function;
 }
commit b3d5aef1669e11acd9e04c6fdadff553a13046d0
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 23 15:31:38 2008 +0300

    Add compile vfuncs for boolean, null, number, string and undefined

diff --git a/vivified/code/vivi_code_boolean.c b/vivified/code/vivi_code_boolean.c
index 5076cf7..efb1bd4 100644
--- a/vivified/code/vivi_code_boolean.c
+++ b/vivified/code/vivi_code_boolean.c
@@ -23,6 +23,8 @@
 
 #include "vivi_code_boolean.h"
 #include "vivi_code_printer.h"
+#include "vivi_code_assembler.h"
+#include "vivi_code_asm_push.h"
 
 G_DEFINE_TYPE (ViviCodeBoolean, vivi_code_boolean, VIVI_TYPE_CODE_CONSTANT)
 
@@ -34,6 +36,18 @@ vivi_code_boolean_print (ViviCodeToken *token, ViviCodePrinter *printer)
   vivi_code_printer_print (printer, b->value ? "true" : "false");
 }
 
+static void
+vivi_code_boolean_compile (ViviCodeToken *token, ViviCodeAssembler *assembler)
+{
+  ViviCodeBoolean *b = VIVI_CODE_BOOLEAN (token);
+  ViviCodeAsm *code;
+
+  code = vivi_code_asm_push_new ();
+  vivi_code_asm_push_add_boolean (VIVI_CODE_ASM_PUSH (code), b->value);
+  vivi_code_assembler_add_code (assembler, code);
+  g_object_unref (code);
+}
+
 static char *
 vivi_code_boolean_get_variable_name (ViviCodeConstant *constant)
 {
@@ -49,6 +63,7 @@ vivi_code_boolean_class_init (ViviCodeBooleanClass *klass)
   ViviCodeConstantClass *constant_class = VIVI_CODE_CONSTANT_CLASS (klass);
 
   token_class->print = vivi_code_boolean_print;
+  token_class->compile = vivi_code_boolean_compile;
 
   constant_class->get_variable_name = vivi_code_boolean_get_variable_name;
 }
diff --git a/vivified/code/vivi_code_null.c b/vivified/code/vivi_code_null.c
index 322e5d7..25f7f10 100644
--- a/vivified/code/vivi_code_null.c
+++ b/vivified/code/vivi_code_null.c
@@ -27,6 +27,8 @@
 
 #include "vivi_code_null.h"
 #include "vivi_code_printer.h"
+#include "vivi_code_assembler.h"
+#include "vivi_code_asm_push.h"
 
 G_DEFINE_TYPE (ViviCodeNull, vivi_code_null, VIVI_TYPE_CODE_CONSTANT)
 
@@ -36,6 +38,17 @@ vivi_code_null_print (ViviCodeToken *token, ViviCodePrinter *printer)
   vivi_code_printer_print (printer, "null");
 }
 
+static void
+vivi_code_null_compile (ViviCodeToken *token, ViviCodeAssembler *assembler)
+{
+  ViviCodeAsm *code;
+
+  code = vivi_code_asm_push_new ();
+  vivi_code_asm_push_add_null (VIVI_CODE_ASM_PUSH (code));
+  vivi_code_assembler_add_code (assembler, code);
+  g_object_unref (code);
+}
+
 static char *
 vivi_code_null_get_variable_name (ViviCodeConstant *constant)
 {
@@ -49,6 +62,7 @@ vivi_code_null_class_init (ViviCodeNullClass *klass)
   ViviCodeConstantClass *constant_class = VIVI_CODE_CONSTANT_CLASS (klass);
 
   token_class->print = vivi_code_null_print;
+  token_class->compile = vivi_code_null_compile;
 
   constant_class->get_variable_name = vivi_code_null_get_variable_name;
 }
diff --git a/vivified/code/vivi_code_number.c b/vivified/code/vivi_code_number.c
index 24b0e84..01dc54a 100644
--- a/vivified/code/vivi_code_number.c
+++ b/vivified/code/vivi_code_number.c
@@ -23,6 +23,8 @@
 
 #include "vivi_code_number.h"
 #include "vivi_code_printer.h"
+#include "vivi_code_assembler.h"
+#include "vivi_code_asm_push.h"
 
 G_DEFINE_TYPE (ViviCodeNumber, vivi_code_number, VIVI_TYPE_CODE_CONSTANT)
 
@@ -38,11 +40,24 @@ vivi_code_number_print (ViviCodeToken *token, ViviCodePrinter *printer)
 }
 
 static void
+vivi_code_number_compile (ViviCodeToken *token, ViviCodeAssembler *assembler)
+{
+  ViviCodeNumber *number = VIVI_CODE_NUMBER (token);
+  ViviCodeAsm *code;
+
+  code = vivi_code_asm_push_new ();
+  vivi_code_asm_push_add_double (VIVI_CODE_ASM_PUSH (code), number->value);
+  vivi_code_assembler_add_code (assembler, code);
+  g_object_unref (code);
+}
+
+static void
 vivi_code_number_class_init (ViviCodeNumberClass *klass)
 {
   ViviCodeTokenClass *token_class = VIVI_CODE_TOKEN_CLASS (klass);
 
   token_class->print = vivi_code_number_print;
+  token_class->compile = vivi_code_number_compile;
 }
 
 static void
diff --git a/vivified/code/vivi_code_string.c b/vivified/code/vivi_code_string.c
index 41336bc..d87bb82 100644
--- a/vivified/code/vivi_code_string.c
+++ b/vivified/code/vivi_code_string.c
@@ -25,6 +25,8 @@
 
 #include "vivi_code_string.h"
 #include "vivi_code_printer.h"
+#include "vivi_code_assembler.h"
+#include "vivi_code_asm_push.h"
 
 G_DEFINE_TYPE (ViviCodeString, vivi_code_string, VIVI_TYPE_CODE_CONSTANT)
 
@@ -50,6 +52,18 @@ vivi_code_string_print (ViviCodeToken *token, ViviCodePrinter *printer)
   g_free (s);
 }
 
+static void
+vivi_code_string_compile (ViviCodeToken *token, ViviCodeAssembler *assembler)
+{
+  ViviCodeString *string = VIVI_CODE_STRING (token);
+  ViviCodeAsm *code;
+
+  code = vivi_code_asm_push_new ();
+  vivi_code_asm_push_add_string (VIVI_CODE_ASM_PUSH (code), string->value);
+  vivi_code_assembler_add_code (assembler, code);
+  g_object_unref (code);
+}
+
 static char *
 vivi_code_string_get_variable_name (ViviCodeConstant *constant)
 {
@@ -74,6 +88,7 @@ vivi_code_string_class_init (ViviCodeStringClass *klass)
   object_class->dispose = vivi_code_string_dispose;
 
   token_class->print = vivi_code_string_print;
+  token_class->compile = vivi_code_string_compile;
 
   constant_class->get_variable_name = vivi_code_string_get_variable_name;
 }
diff --git a/vivified/code/vivi_code_undefined.c b/vivified/code/vivi_code_undefined.c
index 2cadf78..65efc1c 100644
--- a/vivified/code/vivi_code_undefined.c
+++ b/vivified/code/vivi_code_undefined.c
@@ -27,6 +27,8 @@
 
 #include "vivi_code_undefined.h"
 #include "vivi_code_printer.h"
+#include "vivi_code_assembler.h"
+#include "vivi_code_asm_push.h"
 
 G_DEFINE_TYPE (ViviCodeUndefined, vivi_code_undefined, VIVI_TYPE_CODE_CONSTANT)
 
@@ -36,6 +38,18 @@ vivi_code_undefined_print (ViviCodeToken *token, ViviCodePrinter *printer)
   vivi_code_printer_print (printer, "undefined");
 }
 
+static void
+vivi_code_undefined_compile (ViviCodeToken *token,
+    ViviCodeAssembler *assembler)
+{
+  ViviCodeAsm *code;
+
+  code = vivi_code_asm_push_new ();
+  vivi_code_asm_push_add_undefined (VIVI_CODE_ASM_PUSH (code));
+  vivi_code_assembler_add_code (assembler, code);
+  g_object_unref (code);
+}
+
 static char *
 vivi_code_undefined_get_variable_name (ViviCodeConstant *constant)
 {
@@ -49,6 +63,7 @@ vivi_code_undefined_class_init (ViviCodeUndefinedClass *klass)
   ViviCodeConstantClass *constant_class = VIVI_CODE_CONSTANT_CLASS (klass);
 
   token_class->print = vivi_code_undefined_print;
+  token_class->compile = vivi_code_undefined_compile;
 
   constant_class->get_variable_name = vivi_code_undefined_get_variable_name;
 }


More information about the Swfdec-commits mailing list