2491 address stub = SharedRuntime::get_poll_stub(pc);
2492 return Handle_Exception(exceptionInfo, stub);
2493 }
2494 }
2495 {
2496 #ifdef _WIN64
2497 // If it's a legal stack address map the entire region in
2498 //
2499 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2500 address addr = (address) exceptionRecord->ExceptionInformation[1];
2501 if (addr > thread->stack_reserved_zone_base() && addr < thread->stack_base()) {
2502 addr = (address)((uintptr_t)addr &
2503 (~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
2504 os::commit_memory((char *)addr, thread->stack_base() - addr,
2505 !ExecMem);
2506 return EXCEPTION_CONTINUE_EXECUTION;
2507 } else
2508 #endif
2509 {
2510 // Null pointer exception.
2511 if (!MacroAssembler::needs_explicit_null_check((intptr_t)addr)) {
2512 address stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
2513 if (stub != NULL) return Handle_Exception(exceptionInfo, stub);
2514 }
2515 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2516 exceptionInfo->ContextRecord);
2517 return EXCEPTION_CONTINUE_SEARCH;
2518 }
2519 }
2520 }
2521
2522 #ifdef _WIN64
2523 // Special care for fast JNI field accessors.
2524 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks
2525 // in and the heap gets shrunk before the field access.
2526 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2527 address addr = JNI_FastGetField::find_slowcase_pc(pc);
2528 if (addr != (address)-1) {
2529 return Handle_Exception(exceptionInfo, addr);
2530 }
|
2491 address stub = SharedRuntime::get_poll_stub(pc);
2492 return Handle_Exception(exceptionInfo, stub);
2493 }
2494 }
2495 {
2496 #ifdef _WIN64
2497 // If it's a legal stack address map the entire region in
2498 //
2499 PEXCEPTION_RECORD exceptionRecord = exceptionInfo->ExceptionRecord;
2500 address addr = (address) exceptionRecord->ExceptionInformation[1];
2501 if (addr > thread->stack_reserved_zone_base() && addr < thread->stack_base()) {
2502 addr = (address)((uintptr_t)addr &
2503 (~((uintptr_t)os::vm_page_size() - (uintptr_t)1)));
2504 os::commit_memory((char *)addr, thread->stack_base() - addr,
2505 !ExecMem);
2506 return EXCEPTION_CONTINUE_EXECUTION;
2507 } else
2508 #endif
2509 {
2510 // Null pointer exception.
2511 if (MacroAssembler::uses_implicit_null_check((void*)addr)) {
2512 address stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
2513 if (stub != NULL) return Handle_Exception(exceptionInfo, stub);
2514 }
2515 report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2516 exceptionInfo->ContextRecord);
2517 return EXCEPTION_CONTINUE_SEARCH;
2518 }
2519 }
2520 }
2521
2522 #ifdef _WIN64
2523 // Special care for fast JNI field accessors.
2524 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks
2525 // in and the heap gets shrunk before the field access.
2526 if (exception_code == EXCEPTION_ACCESS_VIOLATION) {
2527 address addr = JNI_FastGetField::find_slowcase_pc(pc);
2528 if (addr != (address)-1) {
2529 return Handle_Exception(exceptionInfo, addr);
2530 }
|