This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[RFA] _Jv_CompileMethod
- From: Keith Seitz <keiths at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Wed, 18 Jan 2006 12:06:59 -0800
- Subject: [RFA] _Jv_CompileMethod
Hi,
The following patch adds support to _Jv_InterpMethod to allow an outside
caller (like JDWP support) to compile methods.
This is necessary because the line tables are adjusted when the method
is compiled. If the debugger happens to request a line table for a
method before it is compiled, it will have a different line table than
the VM.
Keith
ChangeLog
2006-01-18 Keith Seitz <keiths@redhat.com>
* 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.
Index: include/java-interp.h
===================================================================
--- include/java-interp.h (revision 108075)
+++ include/java-interp.h (working copy)
@@ -1,6 +1,6 @@
// java-interp.h - Header file for the bytecode interpreter. -*- c++ -*-
-/* 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.
@@ -44,6 +44,7 @@
int _Jv_count_arguments (_Jv_Utf8Const *signature,
jboolean staticp = true);
void _Jv_VerifyMethod (_Jv_InterpMethod *method);
+void _Jv_CompileMethod (_Jv_InterpMethod* method);
/* the interpreter is written in C++, primarily because it makes it easy for
* the entire thing to be "friend" with class Class. */
@@ -184,6 +185,10 @@
public:
static void dump_object(jobject o);
+#ifdef DIRECT_THREADED
+ friend void _Jv_CompileMethod (_Jv_InterpMethod*);
+#endif
+
friend class _Jv_ClassReader;
friend class _Jv_BytecodeVerifier;
friend class _Jv_StackTrace;
Index: interpret.cc
===================================================================
--- interpret.cc (revision 109901)
+++ interpret.cc (working copy)
@@ -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.
@@ -294,7 +294,7 @@
#ifdef DIRECT_THREADED
// "Compile" a method by turning it from bytecode to direct-threaded
-// code.
+// code. When args is NULL, don't run anything -- just compile it.
void
_Jv_InterpMethod::compile (const void * const *insn_targets)
{
@@ -812,19 +812,6 @@
_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[] =
@@ -1069,6 +1056,9 @@
if (meth->prepared == NULL)
meth->compile (insn_target);
_Jv_MutexUnlock (&compile_mutex);
+
+ if (args == NULL)
+ return;
}
pc = (insn_slot *) meth->prepared;
@@ -1102,6 +1092,19 @@
#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 +3869,13 @@
}
}
+#ifdef DIRECT_THREADED
+void
+_Jv_CompileMethod (_Jv_InterpMethod* method)
+{
+ if (method->prepared == NULL)
+ _Jv_InterpMethod::run (NULL, NULL, method);
+}
+#endif // DIRECT_THREADED
+
#endif // INTERPRETER