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