aboutsummaryrefslogtreecommitdiff
path: root/libjava/interpret.cc
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2006-01-18 21:52:45 +0000
committerKeith Seitz <kseitz@gcc.gnu.org>2006-01-18 21:52:45 +0000
commitd0f4aa53e0b42986c8de41ddba304516169a6cc7 (patch)
tree780f9c54ac5cfe5ef734495b62563e4e2b4f0cdc /libjava/interpret.cc
parenta56e0baa694476ef6fcd90d27e18cec8ebbbe8db (diff)
downloadgcc-d0f4aa53e0b42986c8de41ddba304516169a6cc7.zip
gcc-d0f4aa53e0b42986c8de41ddba304516169a6cc7.tar.gz
gcc-d0f4aa53e0b42986c8de41ddba304516169a6cc7.tar.bz2
java-interp.h (_Jv_CompileMethod): Add declaration.
* include/java-interp.h (_Jv_CompileMethod): Add declaration. (class _Jv_InterpMethod): Add _Jv_CompileMethod as a friend. * interpret.cc (_Jv_CompileMethod): New function. (run): Massage code to allow for NULL args. Update comments to explain NULL args. Return if compiling the method and args is NULL. From-SVN: r109918
Diffstat (limited to 'libjava/interpret.cc')
-rw-r--r--libjava/interpret.cc44
1 files changed, 30 insertions, 14 deletions
diff --git a/libjava/interpret.cc b/libjava/interpret.cc
index dacf19d..d6e8ccc 100644
--- a/libjava/interpret.cc
+++ b/libjava/interpret.cc
@@ -1,6 +1,6 @@
// interpret.cc - Code for the interpreter
-/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation
+/* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation
This file is part of libgcj.
@@ -792,6 +792,8 @@ _Jv_InterpMethod::compile (const void * const *insn_targets)
}
#endif /* DIRECT_THREADED */
+/* Run the given method.
+ When args is NULL, don't run anything -- just compile it. */
void
_Jv_InterpMethod::run (void *retp, ffi_raw *args, _Jv_InterpMethod *meth)
{
@@ -812,19 +814,6 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args, _Jv_InterpMethod *meth)
_Jv_word locals[meth->max_locals];
- /* Go straight at it! the ffi raw format matches the internal
- stack representation exactly. At least, that's the idea.
- */
- memcpy ((void*) locals, (void*) args, meth->args_raw_size);
-
- _Jv_word *pool_data = meth->defining_class->constants.data;
-
- /* These three are temporaries for common code used by several
- instructions. */
- void (*fun)();
- _Jv_ResolvedMethod* rmeth;
- int tmpval;
-
#define INSN_LABEL(op) &&insn_##op
static const void *const insn_target[] =
@@ -1070,6 +1059,11 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args, _Jv_InterpMethod *meth)
meth->compile (insn_target);
_Jv_MutexUnlock (&compile_mutex);
}
+
+ // If we're only compiling, stop here
+ if (args == NULL)
+ return;
+
pc = (insn_slot *) meth->prepared;
#else
@@ -1102,6 +1096,19 @@ _Jv_InterpMethod::run (void *retp, ffi_raw *args, _Jv_InterpMethod *meth)
#define TAKE_GOTO pc = GOTO_VAL ()
+ /* Go straight at it! the ffi raw format matches the internal
+ stack representation exactly. At least, that's the idea.
+ */
+ memcpy ((void*) locals, (void*) args, meth->args_raw_size);
+
+ _Jv_word *pool_data = meth->defining_class->constants.data;
+
+ /* These three are temporaries for common code used by several
+ instructions. */
+ void (*fun)();
+ _Jv_ResolvedMethod* rmeth;
+ int tmpval;
+
try
{
// We keep nop around. It is used if we're interpreting the
@@ -3866,4 +3873,13 @@ _Jv_InterpreterEngine::do_post_miranda_hook (jclass klass)
}
}
+#ifdef DIRECT_THREADED
+void
+_Jv_CompileMethod (_Jv_InterpMethod* method)
+{
+ if (method->prepared == NULL)
+ _Jv_InterpMethod::run (NULL, NULL, method);
+}
+#endif // DIRECT_THREADED
+
#endif // INTERPRETER