We should propagate bytecode offset to expressions contained in patched expression.
Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- jit/bc-offset-mapping.c | 86 ++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 82 insertions(+), 4 deletions(-) diff --git a/jit/bc-offset-mapping.c b/jit/bc-offset-mapping.c index e36e82a..b8969a4 100644 --- a/jit/bc-offset-mapping.c +++ b/jit/bc-offset-mapping.c @@ -43,13 +43,91 @@ void tree_patch_bc_offset(struct tree_node *node, unsigned long bc_offset) if (node_is_stmt(node)) { struct statement *stmt = to_stmt(node); - if (stmt->bytecode_offset == BC_OFFSET_UNKNOWN) - stmt->bytecode_offset = bc_offset; + if (stmt->bytecode_offset != BC_OFFSET_UNKNOWN) + return; + + stmt->bytecode_offset = bc_offset; } else { struct expression *expr = to_expr(node); - if (expr->bytecode_offset == BC_OFFSET_UNKNOWN) - expr->bytecode_offset = bc_offset; + if (expr->bytecode_offset != BC_OFFSET_UNKNOWN) + return; + + expr->bytecode_offset = 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; + } } } -- 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