diff options
author | isaacs <i@izs.me> | 2012-07-17 11:43:02 -0700 |
---|---|---|
committer | isaacs <i@izs.me> | 2012-07-17 11:43:02 -0700 |
commit | a0a0062d612cf76f8161af3be7896bd15a2682a1 (patch) | |
tree | a3ac545b74eb5da2b12fbbb334a2735181955fa7 /deps/v8/test/cctest/test-debug.cc | |
parent | 7397ab2cf13555a9f0aa3ccc50f9e76fc54fdcec (diff) | |
download | node-new-a0a0062d612cf76f8161af3be7896bd15a2682a1.tar.gz |
v8: upgrade to 3.11.10.15
Diffstat (limited to 'deps/v8/test/cctest/test-debug.cc')
-rw-r--r-- | deps/v8/test/cctest/test-debug.cc | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/deps/v8/test/cctest/test-debug.cc b/deps/v8/test/cctest/test-debug.cc index e40f406c3c..166b762913 100644 --- a/deps/v8/test/cctest/test-debug.cc +++ b/deps/v8/test/cctest/test-debug.cc @@ -7350,4 +7350,47 @@ TEST(DebugBreakInline) { } +static void DebugEventStepNext(v8::DebugEvent event, + v8::Handle<v8::Object> exec_state, + v8::Handle<v8::Object> event_data, + v8::Handle<v8::Value> data) { + if (event == v8::Break) { + PrepareStep(StepNext); + } +} + + +static void RunScriptInANewCFrame(const char* source) { + v8::TryCatch try_catch; + CompileRun(source); + CHECK(try_catch.HasCaught()); +} + + +TEST(Regress131642) { + // Bug description: + // When doing StepNext through the first script, the debugger is not reset + // after exiting through exception. A flawed implementation enabling the + // debugger to step into Array.prototype.forEach breaks inside the callback + // for forEach in the second script under the assumption that we are in a + // recursive call. In an attempt to step out, we crawl the stack using the + // recorded frame pointer from the first script and fail when not finding it + // on the stack. + v8::HandleScope scope; + DebugLocalContext env; + v8::Debug::SetDebugEventListener(DebugEventStepNext); + + // We step through the first script. It exits through an exception. We run + // this inside a new frame to record a different FP than the second script + // would expect. + const char* script_1 = "debugger; throw new Error();"; + RunScriptInANewCFrame(script_1); + + // The second script uses forEach. + const char* script_2 = "[0].forEach(function() { });"; + CompileRun(script_2); + + v8::Debug::SetDebugEventListener(NULL); +} + #endif // ENABLE_DEBUGGER_SUPPORT |