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();