--- a/hotspot/src/os/windows/vm/os_windows.cpp Thu Jul 04 04:03:28 2013 -0700
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Thu Jul 04 21:10:17 2013 -0700
@@ -1420,34 +1420,40 @@
bool os::dll_address_to_library_name(address addr, char* buf,
int buflen, int* offset) {
+ // buf is not optional, but offset is optional
+ assert(buf != NULL, "sanity check");
+
// NOTE: the reason we don't use SymGetModuleInfo() is it doesn't always
// return the full path to the DLL file, sometimes it returns path
// to the corresponding PDB file (debug info); sometimes it only
// returns partial path, which makes life painful.
- struct _modinfo mi;
- mi.addr = addr;
- mi.full_path = buf;
- mi.buflen = buflen;
- int pid = os::current_process_id();
- if (enumerate_modules(pid, _locate_module_by_addr, (void *)&mi)) {
- // buf already contains path name
- if (offset) *offset = addr - mi.base_addr;
- return true;
- } else {
- if (buf) buf[0] = '\0';
- if (offset) *offset = -1;
- return false;
- }
+ struct _modinfo mi;
+ mi.addr = addr;
+ mi.full_path = buf;
+ mi.buflen = buflen;
+ int pid = os::current_process_id();
+ if (enumerate_modules(pid, _locate_module_by_addr, (void *)&mi)) {
+ // buf already contains path name
+ if (offset) *offset = addr - mi.base_addr;
+ return true;
+ }
+
+ buf[0] = '\0';
+ if (offset) *offset = -1;
+ return false;
}
bool os::dll_address_to_function_name(address addr, char *buf,
int buflen, int *offset) {
+ // buf is not optional, but offset is optional
+ assert(buf != NULL, "sanity check");
+
if (Decoder::decode(addr, buf, buflen, offset)) {
return true;
}
if (offset != NULL) *offset = -1;
- if (buf != NULL) buf[0] = '\0';
+ buf[0] = '\0';
return false;
}
@@ -2689,6 +2695,19 @@
}
#endif
+#ifndef PRODUCT
+void os::win32::call_test_func_with_wrapper(void (*funcPtr)(void)) {
+ // Install a win32 structured exception handler around the test
+ // function call so the VM can generate an error dump if needed.
+ __try {
+ (*funcPtr)();
+ } __except(topLevelExceptionFilter(
+ (_EXCEPTION_POINTERS*)_exception_info())) {
+ // Nothing to do.
+ }
+}
+#endif
+
// Virtual Memory
int os::vm_page_size() { return os::win32::vm_page_size(); }