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

Reply via email to