aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Enberg <penberg@kernel.org>2012-08-17 11:38:26 +0300
committerPekka Enberg <penberg@kernel.org>2012-08-17 12:48:03 +0300
commit81ca95b79850207bb5b8680466d381418d1eb09e (patch)
tree1704cba985301d1aec86f7cd36d496fce2f5767d
parentd7c88a0292ff2441faa84751444c2da37cf9a75a (diff)
downloadjato-81ca95b79850207bb5b8680466d381418d1eb09e.tar.gz
vm: Introduce new vm_method_arg_stack_count() API function
Move the oddly named 'method_real_argument_count' to 'vm/method.c' and rename it to vm_method_arg_stack_count(). The API is useful for implementing alternative codegen backends. Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r--include/vm/method.h2
-rw-r--r--jit/invoke-bc.c13
-rw-r--r--vm/method.c16
3 files changed, 19 insertions, 12 deletions
diff --git a/include/vm/method.h b/include/vm/method.h
index 9d032ab2..6885f637 100644
--- a/include/vm/method.h
+++ b/include/vm/method.h
@@ -70,6 +70,8 @@ struct vm_method {
#define VM_METHOD_FLAG_TRACE (1 << 2)
#define VM_METHOD_FLAG_TRACE_GATE (1 << 3)
+unsigned int vm_method_arg_stack_count(struct vm_method *vmm);
+
struct vm_method *vm_method_get_overridden(struct vm_method *vmm);
int vm_method_do_init(struct vm_method *vmm);
diff --git a/jit/invoke-bc.c b/jit/invoke-bc.c
index d1709ad4..6c829baa 100644
--- a/jit/invoke-bc.c
+++ b/jit/invoke-bc.c
@@ -53,17 +53,6 @@ int convert_return(struct parse_context *ctx)
return 0;
}
-static unsigned int method_real_argument_count(struct vm_method *invoke_target)
-{
- int argc;
-
- argc = vm_method_arg_slots(invoke_target);
- if (!vm_method_is_static(invoke_target))
- argc++;
-
- return argc;
-}
-
static int convert_and_add_args(struct parse_context *ctx,
struct vm_method *invoke_target,
struct statement *stmt)
@@ -72,7 +61,7 @@ static int convert_and_add_args(struct parse_context *ctx,
struct expression *args_list;
unsigned long nr_args, i;
- nr_args = method_real_argument_count(invoke_target);
+ nr_args = vm_method_arg_stack_count(invoke_target);
args_array = pop_args(ctx->bb->mimic_stack, nr_args);
if (!args_array)
diff --git a/vm/method.c b/vm/method.c
index 8bdbf74c..5233d954 100644
--- a/vm/method.c
+++ b/vm/method.c
@@ -24,6 +24,22 @@
#include <string.h>
#include <stdio.h>
+/*
+ * Returns the number of arguments on operand stack (and consequently,
+ * on the mimic stack) for a method.
+ */
+unsigned int vm_method_arg_stack_count(struct vm_method *vmm)
+{
+ int argc;
+
+ argc = vm_method_arg_slots(vmm);
+
+ if (!vm_method_is_static(vmm))
+ argc++;
+
+ return argc;
+}
+
/* Returns the method vmm is overriding or NULL. */
struct vm_method *vm_method_get_overridden(struct vm_method *vmm)
{