Signed-off-by: Tomek Grabiec <[email protected]>
---
jit/invoke-bc.c | 16 ++++++++++++++++
test/jit/bc-test-utils.c | 11 +++++++++++
test/jit/bc-test-utils.h | 1 +
test/jit/invoke-bc-test.c | 15 ++++++++++-----
4 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/jit/invoke-bc.c b/jit/invoke-bc.c
index 7735cec..41c0f8b 100644
--- a/jit/invoke-bc.c
+++ b/jit/invoke-bc.c
@@ -98,6 +98,20 @@ static struct methodblock *resolve_invoke_target(struct
parse_context *ctx)
return resolveMethod(ctx->cu->method->class, idx);
}
+/* Replaces first argument with null check expression on that argument */
+static void null_check_first_arg(struct expression *arg)
+{
+ struct expression *expr;
+
+ if (expr_type(arg) == EXPR_ARG) {
+ expr = null_check_expr(to_expr(arg->arg_expression));
+ arg->arg_expression = &expr->node;
+ }
+
+ if (expr_type(arg) == EXPR_ARGS_LIST)
+ null_check_first_arg(to_expr(arg->args_right));
+}
+
int convert_invokevirtual(struct parse_context *ctx)
{
struct methodblock *invoke_target;
@@ -144,6 +158,8 @@ int convert_invokespecial(struct parse_context *ctx)
if (err)
goto failed;
+ null_check_first_arg(to_expr(expr->args_list));
+
err = insert_invoke_expr(ctx, expr);
if (err)
goto failed;
diff --git a/test/jit/bc-test-utils.c b/test/jit/bc-test-utils.c
index a3a2657..b93dec3 100644
--- a/test/jit/bc-test-utils.c
+++ b/test/jit/bc-test-utils.c
@@ -72,6 +72,17 @@ void assert_value_expr(enum vm_type expected_vm_type,
assert_int_equals(expected_value, expr->value);
}
+void assert_nullcheck_value_expr(enum vm_type expected_vm_type,
+ long long expected_value,
+ struct tree_node *node)
+{
+ struct expression *expr = to_expr(node);
+
+ assert_int_equals(EXPR_NULL_CHECK, expr_type(expr));
+ assert_value_expr(expected_vm_type, expected_value,
+ expr->null_check_ref);
+}
+
void assert_fvalue_expr(enum vm_type expected_vm_type,
double expected_value, struct tree_node *node)
{
diff --git a/test/jit/bc-test-utils.h b/test/jit/bc-test-utils.h
index 8ec8535..99b46f2 100644
--- a/test/jit/bc-test-utils.h
+++ b/test/jit/bc-test-utils.h
@@ -20,6 +20,7 @@ void __free_simple_bb(struct basic_block *);
void free_simple_bb(struct basic_block *);
void assert_value_expr(enum vm_type, long long, struct tree_node *);
+void assert_nullcheck_value_expr(enum vm_type, long long, struct tree_node *);
void assert_fvalue_expr(enum vm_type, double, struct tree_node *);
void assert_local_expr(enum vm_type, unsigned long, struct tree_node *);
void assert_temporary_expr(struct tree_node *);
diff --git a/test/jit/invoke-bc-test.c b/test/jit/invoke-bc-test.c
index f4228fb..a8f73c9 100644
--- a/test/jit/invoke-bc-test.c
+++ b/test/jit/invoke-bc-test.c
@@ -128,7 +128,8 @@ static void assert_invoke_expression_type(enum
expression_type expected_type, un
__free_simple_bb(bb);
}
-static void assert_invoke_passes_objectref(unsigned char invoke_opc)
+static void assert_invoke_passes_objectref(unsigned char invoke_opc,
+ bool nullcheck)
{
struct expression *invoke_expr;
struct expression *arg_expr;
@@ -141,8 +142,12 @@ static void assert_invoke_passes_objectref(unsigned char
invoke_opc)
invoke_expr = to_expr(stmt->expression);
arg_expr = to_expr(invoke_expr->args_list);
- assert_value_expr(J_REFERENCE, 0xdeadbeef, arg_expr->arg_expression);
-
+ if (nullcheck)
+ assert_nullcheck_value_expr(J_REFERENCE, 0xdeadbeef,
+ arg_expr->arg_expression);
+ else
+ assert_value_expr(J_REFERENCE, 0xdeadbeef,
+ arg_expr->arg_expression);
__free_simple_bb(bb);
}
@@ -267,7 +272,7 @@ void
test_invokespecial_should_be_converted_to_invokespecial_expr(void)
void test_invokespecial_should_pass_objectref_as_first_argument(void)
{
- assert_invoke_passes_objectref(OPC_INVOKESPECIAL);
+ assert_invoke_passes_objectref(OPC_INVOKESPECIAL, true);
}
void test_invokespecial_converts_to_invoke_expr(void)
@@ -304,7 +309,7 @@ void
test_invokevirtual_should_be_converted_to_invokevirtual_expr(void)
void test_invokevirtual_should_pass_objectref_as_first_argument(void)
{
- assert_invoke_passes_objectref(OPC_INVOKEVIRTUAL);
+ assert_invoke_passes_objectref(OPC_INVOKEVIRTUAL, false);
}
void test_invokevirtual_should_parse_passed_arguments(void)
--
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