hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
changeset 8076 96d498ec7ae1
parent 7915 c726d9cdeb6e
child 8107 78e5bd944384
equal deleted inserted replaced
8075:582dd25571b2 8076:96d498ec7ae1
    37 #include "oops/cpCacheOop.hpp"
    37 #include "oops/cpCacheOop.hpp"
    38 #include "oops/instanceKlass.hpp"
    38 #include "oops/instanceKlass.hpp"
    39 #include "oops/methodDataOop.hpp"
    39 #include "oops/methodDataOop.hpp"
    40 #include "oops/objArrayKlass.hpp"
    40 #include "oops/objArrayKlass.hpp"
    41 #include "oops/oop.inline.hpp"
    41 #include "oops/oop.inline.hpp"
    42 #include "oops/symbolOop.hpp"
    42 #include "oops/symbol.hpp"
    43 #include "prims/jvmtiExport.hpp"
    43 #include "prims/jvmtiExport.hpp"
    44 #include "prims/nativeLookup.hpp"
    44 #include "prims/nativeLookup.hpp"
    45 #include "runtime/biasedLocking.hpp"
    45 #include "runtime/biasedLocking.hpp"
    46 #include "runtime/compilationPolicy.hpp"
    46 #include "runtime/compilationPolicy.hpp"
    47 #include "runtime/deoptimization.hpp"
    47 #include "runtime/deoptimization.hpp"
   293 IRT_END
   293 IRT_END
   294 
   294 
   295 
   295 
   296 IRT_ENTRY(void, InterpreterRuntime::create_exception(JavaThread* thread, char* name, char* message))
   296 IRT_ENTRY(void, InterpreterRuntime::create_exception(JavaThread* thread, char* name, char* message))
   297   // lookup exception klass
   297   // lookup exception klass
   298   symbolHandle s = oopFactory::new_symbol_handle(name, CHECK);
   298   TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
   299   if (ProfileTraps) {
   299   if (ProfileTraps) {
   300     if (s == vmSymbols::java_lang_ArithmeticException()) {
   300     if (s == vmSymbols::java_lang_ArithmeticException()) {
   301       note_trap(thread, Deoptimization::Reason_div0_check, CHECK);
   301       note_trap(thread, Deoptimization::Reason_div0_check, CHECK);
   302     } else if (s == vmSymbols::java_lang_NullPointerException()) {
   302     } else if (s == vmSymbols::java_lang_NullPointerException()) {
   303       note_trap(thread, Deoptimization::Reason_null_check, CHECK);
   303       note_trap(thread, Deoptimization::Reason_null_check, CHECK);
   304     }
   304     }
   305   }
   305   }
   306   // create exception
   306   // create exception
   307   Handle exception = Exceptions::new_exception(thread, s(), message);
   307   Handle exception = Exceptions::new_exception(thread, s, message);
   308   thread->set_vm_result(exception());
   308   thread->set_vm_result(exception());
   309 IRT_END
   309 IRT_END
   310 
   310 
   311 
   311 
   312 IRT_ENTRY(void, InterpreterRuntime::create_klass_exception(JavaThread* thread, char* name, oopDesc* obj))
   312 IRT_ENTRY(void, InterpreterRuntime::create_klass_exception(JavaThread* thread, char* name, oopDesc* obj))
   313   ResourceMark rm(thread);
   313   ResourceMark rm(thread);
   314   const char* klass_name = Klass::cast(obj->klass())->external_name();
   314   const char* klass_name = Klass::cast(obj->klass())->external_name();
   315   // lookup exception klass
   315   // lookup exception klass
   316   symbolHandle s = oopFactory::new_symbol_handle(name, CHECK);
   316   TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
   317   if (ProfileTraps) {
   317   if (ProfileTraps) {
   318     note_trap(thread, Deoptimization::Reason_class_check, CHECK);
   318     note_trap(thread, Deoptimization::Reason_class_check, CHECK);
   319   }
   319   }
   320   // create exception, with klass name as detail message
   320   // create exception, with klass name as detail message
   321   Handle exception = Exceptions::new_exception(thread, s(), klass_name);
   321   Handle exception = Exceptions::new_exception(thread, s, klass_name);
   322   thread->set_vm_result(exception());
   322   thread->set_vm_result(exception());
   323 IRT_END
   323 IRT_END
   324 
   324 
   325 
   325 
   326 IRT_ENTRY(void, InterpreterRuntime::throw_ArrayIndexOutOfBoundsException(JavaThread* thread, char* name, jint index))
   326 IRT_ENTRY(void, InterpreterRuntime::throw_ArrayIndexOutOfBoundsException(JavaThread* thread, char* name, jint index))
   327   char message[jintAsStringSize];
   327   char message[jintAsStringSize];
   328   // lookup exception klass
   328   // lookup exception klass
   329   symbolHandle s = oopFactory::new_symbol_handle(name, CHECK);
   329   TempNewSymbol s = SymbolTable::new_symbol(name, CHECK);
   330   if (ProfileTraps) {
   330   if (ProfileTraps) {
   331     note_trap(thread, Deoptimization::Reason_range_check, CHECK);
   331     note_trap(thread, Deoptimization::Reason_range_check, CHECK);
   332   }
   332   }
   333   // create exception
   333   // create exception
   334   sprintf(message, "%d", index);
   334   sprintf(message, "%d", index);
   335   THROW_MSG(s(), message);
   335   THROW_MSG(s, message);
   336 IRT_END
   336 IRT_END
   337 
   337 
   338 IRT_ENTRY(void, InterpreterRuntime::throw_ClassCastException(
   338 IRT_ENTRY(void, InterpreterRuntime::throw_ClassCastException(
   339   JavaThread* thread, oopDesc* obj))
   339   JavaThread* thread, oopDesc* obj))
   340 
   340 
   671   Handle receiver(thread, NULL);
   671   Handle receiver(thread, NULL);
   672   if (bytecode == Bytecodes::_invokevirtual || bytecode == Bytecodes::_invokeinterface) {
   672   if (bytecode == Bytecodes::_invokevirtual || bytecode == Bytecodes::_invokeinterface) {
   673     ResourceMark rm(thread);
   673     ResourceMark rm(thread);
   674     methodHandle m (thread, method(thread));
   674     methodHandle m (thread, method(thread));
   675     Bytecode_invoke call(m, bci(thread));
   675     Bytecode_invoke call(m, bci(thread));
   676     symbolHandle signature (thread, call.signature());
   676     Symbol* signature = call.signature();
   677     receiver = Handle(thread,
   677     receiver = Handle(thread,
   678                   thread->last_frame().interpreter_callee_receiver(signature));
   678                   thread->last_frame().interpreter_callee_receiver(signature));
   679     assert(Universe::heap()->is_in_reserved_or_null(receiver()),
   679     assert(Universe::heap()->is_in_reserved_or_null(receiver()),
   680            "sanity check");
   680            "sanity check");
   681     assert(receiver.is_null() ||
   681     assert(receiver.is_null() ||
   795 
   795 
   796   // Short circuit if CallSite has been bound already:
   796   // Short circuit if CallSite has been bound already:
   797   if (!pool->cache()->secondary_entry_at(site_index)->is_f1_null())
   797   if (!pool->cache()->secondary_entry_at(site_index)->is_f1_null())
   798     return;
   798     return;
   799 
   799 
   800   symbolHandle call_site_name(THREAD, pool->name_ref_at(site_index));
   800   Symbol*  call_site_name = pool->name_ref_at(site_index);
   801 
   801 
   802   Handle call_site
   802   Handle call_site
   803     = SystemDictionary::make_dynamic_call_site(bootm,
   803     = SystemDictionary::make_dynamic_call_site(bootm,
   804                                                // Callee information:
   804                                                // Callee information:
   805                                                call_site_name,
   805                                                call_site_name,