Signed-off-by: Tomek Grabiec <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel