Mercurial > hg > graal-compiler
diff src/share/vm/prims/jni.cpp @ 5747:120820e30baa
added basic high-level interpreter support to HotSpot
author | Christian Haeubl <haeubl@ssw.jku.at> |
---|---|
date | Tue, 03 Jul 2012 16:56:40 +0200 |
parents | 33df1aeaebbf |
children | 957c266d8bc5 |
line wrap: on
line diff
--- a/src/share/vm/prims/jni.cpp Tue Jul 03 15:00:23 2012 +0200 +++ b/src/share/vm/prims/jni.cpp Tue Jul 03 16:56:40 2012 +0200 @@ -32,6 +32,9 @@ #ifdef GRAAL #include "graal/graalCompiler.hpp" #endif +#ifdef HIGH_LEVEL_INTERPRETER +#include "graal/graalVMToInterpreter.hpp" +#endif #ifndef SERIALGC #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" #endif // SERIALGC @@ -1317,6 +1320,7 @@ } +static bool first_time_InvokeMain = true; static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) { methodHandle method(THREAD, JNIHandles::resolve_jmethod_id(method_id)); @@ -1325,6 +1329,8 @@ // the jni parser ResourceMark rm(THREAD); int number_of_parameters = method->size_of_parameters(); + + // Invoke the method. Result is returned as oop. JavaCallArguments java_args(number_of_parameters); args->set_java_argument_object(&java_args); @@ -1332,16 +1338,35 @@ // Fill out JavaCallArguments object args->iterate( Fingerprinter(method).fingerprint() ); - // Initialize result type + // Initialize result type (must be done after args->iterate()) result->set_type(args->get_ret_type()); - // Invoke the method. Result is returned as oop. +#ifdef HIGH_LEVEL_INTERPRETER + // TODO (chaeubl): this is quite a hack. The launcher should take care about that instead. + bool invoked_main_method = false; + if (HighLevelInterpreterClass != NULL && first_time_InvokeMain && method->name() == vmSymbols::main_name() && method->result_type() == T_VOID) { + assert(THREAD->is_Java_thread(), "other threads must not call into java"); + JavaThread* thread = (JavaThread*)THREAD; + first_time_InvokeMain = false; + invoked_main_method = true; + thread->set_high_level_interpreter_in_vm(true); + } +#endif + JavaCalls::call(result, method, &java_args, CHECK); // Convert result if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) { result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject())); } + +#ifdef HIGH_LEVEL_INTERPRETER + if (invoked_main_method) { + assert(THREAD->is_Java_thread(), "other threads must not call into java"); + JavaThread* thread = (JavaThread*)THREAD; + thread->set_high_level_interpreter_in_vm(false); + } +#endif } @@ -5144,6 +5169,16 @@ compiler->initialize(); #endif +#ifdef HIGH_LEVEL_INTERPRETER + if (HighLevelInterpreterClass != NULL) { + bool result = VMToInterpreter::allocate_interpreter(HighLevelInterpreterClass, HighLevelInterpreterArguments, thread); + if (!result) { + vm_abort(false); + return JNI_ERR; + } + } +#endif + // Tracks the time application was running before GC RuntimeService::record_application_start();