diff options
author | Keith Seitz <keiths@redhat.com> | 2006-01-18 21:52:45 +0000 |
---|---|---|
committer | Keith Seitz <kseitz@gcc.gnu.org> | 2006-01-18 21:52:45 +0000 |
commit | d0f4aa53e0b42986c8de41ddba304516169a6cc7 (patch) | |
tree | 780f9c54ac5cfe5ef734495b62563e4e2b4f0cdc /libjava/interpret.cc | |
parent | a56e0baa694476ef6fcd90d27e18cec8ebbbe8db (diff) | |
download | gcc-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.cc | 44 |
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 |