Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/jit/expression.h |    1 +
 jit/bc-offset-mapping.c  |   74 +---------------------------
 jit/expression.c         |  118 ++++++++++++++++------------------------------
 3 files changed, 45 insertions(+), 148 deletions(-)

diff --git a/include/jit/expression.h b/include/jit/expression.h
index 6319693..09943fd 100644
--- a/include/jit/expression.h
+++ b/include/jit/expression.h
@@ -284,6 +284,7 @@ struct expression *exception_ref_expr(void);
 struct expression *null_check_expr(struct expression *);
 
 unsigned long nr_args(struct expression *);
+int expr_nr_kids(struct expression *);
 
 static inline int is_invoke_expr(struct expression *expr)
 {
diff --git a/jit/bc-offset-mapping.c b/jit/bc-offset-mapping.c
index b8969a4..14e2f46 100644
--- a/jit/bc-offset-mapping.c
+++ b/jit/bc-offset-mapping.c
@@ -49,6 +49,7 @@ void tree_patch_bc_offset(struct tree_node *node, unsigned 
long bc_offset)
                stmt->bytecode_offset = bc_offset;
        } else {
                struct expression *expr = to_expr(node);
+               int i;
 
                if (expr->bytecode_offset != BC_OFFSET_UNKNOWN)
                        return;
@@ -57,77 +58,8 @@ void tree_patch_bc_offset(struct tree_node *node, unsigned 
long bc_offset)
 
                /* We should propagate bytecode offset to expressions
                   contained by this one. */
-               switch (expr_type(expr)) {
-               case EXPR_VALUE:
-               case EXPR_FVALUE:
-               case EXPR_LOCAL:
-               case EXPR_TEMPORARY:
-                       /* nothing to do */
-                       break;
-               case EXPR_ARRAY_DEREF:
-                       tree_patch_bc_offset(expr->arrayref, bc_offset);
-                       tree_patch_bc_offset(expr->array_index, bc_offset);
-                       break;
-               case EXPR_BINOP:
-                       tree_patch_bc_offset(expr->binary_left, bc_offset);
-                       tree_patch_bc_offset(expr->binary_right, bc_offset);
-                       break;
-               case EXPR_UNARY_OP:
-                       tree_patch_bc_offset(expr->unary_expression, bc_offset);
-                       break;
-               case EXPR_CONVERSION:
-                       tree_patch_bc_offset(expr->from_expression, bc_offset);
-                       break;
-               case EXPR_CLASS_FIELD:
-                       /* nothing to do */
-                       break;
-               case EXPR_INSTANCE_FIELD:
-                       tree_patch_bc_offset(expr->objectref_expression,
-                                            bc_offset);
-                       break;
-               case EXPR_INVOKE:
-               case EXPR_INVOKEVIRTUAL:
-                       tree_patch_bc_offset(expr->args_list, bc_offset);
-                       break;
-               case EXPR_ARGS_LIST:
-                       tree_patch_bc_offset(expr->args_left, bc_offset);
-                       tree_patch_bc_offset(expr->args_right, bc_offset);
-                       break;
-               case EXPR_ARG:
-                       tree_patch_bc_offset(expr->arg_expression, bc_offset);
-                       break;
-               case EXPR_NO_ARGS:
-                       /* nothing to do */
-                       break;
-               case EXPR_NEW:
-                       /* nothing to do */
-                       break;
-               case EXPR_NEWARRAY:
-                       tree_patch_bc_offset(expr->array_size, bc_offset);
-                       break;
-               case EXPR_ANEWARRAY:
-                       tree_patch_bc_offset(expr->anewarray_size, bc_offset);
-                       break;
-               case EXPR_MULTIANEWARRAY:
-                       tree_patch_bc_offset(expr->multianewarray_dimensions,
-                                            bc_offset);
-                       break;
-               case EXPR_ARRAYLENGTH:
-                       tree_patch_bc_offset(expr->arraylength_ref, bc_offset);
-                       break;
-               case EXPR_INSTANCEOF:
-                       tree_patch_bc_offset(expr->instanceof_ref, bc_offset);
-                       break;
-               case EXPR_EXCEPTION_REF:
-                       /* nothing to do */
-                       break;
-               case EXPR_NULL_CHECK:
-                       tree_patch_bc_offset(expr->null_check_ref, bc_offset);
-                       break;
-               case EXPR_LAST:
-                       /* nothing to do */
-                       break;
-               }
+               for (i = 0; i < expr_nr_kids(expr); i++)
+                       tree_patch_bc_offset(expr->node.kids[i], bc_offset);
        }
 }
 
diff --git a/jit/expression.c b/jit/expression.c
index d35b597..9f2e252 100644
--- a/jit/expression.c
+++ b/jit/expression.c
@@ -13,6 +13,41 @@
 #include <string.h>
 #include <glib.h>
 
+/* How many child expressions are used by each type of expression. */
+int expr_nr_kids(struct expression *expr)
+{
+       switch (expr_type(expr)) {
+       case EXPR_ARRAY_DEREF:
+       case EXPR_BINOP:
+       case EXPR_ARGS_LIST:
+               return 2;
+       case EXPR_UNARY_OP:
+       case EXPR_CONVERSION:
+       case EXPR_INSTANCE_FIELD:
+       case EXPR_INVOKE:
+       case EXPR_INVOKEVIRTUAL:
+       case EXPR_ARG:
+       case EXPR_NEWARRAY:
+       case EXPR_ANEWARRAY:
+       case EXPR_MULTIANEWARRAY:
+       case EXPR_ARRAYLENGTH:
+       case EXPR_INSTANCEOF:
+       case EXPR_NULL_CHECK:
+               return 1;
+       case EXPR_VALUE:
+       case EXPR_FVALUE:
+       case EXPR_LOCAL:
+       case EXPR_TEMPORARY:
+       case EXPR_CLASS_FIELD:
+       case EXPR_NO_ARGS:
+       case EXPR_NEW:
+       case EXPR_EXCEPTION_REF:
+               return 0;
+       default:
+               assert(!"Invalid expression type");
+       }
+}
+
 struct expression *alloc_expression(enum expression_type type,
                                    enum vm_type vm_type)
 {
@@ -29,86 +64,15 @@ struct expression *alloc_expression(enum expression_type 
type,
 
 void free_expression(struct expression *expr)
 {
+       int i;
+
        if (!expr)
                return;
 
-       switch (expr_type(expr)) {
-       case EXPR_VALUE:
-       case EXPR_FVALUE:
-       case EXPR_LOCAL:
-       case EXPR_TEMPORARY:
-               /* nothing to do */
-               break;
-       case EXPR_ARRAY_DEREF:
-               if (expr->arrayref)
-                       expr_put(to_expr(expr->arrayref));
-               if (expr->array_index)
-                       expr_put(to_expr(expr->array_index));
-               break;
-       case EXPR_BINOP:
-               if (expr->binary_left)
-                       expr_put(to_expr(expr->binary_left));
-               if (expr->binary_right)
-                       expr_put(to_expr(expr->binary_right));
-               break;
-       case EXPR_UNARY_OP:
-               if (expr->unary_expression)
-                       expr_put(to_expr(expr->unary_expression));
-               break;
-       case EXPR_CONVERSION:
-               if (expr->from_expression)
-                       expr_put(to_expr(expr->from_expression));
-               break;
-       case EXPR_CLASS_FIELD:
-               /* nothing to do */
-               break;
-       case EXPR_INSTANCE_FIELD:
-               expr_put(to_expr(expr->objectref_expression));
-               break;
-       case EXPR_INVOKE:
-       case EXPR_INVOKEVIRTUAL:
-               if (expr->args_list)
-                       expr_put(to_expr(expr->args_list));
-               break;
-       case EXPR_ARGS_LIST:
-               expr_put(to_expr(expr->args_left));
-               expr_put(to_expr(expr->args_right));
-               break;
-       case EXPR_ARG:
-               expr_put(to_expr(expr->arg_expression));
-               break;
-       case EXPR_NO_ARGS:
-               /* nothing to do */
-               break;
-       case EXPR_NEW:
-               /* nothing to do */
-               break;
-       case EXPR_NEWARRAY:
-               expr_put(to_expr(expr->array_size));
-               break;
-       case EXPR_ANEWARRAY:
-               expr_put(to_expr(expr->anewarray_size));
-               break;
-       case EXPR_MULTIANEWARRAY:
-               if (expr->multianewarray_dimensions)
-                       expr_put(to_expr(expr->multianewarray_dimensions));
-               break;
-       case EXPR_ARRAYLENGTH:
-               expr_put(to_expr(expr->arraylength_ref));
-               break;
-       case EXPR_INSTANCEOF:
-               expr_put(to_expr(expr->instanceof_ref));
-               break;
-       case EXPR_EXCEPTION_REF:
-               /* nothing to do */
-               break;
-       case EXPR_NULL_CHECK:
-               expr_put(to_expr(expr->null_check_ref));
-               break;
-       case EXPR_LAST:
-               assert(!"EXPR_LAST is not a real type. Don't use it");
-               break;
-       };
+       for (i = 0; i < expr_nr_kids(expr); i++)
+               if (expr->node.kids[i])
+                       expr_put(to_expr(expr->node.kids[i]));
+
        free(expr);
 }
 
-- 
1.6.0.6


------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT 
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp as they present alongside digital heavyweights like Barbarian 
Group, R/GA, & Big Spaceship. http://p.sf.net/sfu/creativitycat-com 
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to