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
This commit is contained in:
Keith Seitz 2006-01-18 21:52:45 +00:00 committed by Keith Seitz
parent a56e0baa69
commit d0f4aa53e0
3 changed files with 45 additions and 15 deletions

View File

@ -1,3 +1,12 @@
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.
2006-01-18 H.J. Lu <hongjiu.lu@intel.com>
PR libgcj/25840

View File

@ -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 @@ void * _Jv_AllocMethodInvocation (jsize size);
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 @@ class _Jv_InterpMethod : public _Jv_MethodBase
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;

View File

@ -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