# HG changeset patch # User Thomas Wuerthinger # Date 1273598654 -7200 # Node ID 09e7826ecf01d3528220f7604c4a225d520a5eca # Parent 35069ca331f2ecc6c8299ceac57d04c8c0484073 Can now call to Java code from the VM. Need to specify a JAR file with the classes from the Maxine subprojects C1X, CRI, and HotSpotVM in the bootclasspath. See HotSpotVM/README.txt in the Maxine sources for details. diff -r 35069ca331f2 -r 09e7826ecf01 src/share/vm/c1x/c1x_Compiler.cpp --- a/src/share/vm/c1x/c1x_Compiler.cpp Tue May 11 18:19:17 2010 +0200 +++ b/src/share/vm/c1x/c1x_Compiler.cpp Tue May 11 19:24:14 2010 +0200 @@ -34,15 +34,32 @@ // Compilation entry point for methods void C1XCompiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci) { - + VM_ENTRY_MARK; + ResourceMark rm; HandleMark hm; TRACE_C1X_1("compile_method"); - methodOop method = (methodOop)target->get_oop(); - methodHandle m(Thread::current(), method); - TRACE_C1X_1("name = %s", m->name_and_sig_as_C_string()); + methodHandle method(Thread::current(), (methodOop)target->get_oop()); + TRACE_C1X_1("name = %s", method->name_and_sig_as_C_string()); + + JavaValue result(T_VOID); + symbolHandle syKlass = oopFactory::new_symbol("com/sun/hotspot/c1x/VMExits", CHECK); + + + Handle nullh; + KlassHandle k = SystemDictionary::resolve_or_null(syKlass, nullh, nullh, CHECK); + if (k.is_null()) { + tty->print_cr("not found"); + return;//fatal("Could not find class com.sun.hotspot.c1x.VMExits"); + } + symbolHandle syName = oopFactory::new_symbol("compileMethod", CHECK); + symbolHandle sySig = oopFactory::new_symbol("(Lcom/sun/cri/ri/RiMethod;I)V", CHECK); + JavaCallArguments args; + args.push_oop(method()); + args.push_int(entry_bci); + JavaCalls::call_static(&result, k, syName, sySig, &args, CHECK); } // Print compilation timers and statistics diff -r 35069ca331f2 -r 09e7826ecf01 src/share/vm/classfile/systemDictionary.cpp --- a/src/share/vm/classfile/systemDictionary.cpp Tue May 11 18:19:17 2010 +0200 +++ b/src/share/vm/classfile/systemDictionary.cpp Tue May 11 19:24:14 2010 +0200 @@ -161,7 +161,8 @@ // Forwards to resolve_instance_class_or_null klassOop SystemDictionary::resolve_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS) { - assert(!THREAD->is_Compiler_thread(), "Can not load classes with the Compiler thread"); + // (tw) May we do this? + // assert(!THREAD->is_Compiler_thread(), "Can not load classes with the Compiler thread"); if (FieldType::is_array(class_name())) { return resolve_array_class_or_null(class_name, class_loader, protection_domain, CHECK_NULL); } else { diff -r 35069ca331f2 -r 09e7826ecf01 src/share/vm/runtime/javaCalls.cpp --- a/src/share/vm/runtime/javaCalls.cpp Tue May 11 18:19:17 2010 +0200 +++ b/src/share/vm/runtime/javaCalls.cpp Tue May 11 19:24:14 2010 +0200 @@ -34,7 +34,8 @@ guarantee(thread->is_Java_thread(), "crucial check - the VM thread cannot and must not escape to Java code"); assert(!thread->owns_locks(), "must release all locks when leaving VM"); - guarantee(!thread->is_Compiler_thread(), "cannot make java calls from the compiler"); + // (tw) may we do this? + // guarantee(!thread->is_Compiler_thread(), "cannot make java calls from the compiler"); _result = result; // Allocate handle block for Java code. This must be done before we change thread_state to _thread_in_Java_or_stub, @@ -328,7 +329,8 @@ #endif - assert(!thread->is_Compiler_thread(), "cannot compile from the compiler"); + // (tw) may we do this? + //assert(!thread->is_Compiler_thread(), "cannot compile from the compiler"); if (CompilationPolicy::mustBeCompiled(method)) { CompileBroker::compile_method(method, InvocationEntryBci, methodHandle(), 0, "mustBeCompiled", CHECK);