< prev index next >

src/hotspot/os/windows/os_windows.cpp


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         }
< prev index next >