| Index: src/platform-win32.cc
 | 
| diff --git a/src/platform-win32.cc b/src/platform-win32.cc
 | 
| index ea4f7ea11f4177bdbee4f5de2dca570e50985741..073b21a011aae732b7db5dc15ca3b18c85e3858b 100644
 | 
| --- a/src/platform-win32.cc
 | 
| +++ b/src/platform-win32.cc
 | 
| @@ -1208,133 +1208,9 @@ void OS::SignalCodeMovingGC() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -// Walk the stack using the facilities in dbghelp.dll and tlhelp32.dll
 | 
| -
 | 
| -// Switch off warning 4748 (/GS can not protect parameters and local variables
 | 
| -// from local buffer overrun because optimizations are disabled in function) as
 | 
| -// it is triggered by the use of inline assembler.
 | 
| -#pragma warning(push)
 | 
| -#pragma warning(disable : 4748)
 | 
| -int OS::StackWalk(Vector<OS::StackFrame> frames) {
 | 
| -  BOOL ok;
 | 
| -
 | 
| -  // Load the required functions from DLL's.
 | 
| -  if (!LoadDbgHelpAndTlHelp32()) return kStackWalkError;
 | 
| -
 | 
| -  // Get the process and thread handles.
 | 
| -  HANDLE process_handle = GetCurrentProcess();
 | 
| -  HANDLE thread_handle = GetCurrentThread();
 | 
| -
 | 
| -  // Read the symbols.
 | 
| -  if (!LoadSymbols(Isolate::Current(), process_handle)) return kStackWalkError;
 | 
| -
 | 
| -  // Capture current context.
 | 
| -  CONTEXT context;
 | 
| -  RtlCaptureContext(&context);
 | 
| -
 | 
| -  // Initialize the stack walking
 | 
| -  STACKFRAME64 stack_frame;
 | 
| -  memset(&stack_frame, 0, sizeof(stack_frame));
 | 
| -#ifdef  _WIN64
 | 
| -  stack_frame.AddrPC.Offset = context.Rip;
 | 
| -  stack_frame.AddrFrame.Offset = context.Rbp;
 | 
| -  stack_frame.AddrStack.Offset = context.Rsp;
 | 
| -#else
 | 
| -  stack_frame.AddrPC.Offset = context.Eip;
 | 
| -  stack_frame.AddrFrame.Offset = context.Ebp;
 | 
| -  stack_frame.AddrStack.Offset = context.Esp;
 | 
| -#endif
 | 
| -  stack_frame.AddrPC.Mode = AddrModeFlat;
 | 
| -  stack_frame.AddrFrame.Mode = AddrModeFlat;
 | 
| -  stack_frame.AddrStack.Mode = AddrModeFlat;
 | 
| -  int frames_count = 0;
 | 
| -
 | 
| -  // Collect stack frames.
 | 
| -  int frames_size = frames.length();
 | 
| -  while (frames_count < frames_size) {
 | 
| -    ok = _StackWalk64(
 | 
| -        IMAGE_FILE_MACHINE_I386,    // MachineType
 | 
| -        process_handle,             // hProcess
 | 
| -        thread_handle,              // hThread
 | 
| -        &stack_frame,               // StackFrame
 | 
| -        &context,                   // ContextRecord
 | 
| -        NULL,                       // ReadMemoryRoutine
 | 
| -        _SymFunctionTableAccess64,  // FunctionTableAccessRoutine
 | 
| -        _SymGetModuleBase64,        // GetModuleBaseRoutine
 | 
| -        NULL);                      // TranslateAddress
 | 
| -    if (!ok) break;
 | 
| -
 | 
| -    // Store the address.
 | 
| -    ASSERT((stack_frame.AddrPC.Offset >> 32) == 0);  // 32-bit address.
 | 
| -    frames[frames_count].address =
 | 
| -        reinterpret_cast<void*>(stack_frame.AddrPC.Offset);
 | 
| -
 | 
| -    // Try to locate a symbol for this frame.
 | 
| -    DWORD64 symbol_displacement;
 | 
| -    SmartArrayPointer<IMAGEHLP_SYMBOL64> symbol(
 | 
| -        NewArray<IMAGEHLP_SYMBOL64>(kStackWalkMaxNameLen));
 | 
| -    if (symbol.is_empty()) return kStackWalkError;  // Out of memory.
 | 
| -    memset(*symbol, 0, sizeof(IMAGEHLP_SYMBOL64) + kStackWalkMaxNameLen);
 | 
| -    (*symbol)->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
 | 
| -    (*symbol)->MaxNameLength = kStackWalkMaxNameLen;
 | 
| -    ok = _SymGetSymFromAddr64(process_handle,             // hProcess
 | 
| -                              stack_frame.AddrPC.Offset,  // Address
 | 
| -                              &symbol_displacement,       // Displacement
 | 
| -                              *symbol);                   // Symbol
 | 
| -    if (ok) {
 | 
| -      // Try to locate more source information for the symbol.
 | 
| -      IMAGEHLP_LINE64 Line;
 | 
| -      memset(&Line, 0, sizeof(Line));
 | 
| -      Line.SizeOfStruct = sizeof(Line);
 | 
| -      DWORD line_displacement;
 | 
| -      ok = _SymGetLineFromAddr64(
 | 
| -          process_handle,             // hProcess
 | 
| -          stack_frame.AddrPC.Offset,  // dwAddr
 | 
| -          &line_displacement,         // pdwDisplacement
 | 
| -          &Line);                     // Line
 | 
| -      // Format a text representation of the frame based on the information
 | 
| -      // available.
 | 
| -      if (ok) {
 | 
| -        SNPrintF(MutableCStrVector(frames[frames_count].text,
 | 
| -                                   kStackWalkMaxTextLen),
 | 
| -                 "%s %s:%d:%d",
 | 
| -                 (*symbol)->Name, Line.FileName, Line.LineNumber,
 | 
| -                 line_displacement);
 | 
| -      } else {
 | 
| -        SNPrintF(MutableCStrVector(frames[frames_count].text,
 | 
| -                                   kStackWalkMaxTextLen),
 | 
| -                 "%s",
 | 
| -                 (*symbol)->Name);
 | 
| -      }
 | 
| -      // Make sure line termination is in place.
 | 
| -      frames[frames_count].text[kStackWalkMaxTextLen - 1] = '\0';
 | 
| -    } else {
 | 
| -      // No text representation of this frame
 | 
| -      frames[frames_count].text[0] = '\0';
 | 
| -
 | 
| -      // Continue if we are just missing a module (for non C/C++ frames a
 | 
| -      // module will never be found).
 | 
| -      int err = GetLastError();
 | 
| -      if (err != ERROR_MOD_NOT_FOUND) {
 | 
| -        break;
 | 
| -      }
 | 
| -    }
 | 
| -
 | 
| -    frames_count++;
 | 
| -  }
 | 
| -
 | 
| -  // Return the number of frames filled in.
 | 
| -  return frames_count;
 | 
| -}
 | 
| -
 | 
| -
 | 
| -// Restore warnings to previous settings.
 | 
| -#pragma warning(pop)
 | 
| -
 | 
|  #else  // __MINGW32__
 | 
|  void OS::LogSharedLibraryAddresses(Isolate* isolate) { }
 | 
|  void OS::SignalCodeMovingGC() { }
 | 
| -int OS::StackWalk(Vector<OS::StackFrame> frames) { return 0; }
 | 
|  #endif  // __MINGW32__
 | 
|  
 | 
|  
 | 
| 
 |