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