<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[206653] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/206653">206653</a></dd>
<dt>Author</dt> <dd>joepeck@webkit.org</dd>
<dt>Date</dt> <dd>2016-09-30 12:22:50 -0700 (Fri, 30 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Breakpoints on blank lines or comments don't break
https://bugs.webkit.org/show_bug.cgi?id=9885
&lt;rdar://problem/6134406&gt;

Reviewed by Mark Lam.

Source/JavaScriptCore:

This change introduces a way to perform a Debugger Parse of a script.
This debugger parse gathers a list of breakpoint locations, which
the backend uses to resolve breakpoint locations that came from the
Inspector frontend to the exact location we would actually pause.
We gather this information from the parser so that we can eagerly
get this information without requiring the code to have executed (the
real op_debugs are generated during bytecode generation when code
is actually evaluated).

If an input location was on a line with whitespace or a comment, the
resolved breakpoint location would be before the next statement that
will be executed. That may be the next line, or even later. We also
update our policy when setting breakpoints on and around function
statements to better match user expectations.

For example, when resolving breakpoints in:

    1.  // Comment
    2.  before;
    3.
    4.  function foo() {
    5.      inside;
    6.  }
    7.
    8.  after;

A breakpoint on line 1, a comment, resolves to line 2 the next
statement that will execute.

A breakpoint on line 3 or 7, empty lines, resolves to line 8 the next
statement that will execute. This skips past the definition of foo,
just like stepping would have done. The creation of foo would have
been hoisted, which would have happened before execution of the
other statements.

A breakpoint on line 4, a function signature, resolves to line 5,
inside the function. Users would expect to pause inside of a function
when setting a breakpoint on that function's name or opening brace.

A breakpoint on line 6, a function's closing brace, resolves to
line 6. The debugger will pause whenever execution leaves foo due to
a return and not an exception. This matches stepping behavior. An
explicit or implicit return (the implicit return undefined) will
pause on the closing brace as we leave the function, giving users
an opportunity to inspect the final state before leaving.

--

At this point, op_debug's are still emitted at custom locations during
bytecode generation of other statements / expressions. In order to
ensure the generated op_debugs correspond to locations the Parser
determined were breakpoint locations, the Parser sets a &quot;needs debug
hook&quot; flag on the nodes it will use for breakpoint locations, and
we assert during bytecode generation that op_debugs are only emitted
for nodes that were marked as needing debug hooks.

This still leaves open the possibility that the Parser will mark
some nodes that get missed during bytecode generation, so we might
fail to emit some op_debugs. The next step will be eliminating the
custom emitDebugHooks spread across StatementNode and ExpressionNode
subclasses, and instead always generating op_debugs whenever we
emit a flagged node.

--

* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
New DebuggerParseData files.

* API/JSScriptRef.cpp:
(OpaqueJSScript::OpaqueJSScript):
* jsc.cpp:
(functionCheckModuleSyntax):
* parser/SourceCode.h:
(JSC::makeSource):
* parser/SourceProvider.cpp:
(JSC::SourceProvider::SourceProvider):
* parser/SourceProvider.h:
(JSC::SourceProvider::sourceType):
(JSC::StringSourceProvider::create):
(JSC::StringSourceProvider::StringSourceProvider):
(JSC::WebAssemblySourceProvider::WebAssemblySourceProvider):
(JSC::SourceProvider::startPosition): Deleted.
Add a new type on SourceProvider to distinguish if its script was
intended to be a Script, Module, or WebAssembly. This information
will be needed to know how to best parse this file when the
debugger decides to lazily parse.

* runtime/Executable.cpp:
(JSC::EvalExecutable::EvalExecutable):
(JSC::ProgramExecutable::ProgramExecutable):
(JSC::ModuleProgramExecutable::ModuleProgramExecutable):
(JSC::WebAssemblyExecutable::WebAssemblyExecutable):
* runtime/ModuleLoaderPrototype.cpp:
(JSC::moduleLoaderPrototypeParseModule):
ASSERT the SourceProvider type matches the executable type we are
creating for it.

* parser/ASTBuilder.h:
(JSC::ASTBuilder::breakpointLocation):
* parser/SyntaxChecker.h:
(JSC::SyntaxChecker::operatorStackPop):
When gathering breakpoint positions, get the position from the
current node. In the SyntaxChecker, return an invalid position.

* parser/Nodes.h:
(JSC::ExpressionNode::needsDebugHook):
(JSC::ExpressionNode::setNeedsDebugHook):
(JSC::StatementNode::needsDebugHook):
(JSC::StatementNode::setNeedsDebugHook):
When gathering breakpoint positions, mark the node as needing
a debug hook. For now we assert op_debugs generated must come
from these nodes. Later we should just generate op_debugs for
these nodes.

* parser/Parser.cpp:
(JSC::Parser&lt;LexerType&gt;::Parser):
(JSC::Parser&lt;LexerType&gt;::parseStatementListItem):
(JSC::Parser&lt;LexerType&gt;::parseDoWhileStatement):
(JSC::Parser&lt;LexerType&gt;::parseWhileStatement):
(JSC::Parser&lt;LexerType&gt;::parseArrowFunctionSingleExpressionBodySourceElements):
(JSC::Parser&lt;LexerType&gt;::parseForStatement):
(JSC::Parser&lt;LexerType&gt;::parseWithStatement):
(JSC::Parser&lt;LexerType&gt;::parseSwitchStatement):
(JSC::Parser&lt;LexerType&gt;::parseStatement):
(JSC::Parser&lt;LexerType&gt;::parseFunctionBody):
(JSC::Parser&lt;LexerType&gt;::parseFunctionInfo):
(JSC::Parser&lt;LexerType&gt;::parseIfStatement):
(JSC::Parser&lt;LexerType&gt;::parseAssignmentExpression):
* parser/Parser.h:
(JSC::parse):
Add an optional DebuggerParseData struct to the Parser. When available
the Parser will gather debugger data, and parse all functions with the
ASTBuilder instead of SyntaxChecking inner functions.

* debugger/DebuggerParseData.cpp: Added.
(JSC::DebuggerPausePositions::breakpointLocationForLineColumn):
(JSC::DebuggerPausePositions::sort):
(JSC::gatherDebuggerParseData):
(JSC::gatherDebuggerParseDataForSource):
* debugger/DebuggerParseData.h: Copied from Source/JavaScriptCore/debugger/DebuggerPrimitives.h.
(JSC::DebuggerPausePositions::DebuggerPausePositions):
(JSC::DebuggerPausePositions::appendPause):
(JSC::DebuggerPausePositions::appendEntry):
(JSC::DebuggerPausePositions::appendLeave):
The DebuggerParseData struct currently only contains a list of pause positions.
Once populated it can resolve an input location to a pause position.

* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::emitCall):
(JSC::BytecodeGenerator::emitCallVarargs):
(JSC::BytecodeGenerator::emitDebugHook):
(JSC::BytecodeGenerator::emitEnumeration):
* bytecompiler/BytecodeGenerator.h:
* bytecompiler/NodesCodegen.cpp:
(JSC::EmptyStatementNode::emitBytecode):
(JSC::DebuggerStatementNode::emitBytecode):
(JSC::ExprStatementNode::emitBytecode):
(JSC::DeclarationStatement::emitBytecode):
(JSC::IfElseNode::emitBytecode):
(JSC::DoWhileNode::emitBytecode):
(JSC::WhileNode::emitBytecode):
(JSC::ForNode::emitBytecode):
(JSC::ForInNode::emitBytecode):
(JSC::ContinueNode::emitBytecode):
(JSC::BreakNode::emitBytecode):
(JSC::ReturnNode::emitBytecode):
(JSC::WithNode::emitBytecode):
(JSC::SwitchNode::emitBytecode):
(JSC::ThrowNode::emitBytecode):
Emit op_debugs for the nodes themselves. Assert when we do that the
Parser had marked them as needing a debug hook.

* debugger/Breakpoint.h:
(JSC::Breakpoint::Breakpoint):
A breakpoint may be resolved or unresolved. Debugger::resolveBreakpoint
must be used to resolve the breakpoint. Most methods now require a
resolved breakpoint.

* debugger/Debugger.h:
* debugger/Debugger.cpp:
(JSC::Debugger::detach):
(JSC::Debugger::toggleBreakpoint):
(JSC::Debugger::debuggerParseData):
(JSC::Debugger::resolveBreakpoint):
(JSC::Debugger::setBreakpoint):
(JSC::Debugger::clearParsedData):
Provide a public method to resolve a breakpoint location in a script.
This will gather debugger parse data for the script if none is available.
Ensure clients have resolved a breakpoint before attempting to set it.
Currently we allow only a single breakpoint at a location. This may
need to change if multiple breakpoints resolve to the same location
but have different actions.

* inspector/ScriptDebugListener.h:
ScriptDebugServer::Script is effectively duplicating most of the data from
a SourceProvider. We should eliminate this and just use SourceProvider.

* inspector/ScriptDebugServer.cpp:
(Inspector::ScriptDebugServer::setBreakpointActions):
(Inspector::ScriptDebugServer::removeBreakpointActions):
(Inspector::ScriptDebugServer::getActionsForBreakpoint):
(Inspector::ScriptDebugServer::clearBreakpointActions):
(Inspector::ScriptDebugServer::evaluateBreakpointAction):
(Inspector::ScriptDebugServer::dispatchDidParseSource):
(Inspector::ScriptDebugServer::handleBreakpointHit):
(Inspector::ScriptDebugServer::setBreakpoint): Deleted.
(Inspector::ScriptDebugServer::removeBreakpoint): Deleted.
(Inspector::ScriptDebugServer::clearBreakpoints): Deleted.
* inspector/ScriptDebugServer.h:
Reduce ScriptDebugServer's involvement in breakpoints to just handling
breakpoint actions. Eventually we should eliminate it alltogether and
fold breakpoint logic into Debugger or DebugAgent.

* inspector/agents/InspectorDebuggerAgent.h:
* inspector/agents/InspectorDebuggerAgent.cpp:
(Inspector::buildDebuggerLocation):
(Inspector::parseLocation):
(Inspector::InspectorDebuggerAgent::setBreakpointByUrl):
(Inspector::InspectorDebuggerAgent::setBreakpoint):
(Inspector::InspectorDebuggerAgent::didSetBreakpoint):
(Inspector::InspectorDebuggerAgent::resolveBreakpoint):
(Inspector::InspectorDebuggerAgent::removeBreakpoint):
(Inspector::InspectorDebuggerAgent::continueToLocation):
(Inspector::InspectorDebuggerAgent::didParseSource):
(Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState):
The Inspector can set breakpoints in multiple ways.
Ensure that once we have the Script that we always
resolve the breakpoint location before setting the
breakpoint. The different paths are:

- setBreakpoint(scriptId, location)
  - Here we know the SourceProvider by its SourceID
    - resolve and set

- setBreakpointByURL(url, location)
  - Search for existing Scripts that match the URL
    - resolve in each and set
  - When new Scripts are parsed that match the URL
    - resolve and set

Source/WebCore:

Tests: inspector/debugger/breakpoints/resolved-dump-all-pause-locations.html
       inspector/debugger/breakpoints/resolved-dump-each-line.html

* bindings/js/CachedScriptSourceProvider.h:
(WebCore::CachedScriptSourceProvider::CachedScriptSourceProvider):

LayoutTests:

* inspector/debugger/breakpoints/resolved-dump-all-pause-locations-expected.txt: Added.
* inspector/debugger/breakpoints/resolved-dump-all-pause-locations.html: Added.
* inspector/debugger/breakpoints/resolved-dump-each-line-expected.txt: Added.
* inspector/debugger/breakpoints/resolved-dump-each-line.html: Added.
* inspector/debugger/breakpoints/resources/dump-functions.js: Added.
* inspector/debugger/breakpoints/resources/dump-general.js: Added.
Test for resolved breakpoint locations in all kinds of different source code.

* inspector/debugger/breakpoints/resources/dump.js: Added.
(TestPage.registerInitializer):
(TestPage.registerInitializer.window.addDumpAllPauseLocationsTestCase):
(TestPage.registerInitializer.window.addDumpEachLinePauseLocationTestCase):
Shared code to run different generalized tests for logging all resolved
breakpoint locations or the resolved breakpoint location if a breakpoint
is set on each individual line.

* inspector/debugger/resources/log-pause-location.js:
(TestPage.registerInitializer.insertCaretIntoStringAtIndex):
(TestPage.registerInitializer.window.findScript):
(TestPage.registerInitializer.window.loadLinesFromSourceCode):
(TestPage.registerInitializer.window.loadMainPageContent):
(TestPage.registerInitializer.window.logResolvedBreakpointLinesWithContext):
(TestPage.registerInitializer.window.logLinesWithContext):
Make some more code shared and provide a way to log two locations,
used to see where a breakpoint was set and where it resolved to.

* inspector/debugger/setBreakpoint-expected.txt:
Update error message. Should not include a period.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsTestExpectations">trunk/LayoutTests/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggerresourceslogpauselocationjs">trunk/LayoutTests/inspector/debugger/resources/log-pause-location.js</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggersetBreakpointexpectedtxt">trunk/LayoutTests/inspector/debugger/setBreakpoint-expected.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreAPIJSScriptRefcpp">trunk/Source/JavaScriptCore/API/JSScriptRef.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorcpp">trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorh">trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecompilerNodesCodegencpp">trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerBreakpointh">trunk/Source/JavaScriptCore/debugger/Breakpoint.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggercpp">trunk/Source/JavaScriptCore/debugger/Debugger.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggerh">trunk/Source/JavaScriptCore/debugger/Debugger.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorScriptDebugListenerh">trunk/Source/JavaScriptCore/inspector/ScriptDebugListener.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorScriptDebugServercpp">trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorScriptDebugServerh">trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgentcpp">trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgenth">trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejsccpp">trunk/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserASTBuilderh">trunk/Source/JavaScriptCore/parser/ASTBuilder.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserNodesh">trunk/Source/JavaScriptCore/parser/Nodes.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserParsercpp">trunk/Source/JavaScriptCore/parser/Parser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserParserh">trunk/Source/JavaScriptCore/parser/Parser.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserSourceCodeh">trunk/Source/JavaScriptCore/parser/SourceCode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserSourceProvidercpp">trunk/Source/JavaScriptCore/parser/SourceProvider.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserSourceProviderh">trunk/Source/JavaScriptCore/parser/SourceProvider.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreparserSyntaxCheckerh">trunk/Source/JavaScriptCore/parser/SyntaxChecker.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeExecutablecpp">trunk/Source/JavaScriptCore/runtime/Executable.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeModuleLoaderPrototypecpp">trunk/Source/JavaScriptCore/runtime/ModuleLoaderPrototype.cpp</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsjsCachedScriptSourceProviderh">trunk/Source/WebCore/bindings/js/CachedScriptSourceProvider.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>trunk/LayoutTests/inspector/debugger/breakpoints/</li>
<li><a href="#trunkLayoutTestsinspectordebuggerbreakpointsresolveddumpallpauselocationsexpectedtxt">trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-all-pause-locations-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggerbreakpointsresolveddumpallpauselocationshtml">trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-all-pause-locations.html</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggerbreakpointsresolveddumpeachlineexpectedtxt">trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-each-line-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggerbreakpointsresolveddumpeachlinehtml">trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-each-line.html</a></li>
<li>trunk/LayoutTests/inspector/debugger/breakpoints/resources/</li>
<li><a href="#trunkLayoutTestsinspectordebuggerbreakpointsresourcesdumpfunctionsjs">trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump-functions.js</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggerbreakpointsresourcesdumpgeneraljs">trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump-general.js</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggerbreakpointsresourcesdumpjs">trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump.js</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggerParseDatacpp">trunk/Source/JavaScriptCore/debugger/DebuggerParseData.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredebuggerDebuggerParseDatah">trunk/Source/JavaScriptCore/debugger/DebuggerParseData.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/LayoutTests/ChangeLog        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -1,5 +1,42 @@
</span><span class="cx"> 2016-09-30  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Breakpoints on blank lines or comments don't break
+        https://bugs.webkit.org/show_bug.cgi?id=9885
+        &lt;rdar://problem/6134406&gt;
+
+        Reviewed by Mark Lam.
+
+        * inspector/debugger/breakpoints/resolved-dump-all-pause-locations-expected.txt: Added.
+        * inspector/debugger/breakpoints/resolved-dump-all-pause-locations.html: Added.
+        * inspector/debugger/breakpoints/resolved-dump-each-line-expected.txt: Added.
+        * inspector/debugger/breakpoints/resolved-dump-each-line.html: Added.
+        * inspector/debugger/breakpoints/resources/dump-functions.js: Added.
+        * inspector/debugger/breakpoints/resources/dump-general.js: Added.
+        Test for resolved breakpoint locations in all kinds of different source code.
+
+        * inspector/debugger/breakpoints/resources/dump.js: Added.
+        (TestPage.registerInitializer):
+        (TestPage.registerInitializer.window.addDumpAllPauseLocationsTestCase):
+        (TestPage.registerInitializer.window.addDumpEachLinePauseLocationTestCase):
+        Shared code to run different generalized tests for logging all resolved
+        breakpoint locations or the resolved breakpoint location if a breakpoint
+        is set on each individual line.
+
+        * inspector/debugger/resources/log-pause-location.js:
+        (TestPage.registerInitializer.insertCaretIntoStringAtIndex):
+        (TestPage.registerInitializer.window.findScript):
+        (TestPage.registerInitializer.window.loadLinesFromSourceCode):
+        (TestPage.registerInitializer.window.loadMainPageContent):
+        (TestPage.registerInitializer.window.logResolvedBreakpointLinesWithContext):
+        (TestPage.registerInitializer.window.logLinesWithContext):
+        Make some more code shared and provide a way to log two locations,
+        used to see where a breakpoint was set and where it resolved to.
+
+        * inspector/debugger/setBreakpoint-expected.txt:
+        Update error message. Should not include a period.
+
+2016-09-30  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
</ins><span class="cx">         Web Inspector: Stepping out of a function finishes the line that called it.
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=155325
</span><span class="cx">         &lt;rdar://problem/25094578&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/TestExpectations (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/TestExpectations        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/LayoutTests/TestExpectations        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -139,6 +139,8 @@
</span><span class="cx"> webkit.org/b/161951 [ Debug ] inspector/debugger/stepping [ Skip ]
</span><span class="cx"> webkit.org/b/161951 [ Release ] inspector/debugger/stepping [ Slow ]
</span><span class="cx"> 
</span><ins>+[ Debug ] inspector/debugger/breakpoints [ Slow ]
+
</ins><span class="cx"> webkit.org/b/129639 inspector/dom/dom-search-crash.html [ Skip ]
</span><span class="cx"> 
</span><span class="cx"> webkit.org/b/128736 inspector/debugger/setBreakpoint-dfg.html [ Failure Pass ]
</span></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerbreakpointsresolveddumpallpauselocationsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-all-pause-locations-expected.txt (0 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-all-pause-locations-expected.txt                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-all-pause-locations-expected.txt        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -0,0 +1,2300 @@
</span><ins>+Checking all resolved breakpoint locations in a script.
+
+
+== Running test suite: Debugger.resolvedBreakpoint.dumpAllLocations
+-- Running test case: Debugger.resolvedBreakpoint.dumpAllLocations.General
+
+INSERTING AT: 0:0
+PAUSES AT: 0:0
+-=&gt;   0    |let a=function(){return 0}
+      1    let b=function(){return 0}
+      2    let c=function(){return 0}
+      3    let arr=[];
+
+INSERTING AT: 0:1
+PAUSES AT: 0:17
+-=&gt;   0    l#et a=function(){|return 0}
+      1    let b=function(){return 0}
+      2    let c=function(){return 0}
+      3    let arr=[];
+
+INSERTING AT: 0:18
+PAUSES AT: 0:25
+-=&gt;   0    let a=function(){r#eturn 0|}
+      1    let b=function(){return 0}
+      2    let c=function(){return 0}
+      3    let arr=[];
+
+INSERTING AT: 0:26
+PAUSES AT: 1:0
+ -&gt;   0    let a=function(){return 0}#
+ =&gt;   1    |let b=function(){return 0}
+      2    let c=function(){return 0}
+      3    let arr=[];
+      4    let obj={};
+
+INSERTING AT: 1:1
+PAUSES AT: 1:17
+      0    let a=function(){return 0}
+-=&gt;   1    l#et b=function(){|return 0}
+      2    let c=function(){return 0}
+      3    let arr=[];
+      4    let obj={};
+
+INSERTING AT: 1:18
+PAUSES AT: 1:25
+      0    let a=function(){return 0}
+-=&gt;   1    let b=function(){r#eturn 0|}
+      2    let c=function(){return 0}
+      3    let arr=[];
+      4    let obj={};
+
+INSERTING AT: 1:26
+PAUSES AT: 2:0
+      0    let a=function(){return 0}
+ -&gt;   1    let b=function(){return 0}#
+ =&gt;   2    |let c=function(){return 0}
+      3    let arr=[];
+      4    let obj={};
+      5    
+
+INSERTING AT: 2:1
+PAUSES AT: 2:17
+      0    let a=function(){return 0}
+      1    let b=function(){return 0}
+-=&gt;   2    l#et c=function(){|return 0}
+      3    let arr=[];
+      4    let obj={};
+      5    
+
+INSERTING AT: 2:18
+PAUSES AT: 2:25
+      0    let a=function(){return 0}
+      1    let b=function(){return 0}
+-=&gt;   2    let c=function(){r#eturn 0|}
+      3    let arr=[];
+      4    let obj={};
+      5    
+
+INSERTING AT: 2:26
+PAUSES AT: 3:0
+      0    let a=function(){return 0}
+      1    let b=function(){return 0}
+ -&gt;   2    let c=function(){return 0}#
+ =&gt;   3    |let arr=[];
+      4    let obj={};
+      5    
+      6    // Control flow
+
+INSERTING AT: 3:1
+PAUSES AT: 4:0
+      0    let a=function(){return 0}
+      1    let b=function(){return 0}
+      2    let c=function(){return 0}
+ -&gt;   3    l#et arr=[];
+ =&gt;   4    |let obj={};
+      5    
+      6    // Control flow
+      7    
+
+INSERTING AT: 4:1
+PAUSES AT: 8:4
+      1    let b=function(){return 0}
+      2    let c=function(){return 0}
+      3    let arr=[];
+ -&gt;   4    l#et obj={};
+      5    
+      6    // Control flow
+      7    
+ =&gt;   8    if (|0)
+      9        a();
+     10    
+     11    if (0) {
+
+INSERTING AT: 8:5
+PAUSES AT: 9:4
+      5    
+      6    // Control flow
+      7    
+ -&gt;   8    if (0#)
+ =&gt;   9        |a();
+     10    
+     11    if (0) {
+     12        a();
+
+INSERTING AT: 9:5
+PAUSES AT: 11:4
+      6    // Control flow
+      7    
+      8    if (0)
+ -&gt;   9        a#();
+     10    
+ =&gt;  11    if (|0) {
+     12        a();
+     13    }
+     14    
+
+INSERTING AT: 11:5
+PAUSES AT: 12:4
+      8    if (0)
+      9        a();
+     10    
+ -&gt;  11    if (0#) {
+ =&gt;  12        |a();
+     13    }
+     14    
+     15    if (0)
+
+INSERTING AT: 12:5
+PAUSES AT: 15:4
+      9        a();
+     10    
+     11    if (0) {
+ -&gt;  12        a#();
+     13    }
+     14    
+ =&gt;  15    if (|0)
+     16        a();
+     17    else if (0)
+     18        a();
+
+INSERTING AT: 15:5
+PAUSES AT: 16:4
+     12        a();
+     13    }
+     14    
+ -&gt;  15    if (0#)
+ =&gt;  16        |a();
+     17    else if (0)
+     18        a();
+     19    else
+
+INSERTING AT: 16:5
+PAUSES AT: 17:9
+     13    }
+     14    
+     15    if (0)
+ -&gt;  16        a#();
+ =&gt;  17    else if (|0)
+     18        a();
+     19    else
+     20        a();
+
+INSERTING AT: 17:10
+PAUSES AT: 18:4
+     14    
+     15    if (0)
+     16        a();
+ -&gt;  17    else if (0#)
+ =&gt;  18        |a();
+     19    else
+     20        a();
+     21    
+
+INSERTING AT: 18:5
+PAUSES AT: 20:4
+     15    if (0)
+     16        a();
+     17    else if (0)
+ -&gt;  18        a#();
+     19    else
+ =&gt;  20        |a();
+     21    
+     22    a() ? b() : c()
+     23    
+
+INSERTING AT: 20:5
+PAUSES AT: 22:0
+     17    else if (0)
+     18        a();
+     19    else
+ -&gt;  20        a#();
+     21    
+ =&gt;  22    |a() ? b() : c()
+     23    
+     24    // Loops
+     25    
+
+INSERTING AT: 22:1
+PAUSES AT: 26:7
+     19    else
+     20        a();
+     21    
+ -&gt;  22    a#() ? b() : c()
+     23    
+     24    // Loops
+     25    
+ =&gt;  26    while (|0)
+     27        a();
+     28    
+     29    while (0) {
+
+INSERTING AT: 26:8
+PAUSES AT: 27:4
+     23    
+     24    // Loops
+     25    
+ -&gt;  26    while (0#)
+ =&gt;  27        |a();
+     28    
+     29    while (0) {
+     30        a();
+
+INSERTING AT: 27:5
+PAUSES AT: 29:7
+     24    // Loops
+     25    
+     26    while (0)
+ -&gt;  27        a#();
+     28    
+ =&gt;  29    while (|0) {
+     30        a();
+     31    }
+     32    
+
+INSERTING AT: 29:8
+PAUSES AT: 30:4
+     26    while (0)
+     27        a();
+     28    
+ -&gt;  29    while (0#) {
+ =&gt;  30        |a();
+     31    }
+     32    
+     33    do {
+
+INSERTING AT: 30:5
+PAUSES AT: 34:4
+     27        a();
+     28    
+     29    while (0) {
+ -&gt;  30        a#();
+     31    }
+     32    
+     33    do {
+ =&gt;  34        |a();
+     35    } while (0);
+     36    
+     37    for (a(); b(); c())
+
+INSERTING AT: 34:5
+PAUSES AT: 35:9
+     31    }
+     32    
+     33    do {
+ -&gt;  34        a#();
+ =&gt;  35    } while (|0);
+     36    
+     37    for (a(); b(); c())
+     38        break;
+
+INSERTING AT: 35:10
+PAUSES AT: 37:5
+     32    
+     33    do {
+     34        a();
+ -&gt;  35    } while (0#);
+     36    
+ =&gt;  37    for (|a(); b(); c())
+     38        break;
+     39    
+     40    for (; b(); c())
+
+INSERTING AT: 37:6
+PAUSES AT: 37:10
+     34        a();
+     35    } while (0);
+     36    
+-=&gt;  37    for (a#(); |b(); c())
+     38        break;
+     39    
+     40    for (; b(); c())
+
+INSERTING AT: 37:11
+PAUSES AT: 37:15
+     34        a();
+     35    } while (0);
+     36    
+-=&gt;  37    for (a(); b#(); |c())
+     38        break;
+     39    
+     40    for (; b(); c())
+
+INSERTING AT: 37:16
+PAUSES AT: 38:4
+     34        a();
+     35    } while (0);
+     36    
+ -&gt;  37    for (a(); b(); c#())
+ =&gt;  38        |break;
+     39    
+     40    for (; b(); c())
+     41        break;
+
+INSERTING AT: 38:5
+PAUSES AT: 40:7
+     35    } while (0);
+     36    
+     37    for (a(); b(); c())
+ -&gt;  38        b#reak;
+     39    
+ =&gt;  40    for (; |b(); c())
+     41        break;
+     42    
+     43    for (a(); b();)
+
+INSERTING AT: 40:8
+PAUSES AT: 40:12
+     37    for (a(); b(); c())
+     38        break;
+     39    
+-=&gt;  40    for (; b#(); |c())
+     41        break;
+     42    
+     43    for (a(); b();)
+
+INSERTING AT: 40:13
+PAUSES AT: 41:4
+     37    for (a(); b(); c())
+     38        break;
+     39    
+ -&gt;  40    for (; b(); c#())
+ =&gt;  41        |break;
+     42    
+     43    for (a(); b();)
+     44        break;
+
+INSERTING AT: 41:5
+PAUSES AT: 43:5
+     38        break;
+     39    
+     40    for (; b(); c())
+ -&gt;  41        b#reak;
+     42    
+ =&gt;  43    for (|a(); b();)
+     44        break;
+     45    
+     46    for (a();; c())
+
+INSERTING AT: 43:6
+PAUSES AT: 43:10
+     40    for (; b(); c())
+     41        break;
+     42    
+-=&gt;  43    for (a#(); |b();)
+     44        break;
+     45    
+     46    for (a();; c())
+
+INSERTING AT: 43:11
+PAUSES AT: 44:4
+     40    for (; b(); c())
+     41        break;
+     42    
+ -&gt;  43    for (a(); b#();)
+ =&gt;  44        |break;
+     45    
+     46    for (a();; c())
+     47        break;
+
+INSERTING AT: 44:5
+PAUSES AT: 46:5
+     41        break;
+     42    
+     43    for (a(); b();)
+ -&gt;  44        b#reak;
+     45    
+ =&gt;  46    for (|a();; c())
+     47        break;
+     48    
+     49    for (a();;)
+
+INSERTING AT: 46:6
+PAUSES AT: 46:11
+     43    for (a(); b();)
+     44        break;
+     45    
+-=&gt;  46    for (a#();; |c())
+     47        break;
+     48    
+     49    for (a();;)
+
+INSERTING AT: 46:12
+PAUSES AT: 47:4
+     43    for (a(); b();)
+     44        break;
+     45    
+ -&gt;  46    for (a();; c#())
+ =&gt;  47        |break;
+     48    
+     49    for (a();;)
+     50        break;
+
+INSERTING AT: 47:5
+PAUSES AT: 49:5
+     44        break;
+     45    
+     46    for (a();; c())
+ -&gt;  47        b#reak;
+     48    
+ =&gt;  49    for (|a();;)
+     50        break;
+     51    
+     52    for (; b();)
+
+INSERTING AT: 49:6
+PAUSES AT: 50:4
+     46    for (a();; c())
+     47        break;
+     48    
+ -&gt;  49    for (a#();;)
+ =&gt;  50        |break;
+     51    
+     52    for (; b();)
+     53        break;
+
+INSERTING AT: 50:5
+PAUSES AT: 52:7
+     47        break;
+     48    
+     49    for (a();;)
+ -&gt;  50        b#reak;
+     51    
+ =&gt;  52    for (; |b();)
+     53        break;
+     54    
+     55    for (;; c())
+
+INSERTING AT: 52:8
+PAUSES AT: 53:4
+     49    for (a();;)
+     50        break;
+     51    
+ -&gt;  52    for (; b#();)
+ =&gt;  53        |break;
+     54    
+     55    for (;; c())
+     56        break;
+
+INSERTING AT: 53:5
+PAUSES AT: 55:8
+     50        break;
+     51    
+     52    for (; b();)
+ -&gt;  53        b#reak;
+     54    
+ =&gt;  55    for (;; |c())
+     56        break;
+     57    
+     58    for (;;)
+
+INSERTING AT: 55:9
+PAUSES AT: 56:4
+     52    for (; b();)
+     53        break;
+     54    
+ -&gt;  55    for (;; c#())
+ =&gt;  56        |break;
+     57    
+     58    for (;;)
+     59        break;
+
+INSERTING AT: 56:5
+PAUSES AT: 59:4
+     53        break;
+     54    
+     55    for (;; c())
+ -&gt;  56        b#reak;
+     57    
+     58    for (;;)
+ =&gt;  59        |break;
+     60    
+     61    for (a(); b(); c()) {
+     62        break;
+
+INSERTING AT: 59:5
+PAUSES AT: 61:5
+     56        break;
+     57    
+     58    for (;;)
+ -&gt;  59        b#reak;
+     60    
+ =&gt;  61    for (|a(); b(); c()) {
+     62        break;
+     63    }
+     64    
+
+INSERTING AT: 61:6
+PAUSES AT: 61:10
+     58    for (;;)
+     59        break;
+     60    
+-=&gt;  61    for (a#(); |b(); c()) {
+     62        break;
+     63    }
+     64    
+
+INSERTING AT: 61:11
+PAUSES AT: 61:15
+     58    for (;;)
+     59        break;
+     60    
+-=&gt;  61    for (a(); b#(); |c()) {
+     62        break;
+     63    }
+     64    
+
+INSERTING AT: 61:16
+PAUSES AT: 62:4
+     58    for (;;)
+     59        break;
+     60    
+ -&gt;  61    for (a(); b(); c#()) {
+ =&gt;  62        |break;
+     63    }
+     64    
+     65    for (let x of arr)
+
+INSERTING AT: 62:5
+PAUSES AT: 65:14
+     59        break;
+     60    
+     61    for (a(); b(); c()) {
+ -&gt;  62        b#reak;
+     63    }
+     64    
+ =&gt;  65    for (let x of |arr)
+     66        break;
+     67    
+     68    for (let x in obj)
+
+INSERTING AT: 65:15
+PAUSES AT: 66:4
+     62        break;
+     63    }
+     64    
+ -&gt;  65    for (let x of a#rr)
+ =&gt;  66        |break;
+     67    
+     68    for (let x in obj)
+     69        break;
+
+INSERTING AT: 66:5
+PAUSES AT: 68:14
+     63    }
+     64    
+     65    for (let x of arr)
+ -&gt;  66        b#reak;
+     67    
+ =&gt;  68    for (let x in |obj)
+     69        break;
+     70    
+     71    // Switch
+
+INSERTING AT: 68:15
+PAUSES AT: 69:4
+     65    for (let x of arr)
+     66        break;
+     67    
+ -&gt;  68    for (let x in o#bj)
+ =&gt;  69        |break;
+     70    
+     71    // Switch
+     72    
+
+INSERTING AT: 69:5
+PAUSES AT: 73:8
+     66        break;
+     67    
+     68    for (let x in obj)
+ -&gt;  69        b#reak;
+     70    
+     71    // Switch
+     72    
+ =&gt;  73    switch (|0) {
+     74    case 1:
+     75        a();
+     76        break;
+
+INSERTING AT: 73:9
+PAUSES AT: 75:4
+     70    
+     71    // Switch
+     72    
+ -&gt;  73    switch (0#) {
+     74    case 1:
+ =&gt;  75        |a();
+     76        break;
+     77    case 2:
+     78        a();
+
+INSERTING AT: 75:5
+PAUSES AT: 76:4
+     72    
+     73    switch (0) {
+     74    case 1:
+ -&gt;  75        a#();
+ =&gt;  76        |break;
+     77    case 2:
+     78        a();
+     79        // fallthrough
+
+INSERTING AT: 76:5
+PAUSES AT: 78:4
+     73    switch (0) {
+     74    case 1:
+     75        a();
+ -&gt;  76        b#reak;
+     77    case 2:
+ =&gt;  78        |a();
+     79        // fallthrough
+     80    case 3:
+     81        a();
+
+INSERTING AT: 78:5
+PAUSES AT: 81:4
+     75        a();
+     76        break;
+     77    case 2:
+ -&gt;  78        a#();
+     79        // fallthrough
+     80    case 3:
+ =&gt;  81        |a();
+     82        break;
+     83    default:
+     84        a();
+
+INSERTING AT: 81:5
+PAUSES AT: 82:4
+     78        a();
+     79        // fallthrough
+     80    case 3:
+ -&gt;  81        a#();
+ =&gt;  82        |break;
+     83    default:
+     84        a();
+     85        break;
+
+INSERTING AT: 82:5
+PAUSES AT: 84:4
+     79        // fallthrough
+     80    case 3:
+     81        a();
+ -&gt;  82        b#reak;
+     83    default:
+ =&gt;  84        |a();
+     85        break;
+     86    }
+     87    
+
+INSERTING AT: 84:5
+PAUSES AT: 85:4
+     81        a();
+     82        break;
+     83    default:
+ -&gt;  84        a#();
+ =&gt;  85        |break;
+     86    }
+     87    
+     88    // Try/Catch
+
+INSERTING AT: 85:5
+PAUSES AT: 91:4
+     82        break;
+     83    default:
+     84        a();
+ -&gt;  85        b#reak;
+     86    }
+     87    
+     88    // Try/Catch
+     89    
+     90    try {
+ =&gt;  91        |a();
+     92    } catch (e) {
+     93        shouldNotBeReached();
+     94    } finally {
+
+INSERTING AT: 91:5
+PAUSES AT: 93:4
+     88    // Try/Catch
+     89    
+     90    try {
+ -&gt;  91        a#();
+     92    } catch (e) {
+ =&gt;  93        |shouldNotBeReached();
+     94    } finally {
+     95        b();
+     96    }
+
+INSERTING AT: 93:5
+PAUSES AT: 95:4
+     90    try {
+     91        a();
+     92    } catch (e) {
+ -&gt;  93        s#houldNotBeReached();
+     94    } finally {
+ =&gt;  95        |b();
+     96    }
+     97    
+     98    // Class
+
+INSERTING AT: 95:5
+PAUSES AT: 151:8
+     92    } catch (e) {
+     93        shouldNotBeReached();
+     94    } finally {
+ -&gt;  95        b#();
+     96    }
+     97    
+     98    // Class
+     99    
+    100    class Base {
+    101        constructor()
+    102        {
+    103            this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+    107        {
+    108            a();
+    109        }
+    110    
+    111        method()
+    112        {
+    113            a();
+    114        }
+    115    }
+    116    
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+INSERTING AT: 101:0
+PAUSES AT: 103:8
+     98    // Class
+     99    
+    100    class Base {
+ -&gt; 101    #    constructor()
+    102        {
+ =&gt; 103            |this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+
+INSERTING AT: 103:9
+PAUSES AT: 104:4
+    100    class Base {
+    101        constructor()
+    102        {
+ -&gt; 103            t#his._base = true;
+ =&gt; 104        |}
+    105    
+    106        baseMethod()
+    107        {
+
+INSERTING AT: 106:0
+PAUSES AT: 108:8
+    103            this._base = true;
+    104        }
+    105    
+ -&gt; 106    #    baseMethod()
+    107        {
+ =&gt; 108            |a();
+    109        }
+    110    
+    111        method()
+
+INSERTING AT: 108:9
+PAUSES AT: 109:4
+    105    
+    106        baseMethod()
+    107        {
+ -&gt; 108            a#();
+ =&gt; 109        |}
+    110    
+    111        method()
+    112        {
+
+INSERTING AT: 111:0
+PAUSES AT: 113:8
+    108            a();
+    109        }
+    110    
+ -&gt; 111    #    method()
+    112        {
+ =&gt; 113            |a();
+    114        }
+    115    }
+    116    
+
+INSERTING AT: 113:9
+PAUSES AT: 114:4
+    110    
+    111        method()
+    112        {
+ -&gt; 113            a#();
+ =&gt; 114        |}
+    115    }
+    116    
+    117    class Child extends Base {
+
+INSERTING AT: 118:0
+PAUSES AT: 120:8
+    115    }
+    116    
+    117    class Child extends Base {
+ -&gt; 118    #    constructor()
+    119        {
+ =&gt; 120            |super();
+    121            this._child = true;
+    122        }
+    123    
+
+INSERTING AT: 120:9
+PAUSES AT: 121:8
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+ -&gt; 120            s#uper();
+ =&gt; 121            |this._child = true;
+    122        }
+    123    
+    124        childMethod()
+
+INSERTING AT: 121:9
+PAUSES AT: 122:4
+    118        constructor()
+    119        {
+    120            super();
+ -&gt; 121            t#his._child = true;
+ =&gt; 122        |}
+    123    
+    124        childMethod()
+    125        {
+
+INSERTING AT: 124:0
+PAUSES AT: 126:8
+    121            this._child = true;
+    122        }
+    123    
+ -&gt; 124    #    childMethod()
+    125        {
+ =&gt; 126            |b();
+    127        }
+    128    
+    129        method()
+
+INSERTING AT: 126:9
+PAUSES AT: 127:4
+    123    
+    124        childMethod()
+    125        {
+ -&gt; 126            b#();
+ =&gt; 127        |}
+    128    
+    129        method()
+    130        {
+
+INSERTING AT: 129:0
+PAUSES AT: 131:8
+    126            b();
+    127        }
+    128    
+ -&gt; 129    #    method()
+    130        {
+ =&gt; 131            |super.method();
+    132            b();
+    133        }
+    134    
+
+INSERTING AT: 131:9
+PAUSES AT: 132:8
+    128    
+    129        method()
+    130        {
+ -&gt; 131            s#uper.method();
+ =&gt; 132            |b();
+    133        }
+    134    
+    135        get name()
+
+INSERTING AT: 132:9
+PAUSES AT: 133:4
+    129        method()
+    130        {
+    131            super.method();
+ -&gt; 132            b#();
+ =&gt; 133        |}
+    134    
+    135        get name()
+    136        {
+
+INSERTING AT: 135:0
+PAUSES AT: 137:8
+    132            b();
+    133        }
+    134    
+ -&gt; 135    #    get name()
+    136        {
+ =&gt; 137            |return this._name;
+    138        }
+    139        
+    140        set name(x)
+
+INSERTING AT: 137:9
+PAUSES AT: 138:4
+    134    
+    135        get name()
+    136        {
+ -&gt; 137            r#eturn this._name;
+ =&gt; 138        |}
+    139        
+    140        set name(x)
+    141        {
+
+INSERTING AT: 140:0
+PAUSES AT: 142:8
+    137            return this._name;
+    138        }
+    139        
+ -&gt; 140    #    set name(x)
+    141        {
+ =&gt; 142            |this._name = x;
+    143        }
+    144    }
+    145    
+
+INSERTING AT: 142:9
+PAUSES AT: 143:4
+    139        
+    140        set name(x)
+    141        {
+ -&gt; 142            t#his._name = x;
+ =&gt; 143        |}
+    144    }
+    145    
+    146    // ---------
+
+INSERTING AT: 151:9
+PAUSES AT: 156:8
+    148    // ---------
+    149    
+    150        {
+ -&gt; 151            a#();
+    152        }
+    153    
+    154    label:
+    155        {
+ =&gt; 156            |a();
+    157        }
+    158    
+    159    var w1 = {x:1, y:2};
+
+INSERTING AT: 156:9
+PAUSES AT: 159:0
+    153    
+    154    label:
+    155        {
+ -&gt; 156            a#();
+    157        }
+    158    
+ =&gt; 159    |var w1 = {x:1, y:2};
+    160    with (w1) {
+    161        a();
+    162    }
+
+INSERTING AT: 159:1
+PAUSES AT: 160:6
+    156            a();
+    157        }
+    158    
+ -&gt; 159    v#ar w1 = {x:1, y:2};
+ =&gt; 160    with (|w1) {
+    161        a();
+    162    }
+    163    
+
+INSERTING AT: 160:7
+PAUSES AT: 161:4
+    157        }
+    158    
+    159    var w1 = {x:1, y:2};
+ -&gt; 160    with (w#1) {
+ =&gt; 161        |a();
+    162    }
+    163    
+    164    var v1 = 1,
+
+INSERTING AT: 161:5
+PAUSES AT: 164:0
+    158    
+    159    var w1 = {x:1, y:2};
+    160    with (w1) {
+ -&gt; 161        a#();
+    162    }
+    163    
+ =&gt; 164    |var v1 = 1,
+    165        v2 = 1;
+    166    let l1 = 2,
+    167        l2 = 2;
+
+INSERTING AT: 164:1
+PAUSES AT: 166:0
+    161        a();
+    162    }
+    163    
+ -&gt; 164    v#ar v1 = 1,
+    165        v2 = 1;
+ =&gt; 166    |let l1 = 2,
+    167        l2 = 2;
+    168    const c1 = 3,
+    169        c2 = 3;
+
+INSERTING AT: 166:1
+PAUSES AT: 168:0
+    163    
+    164    var v1 = 1,
+    165        v2 = 1;
+ -&gt; 166    l#et l1 = 2,
+    167        l2 = 2;
+ =&gt; 168    |const c1 = 3,
+    169        c2 = 3;
+    170    
+    171    v1 = v2 = v1;
+
+INSERTING AT: 168:1
+PAUSES AT: 171:0
+    165        v2 = 1;
+    166    let l1 = 2,
+    167        l2 = 2;
+ -&gt; 168    c#onst c1 = 3,
+    169        c2 = 3;
+    170    
+ =&gt; 171    |v1 = v2 = v1;
+    172    
+    173    var {x, y} = obj;
+    174    var [w, z] = arr;
+
+INSERTING AT: 171:1
+PAUSES AT: 173:0
+    168    const c1 = 3,
+    169        c2 = 3;
+    170    
+ -&gt; 171    v#1 = v2 = v1;
+    172    
+ =&gt; 173    |var {x, y} = obj;
+    174    var [w, z] = arr;
+    175    
+    176    var o1 = {
+
+INSERTING AT: 173:1
+PAUSES AT: 174:0
+    170    
+    171    v1 = v2 = v1;
+    172    
+ -&gt; 173    v#ar {x, y} = obj;
+ =&gt; 174    |var [w, z] = arr;
+    175    
+    176    var o1 = {
+    177        p1: 1,
+
+INSERTING AT: 174:1
+PAUSES AT: 176:0
+    171    v1 = v2 = v1;
+    172    
+    173    var {x, y} = obj;
+ -&gt; 174    v#ar [w, z] = arr;
+    175    
+ =&gt; 176    |var o1 = {
+    177        p1: 1,
+    178        p2: a(),
+    179        p3: 1,
+
+INSERTING AT: 176:1
+PAUSES AT: 184:0
+    173    var {x, y} = obj;
+    174    var [w, z] = arr;
+    175    
+ -&gt; 176    v#ar o1 = {
+    177        p1: 1,
+    178        p2: a(),
+    179        p3: 1,
+    180        [&quot;p4&quot;]: 1,
+    181        [b()]: 1,
+    182    };
+    183    
+ =&gt; 184    |var a1 = [
+    185        1,
+    186        a(),
+    187        1,
+
+INSERTING AT: 184:1
+PAUSES AT: 191:0
+    181        [b()]: 1,
+    182    };
+    183    
+ -&gt; 184    v#ar a1 = [
+    185        1,
+    186        a(),
+    187        1,
+    188        b(),
+    189    ];
+    190    
+ =&gt; 191    |var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+
+INSERTING AT: 191:1
+PAUSES AT: 192:0
+    188        b(),
+    189    ];
+    190    
+ -&gt; 191    v#ar i1 = new Base;
+ =&gt; 192    |var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+    195    i2.method();
+
+INSERTING AT: 192:1
+PAUSES AT: 193:0
+    189    ];
+    190    
+    191    var i1 = new Base;
+ -&gt; 192    v#ar i2 = new Child;
+ =&gt; 193    |i2.name;
+    194    i2.name = 1;
+    195    i2.method();
+    196    
+
+INSERTING AT: 193:1
+PAUSES AT: 194:0
+    190    
+    191    var i1 = new Base;
+    192    var i2 = new Child;
+ -&gt; 193    i#2.name;
+ =&gt; 194    |i2.name = 1;
+    195    i2.method();
+    196    
+    197    var t1 = `${1} ${x=1} ${a()}`;
+
+INSERTING AT: 194:1
+PAUSES AT: 195:0
+    191    var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+ -&gt; 194    i#2.name = 1;
+ =&gt; 195    |i2.method();
+    196    
+    197    var t1 = `${1} ${x=1} ${a()}`;
+    198    var t2 = a`${1} ${x=1} ${a()}`;
+
+INSERTING AT: 195:1
+PAUSES AT: 197:0
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+ -&gt; 195    i#2.method();
+    196    
+ =&gt; 197    |var t1 = `${1} ${x=1} ${a()}`;
+    198    var t2 = a`${1} ${x=1} ${a()}`;
+    199    
+    200    a(a(), b());
+
+INSERTING AT: 197:1
+PAUSES AT: 198:0
+    194    i2.name = 1;
+    195    i2.method();
+    196    
+ -&gt; 197    v#ar t1 = `${1} ${x=1} ${a()}`;
+ =&gt; 198    |var t2 = a`${1} ${x=1} ${a()}`;
+    199    
+    200    a(a(), b());
+    201    
+
+INSERTING AT: 198:1
+PAUSES AT: 200:0
+    195    i2.method();
+    196    
+    197    var t1 = `${1} ${x=1} ${a()}`;
+ -&gt; 198    v#ar t2 = a`${1} ${x=1} ${a()}`;
+    199    
+ =&gt; 200    |a(a(), b());
+    201    
+
+
+-- Running test case: Debugger.resolvedBreakpoint.dumpAllLocations.Functions
+
+INSERTING AT: 0:0
+PAUSES AT: 0:19
+-=&gt;   0    #function inline() {|}
+      1    function named() {
+      2        var x;
+      3    }
+
+INSERTING AT: 0:20
+PAUSES AT: 44:0
+ -&gt;   0    function inline() {}#
+      1    function named() {
+      2        var x;
+      3    }
+      4    function outer1() {
+      5        function inner() {
+      6            var y;
+      7        }
+      8    }
+      9    function outer2()
+     10    {
+     11        function inner()
+     12        {
+     13            var y;
+     14        }
+     15    }
+     16    function outer3() {
+     17        var x;
+     18        function inner() { var y; }
+     19    }
+     20    function outer4() {
+     21        function inner() { var y; }
+     22        var x;
+     23    }
+     24    function outer5() {
+     25        var x;
+     26        function inner() { var y; }
+     27        var x;
+     28    }
+     29    function outer6() {
+     30        function inner1() { var y; }
+     31        var x;
+     32        function inner2() { var z; }
+     33    }
+     34    function outer7() {
+     35        function inner1() { var y; }
+     36        function inner2() { var z; }
+     37        var x;
+     38    }
+     39    function outer7() {
+     40        function inner1() { var y; }
+     41        function inner2() { var z; }
+     42    }
+     43    
+ =&gt;  44    |(function() {
+     45        var x;
+     46    })();
+     47    
+
+INSERTING AT: 1:0
+PAUSES AT: 2:4
+      0    function inline() {}
+ -&gt;   1    #function named() {
+ =&gt;   2        |var x;
+      3    }
+      4    function outer1() {
+      5        function inner() {
+
+INSERTING AT: 2:5
+PAUSES AT: 3:0
+      0    function inline() {}
+      1    function named() {
+ -&gt;   2        v#ar x;
+ =&gt;   3    |}
+      4    function outer1() {
+      5        function inner() {
+      6            var y;
+
+INSERTING AT: 4:0
+PAUSES AT: 8:0
+      1    function named() {
+      2        var x;
+      3    }
+ -&gt;   4    #function outer1() {
+      5        function inner() {
+      6            var y;
+      7        }
+ =&gt;   8    |}
+      9    function outer2()
+     10    {
+     11        function inner()
+
+INSERTING AT: 4:15
+PAUSES AT: 6:8
+      1    function named() {
+      2        var x;
+      3    }
+ -&gt;   4    function outer1#() {
+      5        function inner() {
+ =&gt;   6            |var y;
+      7        }
+      8    }
+      9    function outer2()
+
+INSERTING AT: 6:9
+PAUSES AT: 7:4
+      3    }
+      4    function outer1() {
+      5        function inner() {
+ -&gt;   6            v#ar y;
+ =&gt;   7        |}
+      8    }
+      9    function outer2()
+     10    {
+
+INSERTING AT: 9:0
+PAUSES AT: 15:0
+      6            var y;
+      7        }
+      8    }
+ -&gt;   9    #function outer2()
+     10    {
+     11        function inner()
+     12        {
+     13            var y;
+     14        }
+ =&gt;  15    |}
+     16    function outer3() {
+     17        var x;
+     18        function inner() { var y; }
+
+INSERTING AT: 9:15
+PAUSES AT: 13:8
+      6            var y;
+      7        }
+      8    }
+ -&gt;   9    function outer2#()
+     10    {
+     11        function inner()
+     12        {
+ =&gt;  13            |var y;
+     14        }
+     15    }
+     16    function outer3() {
+
+INSERTING AT: 13:9
+PAUSES AT: 14:4
+     10    {
+     11        function inner()
+     12        {
+ -&gt;  13            v#ar y;
+ =&gt;  14        |}
+     15    }
+     16    function outer3() {
+     17        var x;
+
+INSERTING AT: 16:0
+PAUSES AT: 17:4
+     13            var y;
+     14        }
+     15    }
+ -&gt;  16    #function outer3() {
+ =&gt;  17        |var x;
+     18        function inner() { var y; }
+     19    }
+     20    function outer4() {
+
+INSERTING AT: 17:5
+PAUSES AT: 19:0
+     14        }
+     15    }
+     16    function outer3() {
+ -&gt;  17        v#ar x;
+     18        function inner() { var y; }
+ =&gt;  19    |}
+     20    function outer4() {
+     21        function inner() { var y; }
+     22        var x;
+
+INSERTING AT: 18:0
+PAUSES AT: 18:23
+     15    }
+     16    function outer3() {
+     17        var x;
+-=&gt;  18    #    function inner() { |var y; }
+     19    }
+     20    function outer4() {
+     21        function inner() { var y; }
+
+INSERTING AT: 18:24
+PAUSES AT: 18:30
+     15    }
+     16    function outer3() {
+     17        var x;
+-=&gt;  18        function inner() { v#ar y; |}
+     19    }
+     20    function outer4() {
+     21        function inner() { var y; }
+
+INSERTING AT: 20:0
+PAUSES AT: 22:4
+     17        var x;
+     18        function inner() { var y; }
+     19    }
+ -&gt;  20    #function outer4() {
+     21        function inner() { var y; }
+ =&gt;  22        |var x;
+     23    }
+     24    function outer5() {
+     25        var x;
+
+INSERTING AT: 20:15
+PAUSES AT: 21:23
+     17        var x;
+     18        function inner() { var y; }
+     19    }
+ -&gt;  20    function outer4#() {
+ =&gt;  21        function inner() { |var y; }
+     22        var x;
+     23    }
+     24    function outer5() {
+
+INSERTING AT: 21:24
+PAUSES AT: 21:30
+     18        function inner() { var y; }
+     19    }
+     20    function outer4() {
+-=&gt;  21        function inner() { v#ar y; |}
+     22        var x;
+     23    }
+     24    function outer5() {
+
+INSERTING AT: 22:5
+PAUSES AT: 23:0
+     19    }
+     20    function outer4() {
+     21        function inner() { var y; }
+ -&gt;  22        v#ar x;
+ =&gt;  23    |}
+     24    function outer5() {
+     25        var x;
+     26        function inner() { var y; }
+
+INSERTING AT: 24:0
+PAUSES AT: 25:4
+     21        function inner() { var y; }
+     22        var x;
+     23    }
+ -&gt;  24    #function outer5() {
+ =&gt;  25        |var x;
+     26        function inner() { var y; }
+     27        var x;
+     28    }
+
+INSERTING AT: 25:5
+PAUSES AT: 27:4
+     22        var x;
+     23    }
+     24    function outer5() {
+ -&gt;  25        v#ar x;
+     26        function inner() { var y; }
+ =&gt;  27        |var x;
+     28    }
+     29    function outer6() {
+     30        function inner1() { var y; }
+
+INSERTING AT: 26:0
+PAUSES AT: 26:23
+     23    }
+     24    function outer5() {
+     25        var x;
+-=&gt;  26    #    function inner() { |var y; }
+     27        var x;
+     28    }
+     29    function outer6() {
+
+INSERTING AT: 26:24
+PAUSES AT: 26:30
+     23    }
+     24    function outer5() {
+     25        var x;
+-=&gt;  26        function inner() { v#ar y; |}
+     27        var x;
+     28    }
+     29    function outer6() {
+
+INSERTING AT: 27:5
+PAUSES AT: 28:0
+     24    function outer5() {
+     25        var x;
+     26        function inner() { var y; }
+ -&gt;  27        v#ar x;
+ =&gt;  28    |}
+     29    function outer6() {
+     30        function inner1() { var y; }
+     31        var x;
+
+INSERTING AT: 29:0
+PAUSES AT: 31:4
+     26        function inner() { var y; }
+     27        var x;
+     28    }
+ -&gt;  29    #function outer6() {
+     30        function inner1() { var y; }
+ =&gt;  31        |var x;
+     32        function inner2() { var z; }
+     33    }
+     34    function outer7() {
+
+INSERTING AT: 29:15
+PAUSES AT: 30:24
+     26        function inner() { var y; }
+     27        var x;
+     28    }
+ -&gt;  29    function outer6#() {
+ =&gt;  30        function inner1() { |var y; }
+     31        var x;
+     32        function inner2() { var z; }
+     33    }
+
+INSERTING AT: 30:25
+PAUSES AT: 30:31
+     27        var x;
+     28    }
+     29    function outer6() {
+-=&gt;  30        function inner1() { v#ar y; |}
+     31        var x;
+     32        function inner2() { var z; }
+     33    }
+
+INSERTING AT: 31:5
+PAUSES AT: 33:0
+     28    }
+     29    function outer6() {
+     30        function inner1() { var y; }
+ -&gt;  31        v#ar x;
+     32        function inner2() { var z; }
+ =&gt;  33    |}
+     34    function outer7() {
+     35        function inner1() { var y; }
+     36        function inner2() { var z; }
+
+INSERTING AT: 32:0
+PAUSES AT: 32:24
+     29    function outer6() {
+     30        function inner1() { var y; }
+     31        var x;
+-=&gt;  32    #    function inner2() { |var z; }
+     33    }
+     34    function outer7() {
+     35        function inner1() { var y; }
+
+INSERTING AT: 32:25
+PAUSES AT: 32:31
+     29    function outer6() {
+     30        function inner1() { var y; }
+     31        var x;
+-=&gt;  32        function inner2() { v#ar z; |}
+     33    }
+     34    function outer7() {
+     35        function inner1() { var y; }
+
+INSERTING AT: 34:0
+PAUSES AT: 37:4
+     31        var x;
+     32        function inner2() { var z; }
+     33    }
+ -&gt;  34    #function outer7() {
+     35        function inner1() { var y; }
+     36        function inner2() { var z; }
+ =&gt;  37        |var x;
+     38    }
+     39    function outer7() {
+     40        function inner1() { var y; }
+
+INSERTING AT: 34:15
+PAUSES AT: 35:24
+     31        var x;
+     32        function inner2() { var z; }
+     33    }
+ -&gt;  34    function outer7#() {
+ =&gt;  35        function inner1() { |var y; }
+     36        function inner2() { var z; }
+     37        var x;
+     38    }
+
+INSERTING AT: 35:25
+PAUSES AT: 35:31
+     32        function inner2() { var z; }
+     33    }
+     34    function outer7() {
+-=&gt;  35        function inner1() { v#ar y; |}
+     36        function inner2() { var z; }
+     37        var x;
+     38    }
+
+INSERTING AT: 36:0
+PAUSES AT: 36:24
+     33    }
+     34    function outer7() {
+     35        function inner1() { var y; }
+-=&gt;  36    #    function inner2() { |var z; }
+     37        var x;
+     38    }
+     39    function outer7() {
+
+INSERTING AT: 36:25
+PAUSES AT: 36:31
+     33    }
+     34    function outer7() {
+     35        function inner1() { var y; }
+-=&gt;  36        function inner2() { v#ar z; |}
+     37        var x;
+     38    }
+     39    function outer7() {
+
+INSERTING AT: 37:5
+PAUSES AT: 38:0
+     34    function outer7() {
+     35        function inner1() { var y; }
+     36        function inner2() { var z; }
+ -&gt;  37        v#ar x;
+ =&gt;  38    |}
+     39    function outer7() {
+     40        function inner1() { var y; }
+     41        function inner2() { var z; }
+
+INSERTING AT: 39:0
+PAUSES AT: 42:0
+     36        function inner2() { var z; }
+     37        var x;
+     38    }
+ -&gt;  39    #function outer7() {
+     40        function inner1() { var y; }
+     41        function inner2() { var z; }
+ =&gt;  42    |}
+     43    
+     44    (function() {
+     45        var x;
+
+INSERTING AT: 39:15
+PAUSES AT: 40:24
+     36        function inner2() { var z; }
+     37        var x;
+     38    }
+ -&gt;  39    function outer7#() {
+ =&gt;  40        function inner1() { |var y; }
+     41        function inner2() { var z; }
+     42    }
+     43    
+
+INSERTING AT: 40:25
+PAUSES AT: 40:31
+     37        var x;
+     38    }
+     39    function outer7() {
+-=&gt;  40        function inner1() { v#ar y; |}
+     41        function inner2() { var z; }
+     42    }
+     43    
+
+INSERTING AT: 41:0
+PAUSES AT: 41:24
+     38    }
+     39    function outer7() {
+     40        function inner1() { var y; }
+-=&gt;  41    #    function inner2() { |var z; }
+     42    }
+     43    
+     44    (function() {
+
+INSERTING AT: 41:25
+PAUSES AT: 41:31
+     38    }
+     39    function outer7() {
+     40        function inner1() { var y; }
+-=&gt;  41        function inner2() { v#ar z; |}
+     42    }
+     43    
+     44    (function() {
+
+INSERTING AT: 44:1
+PAUSES AT: 45:4
+     41        function inner2() { var z; }
+     42    }
+     43    
+ -&gt;  44    (#function() {
+ =&gt;  45        |var x;
+     46    })();
+     47    
+     48    (() =&gt; {
+
+INSERTING AT: 45:5
+PAUSES AT: 46:0
+     42    }
+     43    
+     44    (function() {
+ -&gt;  45        v#ar x;
+ =&gt;  46    |})();
+     47    
+     48    (() =&gt; {
+     49        var x;
+
+INSERTING AT: 46:1
+PAUSES AT: 48:0
+     43    
+     44    (function() {
+     45        var x;
+ -&gt;  46    }#)();
+     47    
+ =&gt;  48    |(() =&gt; {
+     49        var x;
+     50    });
+     51    
+
+INSERTING AT: 48:1
+PAUSES AT: 49:4
+     45        var x;
+     46    })();
+     47    
+ -&gt;  48    (#() =&gt; {
+ =&gt;  49        |var x;
+     50    });
+     51    
+     52    function* generator() {
+
+INSERTING AT: 49:5
+PAUSES AT: 50:0
+     46    })();
+     47    
+     48    (() =&gt; {
+ -&gt;  49        v#ar x;
+ =&gt;  50    |});
+     51    
+     52    function* generator() {
+     53        var x;
+
+INSERTING AT: 50:1
+PAUSES AT: 87:0
+     47    
+     48    (() =&gt; {
+     49        var x;
+ -&gt;  50    }#);
+     51    
+     52    function* generator() {
+     53        var x;
+     54    }
+     55    
+     56    class Class {
+     57        static staticMethod1() {
+     58            var x;
+     59        }
+     60        static staticMethod2()
+     61        {
+     62            var x;
+     63        }
+     64        method1() {
+     65            var x;
+     66        }
+     67        method2()
+     68        {
+     69            var x;
+     70        }
+     71        get getter1() {
+     72            var x;
+     73        }
+     74        get getter2()
+     75        {
+     76            var x;
+     77        }
+     78        set setter1(x) {
+     79            var s;
+     80        }
+     81        set setter2(x)
+     82        {
+     83            var s;
+     84        }
+     85    }
+     86    
+ =&gt;  87    |x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+
+INSERTING AT: 52:0
+PAUSES AT: 53:4
+     49        var x;
+     50    });
+     51    
+ -&gt;  52    #function* generator() {
+ =&gt;  53        |var x;
+     54    }
+     55    
+     56    class Class {
+
+INSERTING AT: 53:5
+PAUSES AT: 54:0
+     50    });
+     51    
+     52    function* generator() {
+ -&gt;  53        v#ar x;
+ =&gt;  54    |}
+     55    
+     56    class Class {
+     57        static staticMethod1() {
+
+INSERTING AT: 57:0
+PAUSES AT: 58:8
+     54    }
+     55    
+     56    class Class {
+ -&gt;  57    #    static staticMethod1() {
+ =&gt;  58            |var x;
+     59        }
+     60        static staticMethod2()
+     61        {
+
+INSERTING AT: 58:9
+PAUSES AT: 59:4
+     55    
+     56    class Class {
+     57        static staticMethod1() {
+ -&gt;  58            v#ar x;
+ =&gt;  59        |}
+     60        static staticMethod2()
+     61        {
+     62            var x;
+
+INSERTING AT: 60:0
+PAUSES AT: 62:8
+     57        static staticMethod1() {
+     58            var x;
+     59        }
+ -&gt;  60    #    static staticMethod2()
+     61        {
+ =&gt;  62            |var x;
+     63        }
+     64        method1() {
+     65            var x;
+
+INSERTING AT: 62:9
+PAUSES AT: 63:4
+     59        }
+     60        static staticMethod2()
+     61        {
+ -&gt;  62            v#ar x;
+ =&gt;  63        |}
+     64        method1() {
+     65            var x;
+     66        }
+
+INSERTING AT: 64:0
+PAUSES AT: 65:8
+     61        {
+     62            var x;
+     63        }
+ -&gt;  64    #    method1() {
+ =&gt;  65            |var x;
+     66        }
+     67        method2()
+     68        {
+
+INSERTING AT: 65:9
+PAUSES AT: 66:4
+     62            var x;
+     63        }
+     64        method1() {
+ -&gt;  65            v#ar x;
+ =&gt;  66        |}
+     67        method2()
+     68        {
+     69            var x;
+
+INSERTING AT: 67:0
+PAUSES AT: 69:8
+     64        method1() {
+     65            var x;
+     66        }
+ -&gt;  67    #    method2()
+     68        {
+ =&gt;  69            |var x;
+     70        }
+     71        get getter1() {
+     72            var x;
+
+INSERTING AT: 69:9
+PAUSES AT: 70:4
+     66        }
+     67        method2()
+     68        {
+ -&gt;  69            v#ar x;
+ =&gt;  70        |}
+     71        get getter1() {
+     72            var x;
+     73        }
+
+INSERTING AT: 71:0
+PAUSES AT: 72:8
+     68        {
+     69            var x;
+     70        }
+ -&gt;  71    #    get getter1() {
+ =&gt;  72            |var x;
+     73        }
+     74        get getter2()
+     75        {
+
+INSERTING AT: 72:9
+PAUSES AT: 73:4
+     69            var x;
+     70        }
+     71        get getter1() {
+ -&gt;  72            v#ar x;
+ =&gt;  73        |}
+     74        get getter2()
+     75        {
+     76            var x;
+
+INSERTING AT: 74:0
+PAUSES AT: 76:8
+     71        get getter1() {
+     72            var x;
+     73        }
+ -&gt;  74    #    get getter2()
+     75        {
+ =&gt;  76            |var x;
+     77        }
+     78        set setter1(x) {
+     79            var s;
+
+INSERTING AT: 76:9
+PAUSES AT: 77:4
+     73        }
+     74        get getter2()
+     75        {
+ -&gt;  76            v#ar x;
+ =&gt;  77        |}
+     78        set setter1(x) {
+     79            var s;
+     80        }
+
+INSERTING AT: 78:0
+PAUSES AT: 79:8
+     75        {
+     76            var x;
+     77        }
+ -&gt;  78    #    set setter1(x) {
+ =&gt;  79            |var s;
+     80        }
+     81        set setter2(x)
+     82        {
+
+INSERTING AT: 79:9
+PAUSES AT: 80:4
+     76            var x;
+     77        }
+     78        set setter1(x) {
+ -&gt;  79            v#ar s;
+ =&gt;  80        |}
+     81        set setter2(x)
+     82        {
+     83            var s;
+
+INSERTING AT: 81:0
+PAUSES AT: 83:8
+     78        set setter1(x) {
+     79            var s;
+     80        }
+ -&gt;  81    #    set setter2(x)
+     82        {
+ =&gt;  83            |var s;
+     84        }
+     85    }
+     86    
+
+INSERTING AT: 83:9
+PAUSES AT: 84:4
+     80        }
+     81        set setter2(x)
+     82        {
+ -&gt;  83            v#ar s;
+ =&gt;  84        |}
+     85    }
+     86    
+     87    x =&gt; x;
+
+INSERTING AT: 87:1
+PAUSES AT: 87:5
+     84        }
+     85    }
+     86    
+-=&gt;  87    x# =&gt; |x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+
+INSERTING AT: 87:6
+PAUSES AT: 88:0
+     84        }
+     85    }
+     86    
+ -&gt;  87    x =&gt; x#;
+ =&gt;  88    |() =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+
+INSERTING AT: 88:1
+PAUSES AT: 88:6
+     85    }
+     86    
+     87    x =&gt; x;
+-=&gt;  88    (#) =&gt; |1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+
+INSERTING AT: 88:7
+PAUSES AT: 89:0
+     85    }
+     86    
+     87    x =&gt; x;
+ -&gt;  88    () =&gt; 1#;
+ =&gt;  89    |(x) =&gt; x;
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+     92        x
+
+INSERTING AT: 89:1
+PAUSES AT: 89:7
+     86    
+     87    x =&gt; x;
+     88    () =&gt; 1;
+-=&gt;  89    (#x) =&gt; |x;
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+     92        x
+
+INSERTING AT: 89:8
+PAUSES AT: 94:0
+     86    
+     87    x =&gt; x;
+     88    () =&gt; 1;
+ -&gt;  89    (x) =&gt; x#;
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+     92        x
+     93    };
+ =&gt;  94    |() =&gt; {
+     95        var x;
+     96    };
+     97    
+
+INSERTING AT: 90:0
+PAUSES AT: 90:0
+     87    x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+-=&gt;  90    |(x) =&gt; { x };
+     91    (x) =&gt; {
+     92        x
+     93    };
+
+INSERTING AT: 90:1
+PAUSES AT: 90:9
+     87    x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+-=&gt;  90    (#x) =&gt; { |x };
+     91    (x) =&gt; {
+     92        x
+     93    };
+
+INSERTING AT: 90:10
+PAUSES AT: 90:11
+     87    x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+-=&gt;  90    (x) =&gt; { x# |};
+     91    (x) =&gt; {
+     92        x
+     93    };
+
+INSERTING AT: 91:0
+PAUSES AT: 91:0
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+-=&gt;  91    |(x) =&gt; {
+     92        x
+     93    };
+     94    () =&gt; {
+
+INSERTING AT: 91:1
+PAUSES AT: 92:4
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+ -&gt;  91    (#x) =&gt; {
+ =&gt;  92        |x
+     93    };
+     94    () =&gt; {
+     95        var x;
+
+INSERTING AT: 92:5
+PAUSES AT: 93:0
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+ -&gt;  92        x#
+ =&gt;  93    |};
+     94    () =&gt; {
+     95        var x;
+     96    };
+
+INSERTING AT: 94:1
+PAUSES AT: 95:4
+     91    (x) =&gt; {
+     92        x
+     93    };
+ -&gt;  94    (#) =&gt; {
+ =&gt;  95        |var x;
+     96    };
+     97    
+     98    var fObj = {
+
+INSERTING AT: 95:5
+PAUSES AT: 96:0
+     92        x
+     93    };
+     94    () =&gt; {
+ -&gt;  95        v#ar x;
+ =&gt;  96    |};
+     97    
+     98    var fObj = {
+     99        f1: function() {
+
+INSERTING AT: 96:1
+PAUSES AT: 98:0
+     93    };
+     94    () =&gt; {
+     95        var x;
+ -&gt;  96    }#;
+     97    
+ =&gt;  98    |var fObj = {
+     99        f1: function() {
+    100            var x;
+    101        },
+
+INSERTING AT: 99:0
+PAUSES AT: 100:8
+     96    };
+     97    
+     98    var fObj = {
+ -&gt;  99    #    f1: function() {
+ =&gt; 100            |var x;
+    101        },
+    102        f2: function()
+    103        {
+
+INSERTING AT: 100:9
+PAUSES AT: 101:4
+     97    
+     98    var fObj = {
+     99        f1: function() {
+ -&gt; 100            v#ar x;
+ =&gt; 101        |},
+    102        f2: function()
+    103        {
+    104            var x;
+
+INSERTING AT: 102:0
+PAUSES AT: 104:8
+     99        f1: function() {
+    100            var x;
+    101        },
+ -&gt; 102    #    f2: function()
+    103        {
+ =&gt; 104            |var x;
+    105        },
+    106        f3: () =&gt; {
+    107            var x;
+
+INSERTING AT: 104:9
+PAUSES AT: 105:4
+    101        },
+    102        f2: function()
+    103        {
+ -&gt; 104            v#ar x;
+ =&gt; 105        |},
+    106        f3: () =&gt; {
+    107            var x;
+    108        },
+
+INSERTING AT: 106:0
+PAUSES AT: 107:8
+    103        {
+    104            var x;
+    105        },
+ -&gt; 106    #    f3: () =&gt; {
+ =&gt; 107            |var x;
+    108        },
+    109        f4: () =&gt;
+    110        {
+
+INSERTING AT: 107:9
+PAUSES AT: 108:4
+    104            var x;
+    105        },
+    106        f3: () =&gt; {
+ -&gt; 107            v#ar x;
+ =&gt; 108        |},
+    109        f4: () =&gt;
+    110        {
+    111            var x;
+
+INSERTING AT: 109:0
+PAUSES AT: 111:8
+    106        f3: () =&gt; {
+    107            var x;
+    108        },
+ -&gt; 109    #    f4: () =&gt;
+    110        {
+ =&gt; 111            |var x;
+    112        }   
+    113    };
+    114    
+
+INSERTING AT: 111:9
+PAUSES AT: 112:4
+    108        },
+    109        f4: () =&gt;
+    110        {
+ -&gt; 111            v#ar x;
+ =&gt; 112        |}   
+    113    };
+    114    
+
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerbreakpointsresolveddumpallpauselocationshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-all-pause-locations.html (0 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-all-pause-locations.html                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-all-pause-locations.html        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../../http/tests/inspector/resources/inspector-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../resources/log-pause-location.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/dump.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/dump-general.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/dump-functions.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+function test()
+{
+    let suite = InspectorTest.createAsyncSuite(&quot;Debugger.resolvedBreakpoint.dumpAllLocations&quot;);
+
+    window.addDumpAllPauseLocationsTestCase(suite, {
+        name: &quot;Debugger.resolvedBreakpoint.dumpAllLocations.General&quot;,
+        scriptRegex: /dump-general\.js$/,
+    });
+
+    window.addDumpAllPauseLocationsTestCase(suite, {
+        name: &quot;Debugger.resolvedBreakpoint.dumpAllLocations.Functions&quot;,
+        scriptRegex: /dump-functions\.js$/,
+    });
+
+    suite.runTestCasesAndFinish();
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;runTest()&quot;&gt;
+&lt;p&gt;Checking all resolved breakpoint locations in a script.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerbreakpointsresolveddumpeachlineexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-each-line-expected.txt (0 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-each-line-expected.txt                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-each-line-expected.txt        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -0,0 +1,4348 @@
</span><ins>+Checking resolved breakpoint locations for each line in a script.
+
+
+== Running test suite: Debugger.resolvedBreakpoint.dumpEachLine
+-- Running test case: Debugger.resolvedBreakpoint.dumpEachLine.General
+
+INSERTING AT: 0:0
+PAUSES AT: 0:0
+-=&gt;   0    |let a=function(){return 0}
+      1    let b=function(){return 0}
+      2    let c=function(){return 0}
+      3    let arr=[];
+
+
+INSERTING AT: 1:0
+PAUSES AT: 1:0
+      0    let a=function(){return 0}
+-=&gt;   1    |let b=function(){return 0}
+      2    let c=function(){return 0}
+      3    let arr=[];
+      4    let obj={};
+
+
+INSERTING AT: 2:0
+PAUSES AT: 2:0
+      0    let a=function(){return 0}
+      1    let b=function(){return 0}
+-=&gt;   2    |let c=function(){return 0}
+      3    let arr=[];
+      4    let obj={};
+      5    
+
+
+INSERTING AT: 3:0
+PAUSES AT: 3:0
+      0    let a=function(){return 0}
+      1    let b=function(){return 0}
+      2    let c=function(){return 0}
+-=&gt;   3    |let arr=[];
+      4    let obj={};
+      5    
+      6    // Control flow
+
+
+INSERTING AT: 4:0
+PAUSES AT: 4:0
+      1    let b=function(){return 0}
+      2    let c=function(){return 0}
+      3    let arr=[];
+-=&gt;   4    |let obj={};
+      5    
+      6    // Control flow
+      7    
+
+
+INSERTING AT: 5:0
+PAUSES AT: 8:4
+      2    let c=function(){return 0}
+      3    let arr=[];
+      4    let obj={};
+ -&gt;   5    #
+      6    // Control flow
+      7    
+ =&gt;   8    if (|0)
+      9        a();
+     10    
+     11    if (0) {
+
+
+INSERTING AT: 6:0
+PAUSES AT: 8:4
+      3    let arr=[];
+      4    let obj={};
+      5    
+ -&gt;   6    #// Control flow
+      7    
+ =&gt;   8    if (|0)
+      9        a();
+     10    
+     11    if (0) {
+
+
+INSERTING AT: 7:0
+PAUSES AT: 8:4
+      4    let obj={};
+      5    
+      6    // Control flow
+ -&gt;   7    #
+ =&gt;   8    if (|0)
+      9        a();
+     10    
+     11    if (0) {
+
+
+INSERTING AT: 8:0
+PAUSES AT: 8:4
+      5    
+      6    // Control flow
+      7    
+-=&gt;   8    #if (|0)
+      9        a();
+     10    
+     11    if (0) {
+
+
+INSERTING AT: 9:0
+PAUSES AT: 9:4
+      6    // Control flow
+      7    
+      8    if (0)
+-=&gt;   9    #    |a();
+     10    
+     11    if (0) {
+     12        a();
+
+
+INSERTING AT: 10:0
+PAUSES AT: 11:4
+      7    
+      8    if (0)
+      9        a();
+ -&gt;  10    #
+ =&gt;  11    if (|0) {
+     12        a();
+     13    }
+     14    
+
+
+INSERTING AT: 11:0
+PAUSES AT: 11:4
+      8    if (0)
+      9        a();
+     10    
+-=&gt;  11    #if (|0) {
+     12        a();
+     13    }
+     14    
+
+
+INSERTING AT: 12:0
+PAUSES AT: 12:4
+      9        a();
+     10    
+     11    if (0) {
+-=&gt;  12    #    |a();
+     13    }
+     14    
+     15    if (0)
+
+
+INSERTING AT: 13:0
+PAUSES AT: 15:4
+     10    
+     11    if (0) {
+     12        a();
+ -&gt;  13    #}
+     14    
+ =&gt;  15    if (|0)
+     16        a();
+     17    else if (0)
+     18        a();
+
+
+INSERTING AT: 14:0
+PAUSES AT: 15:4
+     11    if (0) {
+     12        a();
+     13    }
+ -&gt;  14    #
+ =&gt;  15    if (|0)
+     16        a();
+     17    else if (0)
+     18        a();
+
+
+INSERTING AT: 15:0
+PAUSES AT: 15:4
+     12        a();
+     13    }
+     14    
+-=&gt;  15    #if (|0)
+     16        a();
+     17    else if (0)
+     18        a();
+
+
+INSERTING AT: 16:0
+PAUSES AT: 16:4
+     13    }
+     14    
+     15    if (0)
+-=&gt;  16    #    |a();
+     17    else if (0)
+     18        a();
+     19    else
+
+
+INSERTING AT: 17:0
+PAUSES AT: 17:9
+     14    
+     15    if (0)
+     16        a();
+-=&gt;  17    #else if (|0)
+     18        a();
+     19    else
+     20        a();
+
+
+INSERTING AT: 18:0
+PAUSES AT: 18:4
+     15    if (0)
+     16        a();
+     17    else if (0)
+-=&gt;  18    #    |a();
+     19    else
+     20        a();
+     21    
+
+
+INSERTING AT: 19:0
+PAUSES AT: 20:4
+     16        a();
+     17    else if (0)
+     18        a();
+ -&gt;  19    #else
+ =&gt;  20        |a();
+     21    
+     22    a() ? b() : c()
+     23    
+
+
+INSERTING AT: 20:0
+PAUSES AT: 20:4
+     17    else if (0)
+     18        a();
+     19    else
+-=&gt;  20    #    |a();
+     21    
+     22    a() ? b() : c()
+     23    
+
+
+INSERTING AT: 21:0
+PAUSES AT: 22:0
+     18        a();
+     19    else
+     20        a();
+ -&gt;  21    #
+ =&gt;  22    |a() ? b() : c()
+     23    
+     24    // Loops
+     25    
+
+
+INSERTING AT: 22:0
+PAUSES AT: 22:0
+     19    else
+     20        a();
+     21    
+-=&gt;  22    |a() ? b() : c()
+     23    
+     24    // Loops
+     25    
+
+
+INSERTING AT: 23:0
+PAUSES AT: 26:7
+     20        a();
+     21    
+     22    a() ? b() : c()
+ -&gt;  23    #
+     24    // Loops
+     25    
+ =&gt;  26    while (|0)
+     27        a();
+     28    
+     29    while (0) {
+
+
+INSERTING AT: 24:0
+PAUSES AT: 26:7
+     21    
+     22    a() ? b() : c()
+     23    
+ -&gt;  24    #// Loops
+     25    
+ =&gt;  26    while (|0)
+     27        a();
+     28    
+     29    while (0) {
+
+
+INSERTING AT: 25:0
+PAUSES AT: 26:7
+     22    a() ? b() : c()
+     23    
+     24    // Loops
+ -&gt;  25    #
+ =&gt;  26    while (|0)
+     27        a();
+     28    
+     29    while (0) {
+
+
+INSERTING AT: 26:0
+PAUSES AT: 26:7
+     23    
+     24    // Loops
+     25    
+-=&gt;  26    #while (|0)
+     27        a();
+     28    
+     29    while (0) {
+
+
+INSERTING AT: 27:0
+PAUSES AT: 27:4
+     24    // Loops
+     25    
+     26    while (0)
+-=&gt;  27    #    |a();
+     28    
+     29    while (0) {
+     30        a();
+
+
+INSERTING AT: 28:0
+PAUSES AT: 29:7
+     25    
+     26    while (0)
+     27        a();
+ -&gt;  28    #
+ =&gt;  29    while (|0) {
+     30        a();
+     31    }
+     32    
+
+
+INSERTING AT: 29:0
+PAUSES AT: 29:7
+     26    while (0)
+     27        a();
+     28    
+-=&gt;  29    #while (|0) {
+     30        a();
+     31    }
+     32    
+
+
+INSERTING AT: 30:0
+PAUSES AT: 30:4
+     27        a();
+     28    
+     29    while (0) {
+-=&gt;  30    #    |a();
+     31    }
+     32    
+     33    do {
+
+
+INSERTING AT: 31:0
+PAUSES AT: 34:4
+     28    
+     29    while (0) {
+     30        a();
+ -&gt;  31    #}
+     32    
+     33    do {
+ =&gt;  34        |a();
+     35    } while (0);
+     36    
+     37    for (a(); b(); c())
+
+
+INSERTING AT: 32:0
+PAUSES AT: 34:4
+     29    while (0) {
+     30        a();
+     31    }
+ -&gt;  32    #
+     33    do {
+ =&gt;  34        |a();
+     35    } while (0);
+     36    
+     37    for (a(); b(); c())
+
+
+INSERTING AT: 33:0
+PAUSES AT: 34:4
+     30        a();
+     31    }
+     32    
+ -&gt;  33    #do {
+ =&gt;  34        |a();
+     35    } while (0);
+     36    
+     37    for (a(); b(); c())
+
+
+INSERTING AT: 34:0
+PAUSES AT: 34:4
+     31    }
+     32    
+     33    do {
+-=&gt;  34    #    |a();
+     35    } while (0);
+     36    
+     37    for (a(); b(); c())
+
+
+INSERTING AT: 35:0
+PAUSES AT: 35:9
+     32    
+     33    do {
+     34        a();
+-=&gt;  35    #} while (|0);
+     36    
+     37    for (a(); b(); c())
+     38        break;
+
+
+INSERTING AT: 36:0
+PAUSES AT: 37:5
+     33    do {
+     34        a();
+     35    } while (0);
+ -&gt;  36    #
+ =&gt;  37    for (|a(); b(); c())
+     38        break;
+     39    
+     40    for (; b(); c())
+
+
+INSERTING AT: 37:0
+PAUSES AT: 37:5
+     34        a();
+     35    } while (0);
+     36    
+-=&gt;  37    #for (|a(); b(); c())
+     38        break;
+     39    
+     40    for (; b(); c())
+
+
+INSERTING AT: 38:0
+PAUSES AT: 38:4
+     35    } while (0);
+     36    
+     37    for (a(); b(); c())
+-=&gt;  38    #    |break;
+     39    
+     40    for (; b(); c())
+     41        break;
+
+
+INSERTING AT: 39:0
+PAUSES AT: 40:7
+     36    
+     37    for (a(); b(); c())
+     38        break;
+ -&gt;  39    #
+ =&gt;  40    for (; |b(); c())
+     41        break;
+     42    
+     43    for (a(); b();)
+
+
+INSERTING AT: 40:0
+PAUSES AT: 40:7
+     37    for (a(); b(); c())
+     38        break;
+     39    
+-=&gt;  40    #for (; |b(); c())
+     41        break;
+     42    
+     43    for (a(); b();)
+
+
+INSERTING AT: 41:0
+PAUSES AT: 41:4
+     38        break;
+     39    
+     40    for (; b(); c())
+-=&gt;  41    #    |break;
+     42    
+     43    for (a(); b();)
+     44        break;
+
+
+INSERTING AT: 42:0
+PAUSES AT: 43:5
+     39    
+     40    for (; b(); c())
+     41        break;
+ -&gt;  42    #
+ =&gt;  43    for (|a(); b();)
+     44        break;
+     45    
+     46    for (a();; c())
+
+
+INSERTING AT: 43:0
+PAUSES AT: 43:5
+     40    for (; b(); c())
+     41        break;
+     42    
+-=&gt;  43    #for (|a(); b();)
+     44        break;
+     45    
+     46    for (a();; c())
+
+
+INSERTING AT: 44:0
+PAUSES AT: 44:4
+     41        break;
+     42    
+     43    for (a(); b();)
+-=&gt;  44    #    |break;
+     45    
+     46    for (a();; c())
+     47        break;
+
+
+INSERTING AT: 45:0
+PAUSES AT: 46:5
+     42    
+     43    for (a(); b();)
+     44        break;
+ -&gt;  45    #
+ =&gt;  46    for (|a();; c())
+     47        break;
+     48    
+     49    for (a();;)
+
+
+INSERTING AT: 46:0
+PAUSES AT: 46:5
+     43    for (a(); b();)
+     44        break;
+     45    
+-=&gt;  46    #for (|a();; c())
+     47        break;
+     48    
+     49    for (a();;)
+
+
+INSERTING AT: 47:0
+PAUSES AT: 47:4
+     44        break;
+     45    
+     46    for (a();; c())
+-=&gt;  47    #    |break;
+     48    
+     49    for (a();;)
+     50        break;
+
+
+INSERTING AT: 48:0
+PAUSES AT: 49:5
+     45    
+     46    for (a();; c())
+     47        break;
+ -&gt;  48    #
+ =&gt;  49    for (|a();;)
+     50        break;
+     51    
+     52    for (; b();)
+
+
+INSERTING AT: 49:0
+PAUSES AT: 49:5
+     46    for (a();; c())
+     47        break;
+     48    
+-=&gt;  49    #for (|a();;)
+     50        break;
+     51    
+     52    for (; b();)
+
+
+INSERTING AT: 50:0
+PAUSES AT: 50:4
+     47        break;
+     48    
+     49    for (a();;)
+-=&gt;  50    #    |break;
+     51    
+     52    for (; b();)
+     53        break;
+
+
+INSERTING AT: 51:0
+PAUSES AT: 52:7
+     48    
+     49    for (a();;)
+     50        break;
+ -&gt;  51    #
+ =&gt;  52    for (; |b();)
+     53        break;
+     54    
+     55    for (;; c())
+
+
+INSERTING AT: 52:0
+PAUSES AT: 52:7
+     49    for (a();;)
+     50        break;
+     51    
+-=&gt;  52    #for (; |b();)
+     53        break;
+     54    
+     55    for (;; c())
+
+
+INSERTING AT: 53:0
+PAUSES AT: 53:4
+     50        break;
+     51    
+     52    for (; b();)
+-=&gt;  53    #    |break;
+     54    
+     55    for (;; c())
+     56        break;
+
+
+INSERTING AT: 54:0
+PAUSES AT: 55:8
+     51    
+     52    for (; b();)
+     53        break;
+ -&gt;  54    #
+ =&gt;  55    for (;; |c())
+     56        break;
+     57    
+     58    for (;;)
+
+
+INSERTING AT: 55:0
+PAUSES AT: 55:8
+     52    for (; b();)
+     53        break;
+     54    
+-=&gt;  55    #for (;; |c())
+     56        break;
+     57    
+     58    for (;;)
+
+
+INSERTING AT: 56:0
+PAUSES AT: 56:4
+     53        break;
+     54    
+     55    for (;; c())
+-=&gt;  56    #    |break;
+     57    
+     58    for (;;)
+     59        break;
+
+
+INSERTING AT: 57:0
+PAUSES AT: 59:4
+     54    
+     55    for (;; c())
+     56        break;
+ -&gt;  57    #
+     58    for (;;)
+ =&gt;  59        |break;
+     60    
+     61    for (a(); b(); c()) {
+     62        break;
+
+
+INSERTING AT: 58:0
+PAUSES AT: 59:4
+     55    for (;; c())
+     56        break;
+     57    
+ -&gt;  58    #for (;;)
+ =&gt;  59        |break;
+     60    
+     61    for (a(); b(); c()) {
+     62        break;
+
+
+INSERTING AT: 59:0
+PAUSES AT: 59:4
+     56        break;
+     57    
+     58    for (;;)
+-=&gt;  59    #    |break;
+     60    
+     61    for (a(); b(); c()) {
+     62        break;
+
+
+INSERTING AT: 60:0
+PAUSES AT: 61:5
+     57    
+     58    for (;;)
+     59        break;
+ -&gt;  60    #
+ =&gt;  61    for (|a(); b(); c()) {
+     62        break;
+     63    }
+     64    
+
+
+INSERTING AT: 61:0
+PAUSES AT: 61:5
+     58    for (;;)
+     59        break;
+     60    
+-=&gt;  61    #for (|a(); b(); c()) {
+     62        break;
+     63    }
+     64    
+
+
+INSERTING AT: 62:0
+PAUSES AT: 62:4
+     59        break;
+     60    
+     61    for (a(); b(); c()) {
+-=&gt;  62    #    |break;
+     63    }
+     64    
+     65    for (let x of arr)
+
+
+INSERTING AT: 63:0
+PAUSES AT: 65:14
+     60    
+     61    for (a(); b(); c()) {
+     62        break;
+ -&gt;  63    #}
+     64    
+ =&gt;  65    for (let x of |arr)
+     66        break;
+     67    
+     68    for (let x in obj)
+
+
+INSERTING AT: 64:0
+PAUSES AT: 65:14
+     61    for (a(); b(); c()) {
+     62        break;
+     63    }
+ -&gt;  64    #
+ =&gt;  65    for (let x of |arr)
+     66        break;
+     67    
+     68    for (let x in obj)
+
+
+INSERTING AT: 65:0
+PAUSES AT: 65:14
+     62        break;
+     63    }
+     64    
+-=&gt;  65    #for (let x of |arr)
+     66        break;
+     67    
+     68    for (let x in obj)
+
+
+INSERTING AT: 66:0
+PAUSES AT: 66:4
+     63    }
+     64    
+     65    for (let x of arr)
+-=&gt;  66    #    |break;
+     67    
+     68    for (let x in obj)
+     69        break;
+
+
+INSERTING AT: 67:0
+PAUSES AT: 68:14
+     64    
+     65    for (let x of arr)
+     66        break;
+ -&gt;  67    #
+ =&gt;  68    for (let x in |obj)
+     69        break;
+     70    
+     71    // Switch
+
+
+INSERTING AT: 68:0
+PAUSES AT: 68:14
+     65    for (let x of arr)
+     66        break;
+     67    
+-=&gt;  68    #for (let x in |obj)
+     69        break;
+     70    
+     71    // Switch
+
+
+INSERTING AT: 69:0
+PAUSES AT: 69:4
+     66        break;
+     67    
+     68    for (let x in obj)
+-=&gt;  69    #    |break;
+     70    
+     71    // Switch
+     72    
+
+
+INSERTING AT: 70:0
+PAUSES AT: 73:8
+     67    
+     68    for (let x in obj)
+     69        break;
+ -&gt;  70    #
+     71    // Switch
+     72    
+ =&gt;  73    switch (|0) {
+     74    case 1:
+     75        a();
+     76        break;
+
+
+INSERTING AT: 71:0
+PAUSES AT: 73:8
+     68    for (let x in obj)
+     69        break;
+     70    
+ -&gt;  71    #// Switch
+     72    
+ =&gt;  73    switch (|0) {
+     74    case 1:
+     75        a();
+     76        break;
+
+
+INSERTING AT: 72:0
+PAUSES AT: 73:8
+     69        break;
+     70    
+     71    // Switch
+ -&gt;  72    #
+ =&gt;  73    switch (|0) {
+     74    case 1:
+     75        a();
+     76        break;
+
+
+INSERTING AT: 73:0
+PAUSES AT: 73:8
+     70    
+     71    // Switch
+     72    
+-=&gt;  73    #switch (|0) {
+     74    case 1:
+     75        a();
+     76        break;
+
+
+INSERTING AT: 74:0
+PAUSES AT: 75:4
+     71    // Switch
+     72    
+     73    switch (0) {
+ -&gt;  74    #case 1:
+ =&gt;  75        |a();
+     76        break;
+     77    case 2:
+     78        a();
+
+
+INSERTING AT: 75:0
+PAUSES AT: 75:4
+     72    
+     73    switch (0) {
+     74    case 1:
+-=&gt;  75    #    |a();
+     76        break;
+     77    case 2:
+     78        a();
+
+
+INSERTING AT: 76:0
+PAUSES AT: 76:4
+     73    switch (0) {
+     74    case 1:
+     75        a();
+-=&gt;  76    #    |break;
+     77    case 2:
+     78        a();
+     79        // fallthrough
+
+
+INSERTING AT: 77:0
+PAUSES AT: 78:4
+     74    case 1:
+     75        a();
+     76        break;
+ -&gt;  77    #case 2:
+ =&gt;  78        |a();
+     79        // fallthrough
+     80    case 3:
+     81        a();
+
+
+INSERTING AT: 78:0
+PAUSES AT: 78:4
+     75        a();
+     76        break;
+     77    case 2:
+-=&gt;  78    #    |a();
+     79        // fallthrough
+     80    case 3:
+     81        a();
+
+
+INSERTING AT: 79:0
+PAUSES AT: 81:4
+     76        break;
+     77    case 2:
+     78        a();
+ -&gt;  79    #    // fallthrough
+     80    case 3:
+ =&gt;  81        |a();
+     82        break;
+     83    default:
+     84        a();
+
+
+INSERTING AT: 80:0
+PAUSES AT: 81:4
+     77    case 2:
+     78        a();
+     79        // fallthrough
+ -&gt;  80    #case 3:
+ =&gt;  81        |a();
+     82        break;
+     83    default:
+     84        a();
+
+
+INSERTING AT: 81:0
+PAUSES AT: 81:4
+     78        a();
+     79        // fallthrough
+     80    case 3:
+-=&gt;  81    #    |a();
+     82        break;
+     83    default:
+     84        a();
+
+
+INSERTING AT: 82:0
+PAUSES AT: 82:4
+     79        // fallthrough
+     80    case 3:
+     81        a();
+-=&gt;  82    #    |break;
+     83    default:
+     84        a();
+     85        break;
+
+
+INSERTING AT: 83:0
+PAUSES AT: 84:4
+     80    case 3:
+     81        a();
+     82        break;
+ -&gt;  83    #default:
+ =&gt;  84        |a();
+     85        break;
+     86    }
+     87    
+
+
+INSERTING AT: 84:0
+PAUSES AT: 84:4
+     81        a();
+     82        break;
+     83    default:
+-=&gt;  84    #    |a();
+     85        break;
+     86    }
+     87    
+
+
+INSERTING AT: 85:0
+PAUSES AT: 85:4
+     82        break;
+     83    default:
+     84        a();
+-=&gt;  85    #    |break;
+     86    }
+     87    
+     88    // Try/Catch
+
+
+INSERTING AT: 86:0
+PAUSES AT: 91:4
+     83    default:
+     84        a();
+     85        break;
+ -&gt;  86    #}
+     87    
+     88    // Try/Catch
+     89    
+     90    try {
+ =&gt;  91        |a();
+     92    } catch (e) {
+     93        shouldNotBeReached();
+     94    } finally {
+
+
+INSERTING AT: 87:0
+PAUSES AT: 91:4
+     84        a();
+     85        break;
+     86    }
+ -&gt;  87    #
+     88    // Try/Catch
+     89    
+     90    try {
+ =&gt;  91        |a();
+     92    } catch (e) {
+     93        shouldNotBeReached();
+     94    } finally {
+
+
+INSERTING AT: 88:0
+PAUSES AT: 91:4
+     85        break;
+     86    }
+     87    
+ -&gt;  88    #// Try/Catch
+     89    
+     90    try {
+ =&gt;  91        |a();
+     92    } catch (e) {
+     93        shouldNotBeReached();
+     94    } finally {
+
+
+INSERTING AT: 89:0
+PAUSES AT: 91:4
+     86    }
+     87    
+     88    // Try/Catch
+ -&gt;  89    #
+     90    try {
+ =&gt;  91        |a();
+     92    } catch (e) {
+     93        shouldNotBeReached();
+     94    } finally {
+
+
+INSERTING AT: 90:0
+PAUSES AT: 91:4
+     87    
+     88    // Try/Catch
+     89    
+ -&gt;  90    #try {
+ =&gt;  91        |a();
+     92    } catch (e) {
+     93        shouldNotBeReached();
+     94    } finally {
+
+
+INSERTING AT: 91:0
+PAUSES AT: 91:4
+     88    // Try/Catch
+     89    
+     90    try {
+-=&gt;  91    #    |a();
+     92    } catch (e) {
+     93        shouldNotBeReached();
+     94    } finally {
+
+
+INSERTING AT: 92:0
+PAUSES AT: 93:4
+     89    
+     90    try {
+     91        a();
+ -&gt;  92    #} catch (e) {
+ =&gt;  93        |shouldNotBeReached();
+     94    } finally {
+     95        b();
+     96    }
+
+
+INSERTING AT: 93:0
+PAUSES AT: 93:4
+     90    try {
+     91        a();
+     92    } catch (e) {
+-=&gt;  93    #    |shouldNotBeReached();
+     94    } finally {
+     95        b();
+     96    }
+
+
+INSERTING AT: 94:0
+PAUSES AT: 95:4
+     91        a();
+     92    } catch (e) {
+     93        shouldNotBeReached();
+ -&gt;  94    #} finally {
+ =&gt;  95        |b();
+     96    }
+     97    
+     98    // Class
+
+
+INSERTING AT: 95:0
+PAUSES AT: 95:4
+     92    } catch (e) {
+     93        shouldNotBeReached();
+     94    } finally {
+-=&gt;  95    #    |b();
+     96    }
+     97    
+     98    // Class
+
+
+INSERTING AT: 96:0
+PAUSES AT: 151:8
+     93        shouldNotBeReached();
+     94    } finally {
+     95        b();
+ -&gt;  96    #}
+     97    
+     98    // Class
+     99    
+    100    class Base {
+    101        constructor()
+    102        {
+    103            this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+    107        {
+    108            a();
+    109        }
+    110    
+    111        method()
+    112        {
+    113            a();
+    114        }
+    115    }
+    116    
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 97:0
+PAUSES AT: 151:8
+     94    } finally {
+     95        b();
+     96    }
+ -&gt;  97    #
+     98    // Class
+     99    
+    100    class Base {
+    101        constructor()
+    102        {
+    103            this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+    107        {
+    108            a();
+    109        }
+    110    
+    111        method()
+    112        {
+    113            a();
+    114        }
+    115    }
+    116    
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 98:0
+PAUSES AT: 151:8
+     95        b();
+     96    }
+     97    
+ -&gt;  98    #// Class
+     99    
+    100    class Base {
+    101        constructor()
+    102        {
+    103            this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+    107        {
+    108            a();
+    109        }
+    110    
+    111        method()
+    112        {
+    113            a();
+    114        }
+    115    }
+    116    
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 99:0
+PAUSES AT: 151:8
+     96    }
+     97    
+     98    // Class
+ -&gt;  99    #
+    100    class Base {
+    101        constructor()
+    102        {
+    103            this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+    107        {
+    108            a();
+    109        }
+    110    
+    111        method()
+    112        {
+    113            a();
+    114        }
+    115    }
+    116    
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 100:0
+PAUSES AT: 151:8
+     97    
+     98    // Class
+     99    
+ -&gt; 100    #class Base {
+    101        constructor()
+    102        {
+    103            this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+    107        {
+    108            a();
+    109        }
+    110    
+    111        method()
+    112        {
+    113            a();
+    114        }
+    115    }
+    116    
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 101:0
+PAUSES AT: 103:8
+     98    // Class
+     99    
+    100    class Base {
+ -&gt; 101    #    constructor()
+    102        {
+ =&gt; 103            |this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+
+
+INSERTING AT: 102:0
+PAUSES AT: 103:8
+     99    
+    100    class Base {
+    101        constructor()
+ -&gt; 102    #    {
+ =&gt; 103            |this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+
+
+INSERTING AT: 103:0
+PAUSES AT: 103:8
+    100    class Base {
+    101        constructor()
+    102        {
+-=&gt; 103    #        |this._base = true;
+    104        }
+    105    
+    106        baseMethod()
+
+
+INSERTING AT: 104:0
+PAUSES AT: 104:4
+    101        constructor()
+    102        {
+    103            this._base = true;
+-=&gt; 104    #    |}
+    105    
+    106        baseMethod()
+    107        {
+
+
+INSERTING AT: 105:0
+PAUSES AT: 151:8
+    102        {
+    103            this._base = true;
+    104        }
+ -&gt; 105    #
+    106        baseMethod()
+    107        {
+    108            a();
+    109        }
+    110    
+    111        method()
+    112        {
+    113            a();
+    114        }
+    115    }
+    116    
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 106:0
+PAUSES AT: 108:8
+    103            this._base = true;
+    104        }
+    105    
+ -&gt; 106    #    baseMethod()
+    107        {
+ =&gt; 108            |a();
+    109        }
+    110    
+    111        method()
+
+
+INSERTING AT: 107:0
+PAUSES AT: 108:8
+    104        }
+    105    
+    106        baseMethod()
+ -&gt; 107    #    {
+ =&gt; 108            |a();
+    109        }
+    110    
+    111        method()
+
+
+INSERTING AT: 108:0
+PAUSES AT: 108:8
+    105    
+    106        baseMethod()
+    107        {
+-=&gt; 108    #        |a();
+    109        }
+    110    
+    111        method()
+
+
+INSERTING AT: 109:0
+PAUSES AT: 109:4
+    106        baseMethod()
+    107        {
+    108            a();
+-=&gt; 109    #    |}
+    110    
+    111        method()
+    112        {
+
+
+INSERTING AT: 110:0
+PAUSES AT: 151:8
+    107        {
+    108            a();
+    109        }
+ -&gt; 110    #
+    111        method()
+    112        {
+    113            a();
+    114        }
+    115    }
+    116    
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 111:0
+PAUSES AT: 113:8
+    108            a();
+    109        }
+    110    
+ -&gt; 111    #    method()
+    112        {
+ =&gt; 113            |a();
+    114        }
+    115    }
+    116    
+
+
+INSERTING AT: 112:0
+PAUSES AT: 113:8
+    109        }
+    110    
+    111        method()
+ -&gt; 112    #    {
+ =&gt; 113            |a();
+    114        }
+    115    }
+    116    
+
+
+INSERTING AT: 113:0
+PAUSES AT: 113:8
+    110    
+    111        method()
+    112        {
+-=&gt; 113    #        |a();
+    114        }
+    115    }
+    116    
+
+
+INSERTING AT: 114:0
+PAUSES AT: 114:4
+    111        method()
+    112        {
+    113            a();
+-=&gt; 114    #    |}
+    115    }
+    116    
+    117    class Child extends Base {
+
+
+INSERTING AT: 115:0
+PAUSES AT: 151:8
+    112        {
+    113            a();
+    114        }
+ -&gt; 115    #}
+    116    
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 116:0
+PAUSES AT: 151:8
+    113            a();
+    114        }
+    115    }
+ -&gt; 116    #
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 117:0
+PAUSES AT: 151:8
+    114        }
+    115    }
+    116    
+ -&gt; 117    #class Child extends Base {
+    118        constructor()
+    119        {
+    120            super();
+    121            this._child = true;
+    122        }
+    123    
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 118:0
+PAUSES AT: 120:8
+    115    }
+    116    
+    117    class Child extends Base {
+ -&gt; 118    #    constructor()
+    119        {
+ =&gt; 120            |super();
+    121            this._child = true;
+    122        }
+    123    
+
+
+INSERTING AT: 119:0
+PAUSES AT: 120:8
+    116    
+    117    class Child extends Base {
+    118        constructor()
+ -&gt; 119    #    {
+ =&gt; 120            |super();
+    121            this._child = true;
+    122        }
+    123    
+
+
+INSERTING AT: 120:0
+PAUSES AT: 120:8
+    117    class Child extends Base {
+    118        constructor()
+    119        {
+-=&gt; 120    #        |super();
+    121            this._child = true;
+    122        }
+    123    
+
+
+INSERTING AT: 121:0
+PAUSES AT: 121:8
+    118        constructor()
+    119        {
+    120            super();
+-=&gt; 121    #        |this._child = true;
+    122        }
+    123    
+    124        childMethod()
+
+
+INSERTING AT: 122:0
+PAUSES AT: 122:4
+    119        {
+    120            super();
+    121            this._child = true;
+-=&gt; 122    #    |}
+    123    
+    124        childMethod()
+    125        {
+
+
+INSERTING AT: 123:0
+PAUSES AT: 151:8
+    120            super();
+    121            this._child = true;
+    122        }
+ -&gt; 123    #
+    124        childMethod()
+    125        {
+    126            b();
+    127        }
+    128    
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 124:0
+PAUSES AT: 126:8
+    121            this._child = true;
+    122        }
+    123    
+ -&gt; 124    #    childMethod()
+    125        {
+ =&gt; 126            |b();
+    127        }
+    128    
+    129        method()
+
+
+INSERTING AT: 125:0
+PAUSES AT: 126:8
+    122        }
+    123    
+    124        childMethod()
+ -&gt; 125    #    {
+ =&gt; 126            |b();
+    127        }
+    128    
+    129        method()
+
+
+INSERTING AT: 126:0
+PAUSES AT: 126:8
+    123    
+    124        childMethod()
+    125        {
+-=&gt; 126    #        |b();
+    127        }
+    128    
+    129        method()
+
+
+INSERTING AT: 127:0
+PAUSES AT: 127:4
+    124        childMethod()
+    125        {
+    126            b();
+-=&gt; 127    #    |}
+    128    
+    129        method()
+    130        {
+
+
+INSERTING AT: 128:0
+PAUSES AT: 151:8
+    125        {
+    126            b();
+    127        }
+ -&gt; 128    #
+    129        method()
+    130        {
+    131            super.method();
+    132            b();
+    133        }
+    134    
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 129:0
+PAUSES AT: 131:8
+    126            b();
+    127        }
+    128    
+ -&gt; 129    #    method()
+    130        {
+ =&gt; 131            |super.method();
+    132            b();
+    133        }
+    134    
+
+
+INSERTING AT: 130:0
+PAUSES AT: 131:8
+    127        }
+    128    
+    129        method()
+ -&gt; 130    #    {
+ =&gt; 131            |super.method();
+    132            b();
+    133        }
+    134    
+
+
+INSERTING AT: 131:0
+PAUSES AT: 131:8
+    128    
+    129        method()
+    130        {
+-=&gt; 131    #        |super.method();
+    132            b();
+    133        }
+    134    
+
+
+INSERTING AT: 132:0
+PAUSES AT: 132:8
+    129        method()
+    130        {
+    131            super.method();
+-=&gt; 132    #        |b();
+    133        }
+    134    
+    135        get name()
+
+
+INSERTING AT: 133:0
+PAUSES AT: 133:4
+    130        {
+    131            super.method();
+    132            b();
+-=&gt; 133    #    |}
+    134    
+    135        get name()
+    136        {
+
+
+INSERTING AT: 134:0
+PAUSES AT: 151:8
+    131            super.method();
+    132            b();
+    133        }
+ -&gt; 134    #
+    135        get name()
+    136        {
+    137            return this._name;
+    138        }
+    139        
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 135:0
+PAUSES AT: 137:8
+    132            b();
+    133        }
+    134    
+ -&gt; 135    #    get name()
+    136        {
+ =&gt; 137            |return this._name;
+    138        }
+    139        
+    140        set name(x)
+
+
+INSERTING AT: 136:0
+PAUSES AT: 137:8
+    133        }
+    134    
+    135        get name()
+ -&gt; 136    #    {
+ =&gt; 137            |return this._name;
+    138        }
+    139        
+    140        set name(x)
+
+
+INSERTING AT: 137:0
+PAUSES AT: 137:8
+    134    
+    135        get name()
+    136        {
+-=&gt; 137    #        |return this._name;
+    138        }
+    139        
+    140        set name(x)
+
+
+INSERTING AT: 138:0
+PAUSES AT: 138:4
+    135        get name()
+    136        {
+    137            return this._name;
+-=&gt; 138    #    |}
+    139        
+    140        set name(x)
+    141        {
+
+
+INSERTING AT: 139:0
+PAUSES AT: 151:8
+    136        {
+    137            return this._name;
+    138        }
+ -&gt; 139    #    
+    140        set name(x)
+    141        {
+    142            this._name = x;
+    143        }
+    144    }
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 140:0
+PAUSES AT: 142:8
+    137            return this._name;
+    138        }
+    139        
+ -&gt; 140    #    set name(x)
+    141        {
+ =&gt; 142            |this._name = x;
+    143        }
+    144    }
+    145    
+
+
+INSERTING AT: 141:0
+PAUSES AT: 142:8
+    138        }
+    139        
+    140        set name(x)
+ -&gt; 141    #    {
+ =&gt; 142            |this._name = x;
+    143        }
+    144    }
+    145    
+
+
+INSERTING AT: 142:0
+PAUSES AT: 142:8
+    139        
+    140        set name(x)
+    141        {
+-=&gt; 142    #        |this._name = x;
+    143        }
+    144    }
+    145    
+
+
+INSERTING AT: 143:0
+PAUSES AT: 143:4
+    140        set name(x)
+    141        {
+    142            this._name = x;
+-=&gt; 143    #    |}
+    144    }
+    145    
+    146    // ---------
+
+
+INSERTING AT: 144:0
+PAUSES AT: 151:8
+    141        {
+    142            this._name = x;
+    143        }
+ -&gt; 144    #}
+    145    
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 145:0
+PAUSES AT: 151:8
+    142            this._name = x;
+    143        }
+    144    }
+ -&gt; 145    #
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 146:0
+PAUSES AT: 151:8
+    143        }
+    144    }
+    145    
+ -&gt; 146    #// ---------
+    147    /* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 147:0
+PAUSES AT: 151:8
+    144    }
+    145    
+    146    // ---------
+ -&gt; 147    #/* Misc */
+    148    // ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 148:0
+PAUSES AT: 151:8
+    145    
+    146    // ---------
+    147    /* Misc */
+ -&gt; 148    #// ---------
+    149    
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 149:0
+PAUSES AT: 151:8
+    146    // ---------
+    147    /* Misc */
+    148    // ---------
+ -&gt; 149    #
+    150        {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 150:0
+PAUSES AT: 151:8
+    147    /* Misc */
+    148    // ---------
+    149    
+ -&gt; 150    #    {
+ =&gt; 151            |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 151:0
+PAUSES AT: 151:8
+    148    // ---------
+    149    
+    150        {
+-=&gt; 151    #        |a();
+    152        }
+    153    
+    154    label:
+
+
+INSERTING AT: 152:0
+PAUSES AT: 156:8
+    149    
+    150        {
+    151            a();
+ -&gt; 152    #    }
+    153    
+    154    label:
+    155        {
+ =&gt; 156            |a();
+    157        }
+    158    
+    159    var w1 = {x:1, y:2};
+
+
+INSERTING AT: 153:0
+PAUSES AT: 156:8
+    150        {
+    151            a();
+    152        }
+ -&gt; 153    #
+    154    label:
+    155        {
+ =&gt; 156            |a();
+    157        }
+    158    
+    159    var w1 = {x:1, y:2};
+
+
+INSERTING AT: 154:0
+PAUSES AT: 156:8
+    151            a();
+    152        }
+    153    
+ -&gt; 154    #label:
+    155        {
+ =&gt; 156            |a();
+    157        }
+    158    
+    159    var w1 = {x:1, y:2};
+
+
+INSERTING AT: 155:0
+PAUSES AT: 156:8
+    152        }
+    153    
+    154    label:
+ -&gt; 155    #    {
+ =&gt; 156            |a();
+    157        }
+    158    
+    159    var w1 = {x:1, y:2};
+
+
+INSERTING AT: 156:0
+PAUSES AT: 156:8
+    153    
+    154    label:
+    155        {
+-=&gt; 156    #        |a();
+    157        }
+    158    
+    159    var w1 = {x:1, y:2};
+
+
+INSERTING AT: 157:0
+PAUSES AT: 159:0
+    154    label:
+    155        {
+    156            a();
+ -&gt; 157    #    }
+    158    
+ =&gt; 159    |var w1 = {x:1, y:2};
+    160    with (w1) {
+    161        a();
+    162    }
+
+
+INSERTING AT: 158:0
+PAUSES AT: 159:0
+    155        {
+    156            a();
+    157        }
+ -&gt; 158    #
+ =&gt; 159    |var w1 = {x:1, y:2};
+    160    with (w1) {
+    161        a();
+    162    }
+
+
+INSERTING AT: 159:0
+PAUSES AT: 159:0
+    156            a();
+    157        }
+    158    
+-=&gt; 159    |var w1 = {x:1, y:2};
+    160    with (w1) {
+    161        a();
+    162    }
+
+
+INSERTING AT: 160:0
+PAUSES AT: 160:6
+    157        }
+    158    
+    159    var w1 = {x:1, y:2};
+-=&gt; 160    #with (|w1) {
+    161        a();
+    162    }
+    163    
+
+
+INSERTING AT: 161:0
+PAUSES AT: 161:4
+    158    
+    159    var w1 = {x:1, y:2};
+    160    with (w1) {
+-=&gt; 161    #    |a();
+    162    }
+    163    
+    164    var v1 = 1,
+
+
+INSERTING AT: 162:0
+PAUSES AT: 164:0
+    159    var w1 = {x:1, y:2};
+    160    with (w1) {
+    161        a();
+ -&gt; 162    #}
+    163    
+ =&gt; 164    |var v1 = 1,
+    165        v2 = 1;
+    166    let l1 = 2,
+    167        l2 = 2;
+
+
+INSERTING AT: 163:0
+PAUSES AT: 164:0
+    160    with (w1) {
+    161        a();
+    162    }
+ -&gt; 163    #
+ =&gt; 164    |var v1 = 1,
+    165        v2 = 1;
+    166    let l1 = 2,
+    167        l2 = 2;
+
+
+INSERTING AT: 164:0
+PAUSES AT: 164:0
+    161        a();
+    162    }
+    163    
+-=&gt; 164    |var v1 = 1,
+    165        v2 = 1;
+    166    let l1 = 2,
+    167        l2 = 2;
+
+
+INSERTING AT: 165:0
+PAUSES AT: 166:0
+    162    }
+    163    
+    164    var v1 = 1,
+ -&gt; 165    #    v2 = 1;
+ =&gt; 166    |let l1 = 2,
+    167        l2 = 2;
+    168    const c1 = 3,
+    169        c2 = 3;
+
+
+INSERTING AT: 166:0
+PAUSES AT: 166:0
+    163    
+    164    var v1 = 1,
+    165        v2 = 1;
+-=&gt; 166    |let l1 = 2,
+    167        l2 = 2;
+    168    const c1 = 3,
+    169        c2 = 3;
+
+
+INSERTING AT: 167:0
+PAUSES AT: 168:0
+    164    var v1 = 1,
+    165        v2 = 1;
+    166    let l1 = 2,
+ -&gt; 167    #    l2 = 2;
+ =&gt; 168    |const c1 = 3,
+    169        c2 = 3;
+    170    
+    171    v1 = v2 = v1;
+
+
+INSERTING AT: 168:0
+PAUSES AT: 168:0
+    165        v2 = 1;
+    166    let l1 = 2,
+    167        l2 = 2;
+-=&gt; 168    |const c1 = 3,
+    169        c2 = 3;
+    170    
+    171    v1 = v2 = v1;
+
+
+INSERTING AT: 169:0
+PAUSES AT: 171:0
+    166    let l1 = 2,
+    167        l2 = 2;
+    168    const c1 = 3,
+ -&gt; 169    #    c2 = 3;
+    170    
+ =&gt; 171    |v1 = v2 = v1;
+    172    
+    173    var {x, y} = obj;
+    174    var [w, z] = arr;
+
+
+INSERTING AT: 170:0
+PAUSES AT: 171:0
+    167        l2 = 2;
+    168    const c1 = 3,
+    169        c2 = 3;
+ -&gt; 170    #
+ =&gt; 171    |v1 = v2 = v1;
+    172    
+    173    var {x, y} = obj;
+    174    var [w, z] = arr;
+
+
+INSERTING AT: 171:0
+PAUSES AT: 171:0
+    168    const c1 = 3,
+    169        c2 = 3;
+    170    
+-=&gt; 171    |v1 = v2 = v1;
+    172    
+    173    var {x, y} = obj;
+    174    var [w, z] = arr;
+
+
+INSERTING AT: 172:0
+PAUSES AT: 173:0
+    169        c2 = 3;
+    170    
+    171    v1 = v2 = v1;
+ -&gt; 172    #
+ =&gt; 173    |var {x, y} = obj;
+    174    var [w, z] = arr;
+    175    
+    176    var o1 = {
+
+
+INSERTING AT: 173:0
+PAUSES AT: 173:0
+    170    
+    171    v1 = v2 = v1;
+    172    
+-=&gt; 173    |var {x, y} = obj;
+    174    var [w, z] = arr;
+    175    
+    176    var o1 = {
+
+
+INSERTING AT: 174:0
+PAUSES AT: 174:0
+    171    v1 = v2 = v1;
+    172    
+    173    var {x, y} = obj;
+-=&gt; 174    |var [w, z] = arr;
+    175    
+    176    var o1 = {
+    177        p1: 1,
+
+
+INSERTING AT: 175:0
+PAUSES AT: 176:0
+    172    
+    173    var {x, y} = obj;
+    174    var [w, z] = arr;
+ -&gt; 175    #
+ =&gt; 176    |var o1 = {
+    177        p1: 1,
+    178        p2: a(),
+    179        p3: 1,
+
+
+INSERTING AT: 176:0
+PAUSES AT: 176:0
+    173    var {x, y} = obj;
+    174    var [w, z] = arr;
+    175    
+-=&gt; 176    |var o1 = {
+    177        p1: 1,
+    178        p2: a(),
+    179        p3: 1,
+
+
+INSERTING AT: 177:0
+PAUSES AT: 184:0
+    174    var [w, z] = arr;
+    175    
+    176    var o1 = {
+ -&gt; 177    #    p1: 1,
+    178        p2: a(),
+    179        p3: 1,
+    180        [&quot;p4&quot;]: 1,
+    181        [b()]: 1,
+    182    };
+    183    
+ =&gt; 184    |var a1 = [
+    185        1,
+    186        a(),
+    187        1,
+
+
+INSERTING AT: 178:0
+PAUSES AT: 184:0
+    175    
+    176    var o1 = {
+    177        p1: 1,
+ -&gt; 178    #    p2: a(),
+    179        p3: 1,
+    180        [&quot;p4&quot;]: 1,
+    181        [b()]: 1,
+    182    };
+    183    
+ =&gt; 184    |var a1 = [
+    185        1,
+    186        a(),
+    187        1,
+
+
+INSERTING AT: 179:0
+PAUSES AT: 184:0
+    176    var o1 = {
+    177        p1: 1,
+    178        p2: a(),
+ -&gt; 179    #    p3: 1,
+    180        [&quot;p4&quot;]: 1,
+    181        [b()]: 1,
+    182    };
+    183    
+ =&gt; 184    |var a1 = [
+    185        1,
+    186        a(),
+    187        1,
+
+
+INSERTING AT: 180:0
+PAUSES AT: 184:0
+    177        p1: 1,
+    178        p2: a(),
+    179        p3: 1,
+ -&gt; 180    #    [&quot;p4&quot;]: 1,
+    181        [b()]: 1,
+    182    };
+    183    
+ =&gt; 184    |var a1 = [
+    185        1,
+    186        a(),
+    187        1,
+
+
+INSERTING AT: 181:0
+PAUSES AT: 184:0
+    178        p2: a(),
+    179        p3: 1,
+    180        [&quot;p4&quot;]: 1,
+ -&gt; 181    #    [b()]: 1,
+    182    };
+    183    
+ =&gt; 184    |var a1 = [
+    185        1,
+    186        a(),
+    187        1,
+
+
+INSERTING AT: 182:0
+PAUSES AT: 184:0
+    179        p3: 1,
+    180        [&quot;p4&quot;]: 1,
+    181        [b()]: 1,
+ -&gt; 182    #};
+    183    
+ =&gt; 184    |var a1 = [
+    185        1,
+    186        a(),
+    187        1,
+
+
+INSERTING AT: 183:0
+PAUSES AT: 184:0
+    180        [&quot;p4&quot;]: 1,
+    181        [b()]: 1,
+    182    };
+ -&gt; 183    #
+ =&gt; 184    |var a1 = [
+    185        1,
+    186        a(),
+    187        1,
+
+
+INSERTING AT: 184:0
+PAUSES AT: 184:0
+    181        [b()]: 1,
+    182    };
+    183    
+-=&gt; 184    |var a1 = [
+    185        1,
+    186        a(),
+    187        1,
+
+
+INSERTING AT: 185:0
+PAUSES AT: 191:0
+    182    };
+    183    
+    184    var a1 = [
+ -&gt; 185    #    1,
+    186        a(),
+    187        1,
+    188        b(),
+    189    ];
+    190    
+ =&gt; 191    |var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+
+
+INSERTING AT: 186:0
+PAUSES AT: 191:0
+    183    
+    184    var a1 = [
+    185        1,
+ -&gt; 186    #    a(),
+    187        1,
+    188        b(),
+    189    ];
+    190    
+ =&gt; 191    |var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+
+
+INSERTING AT: 187:0
+PAUSES AT: 191:0
+    184    var a1 = [
+    185        1,
+    186        a(),
+ -&gt; 187    #    1,
+    188        b(),
+    189    ];
+    190    
+ =&gt; 191    |var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+
+
+INSERTING AT: 188:0
+PAUSES AT: 191:0
+    185        1,
+    186        a(),
+    187        1,
+ -&gt; 188    #    b(),
+    189    ];
+    190    
+ =&gt; 191    |var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+
+
+INSERTING AT: 189:0
+PAUSES AT: 191:0
+    186        a(),
+    187        1,
+    188        b(),
+ -&gt; 189    #];
+    190    
+ =&gt; 191    |var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+
+
+INSERTING AT: 190:0
+PAUSES AT: 191:0
+    187        1,
+    188        b(),
+    189    ];
+ -&gt; 190    #
+ =&gt; 191    |var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+
+
+INSERTING AT: 191:0
+PAUSES AT: 191:0
+    188        b(),
+    189    ];
+    190    
+-=&gt; 191    |var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+
+
+INSERTING AT: 192:0
+PAUSES AT: 192:0
+    189    ];
+    190    
+    191    var i1 = new Base;
+-=&gt; 192    |var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+    195    i2.method();
+
+
+INSERTING AT: 193:0
+PAUSES AT: 193:0
+    190    
+    191    var i1 = new Base;
+    192    var i2 = new Child;
+-=&gt; 193    |i2.name;
+    194    i2.name = 1;
+    195    i2.method();
+    196    
+
+
+INSERTING AT: 194:0
+PAUSES AT: 194:0
+    191    var i1 = new Base;
+    192    var i2 = new Child;
+    193    i2.name;
+-=&gt; 194    |i2.name = 1;
+    195    i2.method();
+    196    
+    197    var t1 = `${1} ${x=1} ${a()}`;
+
+
+INSERTING AT: 195:0
+PAUSES AT: 195:0
+    192    var i2 = new Child;
+    193    i2.name;
+    194    i2.name = 1;
+-=&gt; 195    |i2.method();
+    196    
+    197    var t1 = `${1} ${x=1} ${a()}`;
+    198    var t2 = a`${1} ${x=1} ${a()}`;
+
+
+INSERTING AT: 196:0
+PAUSES AT: 197:0
+    193    i2.name;
+    194    i2.name = 1;
+    195    i2.method();
+ -&gt; 196    #
+ =&gt; 197    |var t1 = `${1} ${x=1} ${a()}`;
+    198    var t2 = a`${1} ${x=1} ${a()}`;
+    199    
+    200    a(a(), b());
+
+
+INSERTING AT: 197:0
+PAUSES AT: 197:0
+    194    i2.name = 1;
+    195    i2.method();
+    196    
+-=&gt; 197    |var t1 = `${1} ${x=1} ${a()}`;
+    198    var t2 = a`${1} ${x=1} ${a()}`;
+    199    
+    200    a(a(), b());
+
+
+INSERTING AT: 198:0
+PAUSES AT: 198:0
+    195    i2.method();
+    196    
+    197    var t1 = `${1} ${x=1} ${a()}`;
+-=&gt; 198    |var t2 = a`${1} ${x=1} ${a()}`;
+    199    
+    200    a(a(), b());
+    201    
+
+
+INSERTING AT: 199:0
+PAUSES AT: 200:0
+    196    
+    197    var t1 = `${1} ${x=1} ${a()}`;
+    198    var t2 = a`${1} ${x=1} ${a()}`;
+ -&gt; 199    #
+ =&gt; 200    |a(a(), b());
+    201    
+
+
+INSERTING AT: 200:0
+PAUSES AT: 200:0
+    197    var t1 = `${1} ${x=1} ${a()}`;
+    198    var t2 = a`${1} ${x=1} ${a()}`;
+    199    
+-=&gt; 200    |a(a(), b());
+    201    
+
+
+INSERTING AT: 201:0
+PRODUCES: Could not resolve breakpoint
+
+-- Running test case: Debugger.resolvedBreakpoint.dumpEachLine.Functions
+
+INSERTING AT: 0:0
+PAUSES AT: 0:19
+-=&gt;   0    #function inline() {|}
+      1    function named() {
+      2        var x;
+      3    }
+
+
+INSERTING AT: 1:0
+PAUSES AT: 2:4
+      0    function inline() {}
+ -&gt;   1    #function named() {
+ =&gt;   2        |var x;
+      3    }
+      4    function outer1() {
+      5        function inner() {
+
+
+INSERTING AT: 2:0
+PAUSES AT: 2:4
+      0    function inline() {}
+      1    function named() {
+-=&gt;   2    #    |var x;
+      3    }
+      4    function outer1() {
+      5        function inner() {
+
+
+INSERTING AT: 3:0
+PAUSES AT: 3:0
+      0    function inline() {}
+      1    function named() {
+      2        var x;
+-=&gt;   3    |}
+      4    function outer1() {
+      5        function inner() {
+      6            var y;
+
+
+INSERTING AT: 4:0
+PAUSES AT: 8:0
+      1    function named() {
+      2        var x;
+      3    }
+ -&gt;   4    #function outer1() {
+      5        function inner() {
+      6            var y;
+      7        }
+ =&gt;   8    |}
+      9    function outer2()
+     10    {
+     11        function inner()
+
+
+INSERTING AT: 5:0
+PAUSES AT: 6:8
+      2        var x;
+      3    }
+      4    function outer1() {
+ -&gt;   5    #    function inner() {
+ =&gt;   6            |var y;
+      7        }
+      8    }
+      9    function outer2()
+
+
+INSERTING AT: 6:0
+PAUSES AT: 6:8
+      3    }
+      4    function outer1() {
+      5        function inner() {
+-=&gt;   6    #        |var y;
+      7        }
+      8    }
+      9    function outer2()
+
+
+INSERTING AT: 7:0
+PAUSES AT: 7:4
+      4    function outer1() {
+      5        function inner() {
+      6            var y;
+-=&gt;   7    #    |}
+      8    }
+      9    function outer2()
+     10    {
+
+
+INSERTING AT: 8:0
+PAUSES AT: 8:0
+      5        function inner() {
+      6            var y;
+      7        }
+-=&gt;   8    |}
+      9    function outer2()
+     10    {
+     11        function inner()
+
+
+INSERTING AT: 9:0
+PAUSES AT: 15:0
+      6            var y;
+      7        }
+      8    }
+ -&gt;   9    #function outer2()
+     10    {
+     11        function inner()
+     12        {
+     13            var y;
+     14        }
+ =&gt;  15    |}
+     16    function outer3() {
+     17        var x;
+     18        function inner() { var y; }
+
+
+INSERTING AT: 10:0
+PAUSES AT: 15:0
+      7        }
+      8    }
+      9    function outer2()
+ -&gt;  10    #{
+     11        function inner()
+     12        {
+     13            var y;
+     14        }
+ =&gt;  15    |}
+     16    function outer3() {
+     17        var x;
+     18        function inner() { var y; }
+
+
+INSERTING AT: 11:0
+PAUSES AT: 13:8
+      8    }
+      9    function outer2()
+     10    {
+ -&gt;  11    #    function inner()
+     12        {
+ =&gt;  13            |var y;
+     14        }
+     15    }
+     16    function outer3() {
+
+
+INSERTING AT: 12:0
+PAUSES AT: 13:8
+      9    function outer2()
+     10    {
+     11        function inner()
+ -&gt;  12    #    {
+ =&gt;  13            |var y;
+     14        }
+     15    }
+     16    function outer3() {
+
+
+INSERTING AT: 13:0
+PAUSES AT: 13:8
+     10    {
+     11        function inner()
+     12        {
+-=&gt;  13    #        |var y;
+     14        }
+     15    }
+     16    function outer3() {
+
+
+INSERTING AT: 14:0
+PAUSES AT: 14:4
+     11        function inner()
+     12        {
+     13            var y;
+-=&gt;  14    #    |}
+     15    }
+     16    function outer3() {
+     17        var x;
+
+
+INSERTING AT: 15:0
+PAUSES AT: 15:0
+     12        {
+     13            var y;
+     14        }
+-=&gt;  15    |}
+     16    function outer3() {
+     17        var x;
+     18        function inner() { var y; }
+
+
+INSERTING AT: 16:0
+PAUSES AT: 17:4
+     13            var y;
+     14        }
+     15    }
+ -&gt;  16    #function outer3() {
+ =&gt;  17        |var x;
+     18        function inner() { var y; }
+     19    }
+     20    function outer4() {
+
+
+INSERTING AT: 17:0
+PAUSES AT: 17:4
+     14        }
+     15    }
+     16    function outer3() {
+-=&gt;  17    #    |var x;
+     18        function inner() { var y; }
+     19    }
+     20    function outer4() {
+
+
+INSERTING AT: 18:0
+PAUSES AT: 18:23
+     15    }
+     16    function outer3() {
+     17        var x;
+-=&gt;  18    #    function inner() { |var y; }
+     19    }
+     20    function outer4() {
+     21        function inner() { var y; }
+
+
+INSERTING AT: 19:0
+PAUSES AT: 19:0
+     16    function outer3() {
+     17        var x;
+     18        function inner() { var y; }
+-=&gt;  19    |}
+     20    function outer4() {
+     21        function inner() { var y; }
+     22        var x;
+
+
+INSERTING AT: 20:0
+PAUSES AT: 22:4
+     17        var x;
+     18        function inner() { var y; }
+     19    }
+ -&gt;  20    #function outer4() {
+     21        function inner() { var y; }
+ =&gt;  22        |var x;
+     23    }
+     24    function outer5() {
+     25        var x;
+
+
+INSERTING AT: 21:0
+PAUSES AT: 21:23
+     18        function inner() { var y; }
+     19    }
+     20    function outer4() {
+-=&gt;  21    #    function inner() { |var y; }
+     22        var x;
+     23    }
+     24    function outer5() {
+
+
+INSERTING AT: 22:0
+PAUSES AT: 22:4
+     19    }
+     20    function outer4() {
+     21        function inner() { var y; }
+-=&gt;  22    #    |var x;
+     23    }
+     24    function outer5() {
+     25        var x;
+
+
+INSERTING AT: 23:0
+PAUSES AT: 23:0
+     20    function outer4() {
+     21        function inner() { var y; }
+     22        var x;
+-=&gt;  23    |}
+     24    function outer5() {
+     25        var x;
+     26        function inner() { var y; }
+
+
+INSERTING AT: 24:0
+PAUSES AT: 25:4
+     21        function inner() { var y; }
+     22        var x;
+     23    }
+ -&gt;  24    #function outer5() {
+ =&gt;  25        |var x;
+     26        function inner() { var y; }
+     27        var x;
+     28    }
+
+
+INSERTING AT: 25:0
+PAUSES AT: 25:4
+     22        var x;
+     23    }
+     24    function outer5() {
+-=&gt;  25    #    |var x;
+     26        function inner() { var y; }
+     27        var x;
+     28    }
+
+
+INSERTING AT: 26:0
+PAUSES AT: 26:23
+     23    }
+     24    function outer5() {
+     25        var x;
+-=&gt;  26    #    function inner() { |var y; }
+     27        var x;
+     28    }
+     29    function outer6() {
+
+
+INSERTING AT: 27:0
+PAUSES AT: 27:4
+     24    function outer5() {
+     25        var x;
+     26        function inner() { var y; }
+-=&gt;  27    #    |var x;
+     28    }
+     29    function outer6() {
+     30        function inner1() { var y; }
+
+
+INSERTING AT: 28:0
+PAUSES AT: 28:0
+     25        var x;
+     26        function inner() { var y; }
+     27        var x;
+-=&gt;  28    |}
+     29    function outer6() {
+     30        function inner1() { var y; }
+     31        var x;
+
+
+INSERTING AT: 29:0
+PAUSES AT: 31:4
+     26        function inner() { var y; }
+     27        var x;
+     28    }
+ -&gt;  29    #function outer6() {
+     30        function inner1() { var y; }
+ =&gt;  31        |var x;
+     32        function inner2() { var z; }
+     33    }
+     34    function outer7() {
+
+
+INSERTING AT: 30:0
+PAUSES AT: 30:24
+     27        var x;
+     28    }
+     29    function outer6() {
+-=&gt;  30    #    function inner1() { |var y; }
+     31        var x;
+     32        function inner2() { var z; }
+     33    }
+
+
+INSERTING AT: 31:0
+PAUSES AT: 31:4
+     28    }
+     29    function outer6() {
+     30        function inner1() { var y; }
+-=&gt;  31    #    |var x;
+     32        function inner2() { var z; }
+     33    }
+     34    function outer7() {
+
+
+INSERTING AT: 32:0
+PAUSES AT: 32:24
+     29    function outer6() {
+     30        function inner1() { var y; }
+     31        var x;
+-=&gt;  32    #    function inner2() { |var z; }
+     33    }
+     34    function outer7() {
+     35        function inner1() { var y; }
+
+
+INSERTING AT: 33:0
+PAUSES AT: 33:0
+     30        function inner1() { var y; }
+     31        var x;
+     32        function inner2() { var z; }
+-=&gt;  33    |}
+     34    function outer7() {
+     35        function inner1() { var y; }
+     36        function inner2() { var z; }
+
+
+INSERTING AT: 34:0
+PAUSES AT: 37:4
+     31        var x;
+     32        function inner2() { var z; }
+     33    }
+ -&gt;  34    #function outer7() {
+     35        function inner1() { var y; }
+     36        function inner2() { var z; }
+ =&gt;  37        |var x;
+     38    }
+     39    function outer7() {
+     40        function inner1() { var y; }
+
+
+INSERTING AT: 35:0
+PAUSES AT: 35:24
+     32        function inner2() { var z; }
+     33    }
+     34    function outer7() {
+-=&gt;  35    #    function inner1() { |var y; }
+     36        function inner2() { var z; }
+     37        var x;
+     38    }
+
+
+INSERTING AT: 36:0
+PAUSES AT: 36:24
+     33    }
+     34    function outer7() {
+     35        function inner1() { var y; }
+-=&gt;  36    #    function inner2() { |var z; }
+     37        var x;
+     38    }
+     39    function outer7() {
+
+
+INSERTING AT: 37:0
+PAUSES AT: 37:4
+     34    function outer7() {
+     35        function inner1() { var y; }
+     36        function inner2() { var z; }
+-=&gt;  37    #    |var x;
+     38    }
+     39    function outer7() {
+     40        function inner1() { var y; }
+
+
+INSERTING AT: 38:0
+PAUSES AT: 38:0
+     35        function inner1() { var y; }
+     36        function inner2() { var z; }
+     37        var x;
+-=&gt;  38    |}
+     39    function outer7() {
+     40        function inner1() { var y; }
+     41        function inner2() { var z; }
+
+
+INSERTING AT: 39:0
+PAUSES AT: 42:0
+     36        function inner2() { var z; }
+     37        var x;
+     38    }
+ -&gt;  39    #function outer7() {
+     40        function inner1() { var y; }
+     41        function inner2() { var z; }
+ =&gt;  42    |}
+     43    
+     44    (function() {
+     45        var x;
+
+
+INSERTING AT: 40:0
+PAUSES AT: 40:24
+     37        var x;
+     38    }
+     39    function outer7() {
+-=&gt;  40    #    function inner1() { |var y; }
+     41        function inner2() { var z; }
+     42    }
+     43    
+
+
+INSERTING AT: 41:0
+PAUSES AT: 41:24
+     38    }
+     39    function outer7() {
+     40        function inner1() { var y; }
+-=&gt;  41    #    function inner2() { |var z; }
+     42    }
+     43    
+     44    (function() {
+
+
+INSERTING AT: 42:0
+PAUSES AT: 42:0
+     39    function outer7() {
+     40        function inner1() { var y; }
+     41        function inner2() { var z; }
+-=&gt;  42    |}
+     43    
+     44    (function() {
+     45        var x;
+
+
+INSERTING AT: 43:0
+PAUSES AT: 44:0
+     40        function inner1() { var y; }
+     41        function inner2() { var z; }
+     42    }
+ -&gt;  43    #
+ =&gt;  44    |(function() {
+     45        var x;
+     46    })();
+     47    
+
+
+INSERTING AT: 44:0
+PAUSES AT: 44:0
+     41        function inner2() { var z; }
+     42    }
+     43    
+-=&gt;  44    |(function() {
+     45        var x;
+     46    })();
+     47    
+
+
+INSERTING AT: 45:0
+PAUSES AT: 45:4
+     42    }
+     43    
+     44    (function() {
+-=&gt;  45    #    |var x;
+     46    })();
+     47    
+     48    (() =&gt; {
+
+
+INSERTING AT: 46:0
+PAUSES AT: 46:0
+     43    
+     44    (function() {
+     45        var x;
+-=&gt;  46    |})();
+     47    
+     48    (() =&gt; {
+     49        var x;
+
+
+INSERTING AT: 47:0
+PAUSES AT: 48:0
+     44    (function() {
+     45        var x;
+     46    })();
+ -&gt;  47    #
+ =&gt;  48    |(() =&gt; {
+     49        var x;
+     50    });
+     51    
+
+
+INSERTING AT: 48:0
+PAUSES AT: 48:0
+     45        var x;
+     46    })();
+     47    
+-=&gt;  48    |(() =&gt; {
+     49        var x;
+     50    });
+     51    
+
+
+INSERTING AT: 49:0
+PAUSES AT: 49:4
+     46    })();
+     47    
+     48    (() =&gt; {
+-=&gt;  49    #    |var x;
+     50    });
+     51    
+     52    function* generator() {
+
+
+INSERTING AT: 50:0
+PAUSES AT: 50:0
+     47    
+     48    (() =&gt; {
+     49        var x;
+-=&gt;  50    |});
+     51    
+     52    function* generator() {
+     53        var x;
+
+
+INSERTING AT: 51:0
+PAUSES AT: 87:0
+     48    (() =&gt; {
+     49        var x;
+     50    });
+ -&gt;  51    #
+     52    function* generator() {
+     53        var x;
+     54    }
+     55    
+     56    class Class {
+     57        static staticMethod1() {
+     58            var x;
+     59        }
+     60        static staticMethod2()
+     61        {
+     62            var x;
+     63        }
+     64        method1() {
+     65            var x;
+     66        }
+     67        method2()
+     68        {
+     69            var x;
+     70        }
+     71        get getter1() {
+     72            var x;
+     73        }
+     74        get getter2()
+     75        {
+     76            var x;
+     77        }
+     78        set setter1(x) {
+     79            var s;
+     80        }
+     81        set setter2(x)
+     82        {
+     83            var s;
+     84        }
+     85    }
+     86    
+ =&gt;  87    |x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+
+
+INSERTING AT: 52:0
+PAUSES AT: 53:4
+     49        var x;
+     50    });
+     51    
+ -&gt;  52    #function* generator() {
+ =&gt;  53        |var x;
+     54    }
+     55    
+     56    class Class {
+
+
+INSERTING AT: 53:0
+PAUSES AT: 53:4
+     50    });
+     51    
+     52    function* generator() {
+-=&gt;  53    #    |var x;
+     54    }
+     55    
+     56    class Class {
+
+
+INSERTING AT: 54:0
+PAUSES AT: 54:0
+     51    
+     52    function* generator() {
+     53        var x;
+-=&gt;  54    |}
+     55    
+     56    class Class {
+     57        static staticMethod1() {
+
+
+INSERTING AT: 55:0
+PAUSES AT: 87:0
+     52    function* generator() {
+     53        var x;
+     54    }
+ -&gt;  55    #
+     56    class Class {
+     57        static staticMethod1() {
+     58            var x;
+     59        }
+     60        static staticMethod2()
+     61        {
+     62            var x;
+     63        }
+     64        method1() {
+     65            var x;
+     66        }
+     67        method2()
+     68        {
+     69            var x;
+     70        }
+     71        get getter1() {
+     72            var x;
+     73        }
+     74        get getter2()
+     75        {
+     76            var x;
+     77        }
+     78        set setter1(x) {
+     79            var s;
+     80        }
+     81        set setter2(x)
+     82        {
+     83            var s;
+     84        }
+     85    }
+     86    
+ =&gt;  87    |x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+
+
+INSERTING AT: 56:0
+PAUSES AT: 87:0
+     53        var x;
+     54    }
+     55    
+ -&gt;  56    #class Class {
+     57        static staticMethod1() {
+     58            var x;
+     59        }
+     60        static staticMethod2()
+     61        {
+     62            var x;
+     63        }
+     64        method1() {
+     65            var x;
+     66        }
+     67        method2()
+     68        {
+     69            var x;
+     70        }
+     71        get getter1() {
+     72            var x;
+     73        }
+     74        get getter2()
+     75        {
+     76            var x;
+     77        }
+     78        set setter1(x) {
+     79            var s;
+     80        }
+     81        set setter2(x)
+     82        {
+     83            var s;
+     84        }
+     85    }
+     86    
+ =&gt;  87    |x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+
+
+INSERTING AT: 57:0
+PAUSES AT: 58:8
+     54    }
+     55    
+     56    class Class {
+ -&gt;  57    #    static staticMethod1() {
+ =&gt;  58            |var x;
+     59        }
+     60        static staticMethod2()
+     61        {
+
+
+INSERTING AT: 58:0
+PAUSES AT: 58:8
+     55    
+     56    class Class {
+     57        static staticMethod1() {
+-=&gt;  58    #        |var x;
+     59        }
+     60        static staticMethod2()
+     61        {
+
+
+INSERTING AT: 59:0
+PAUSES AT: 59:4
+     56    class Class {
+     57        static staticMethod1() {
+     58            var x;
+-=&gt;  59    #    |}
+     60        static staticMethod2()
+     61        {
+     62            var x;
+
+
+INSERTING AT: 60:0
+PAUSES AT: 62:8
+     57        static staticMethod1() {
+     58            var x;
+     59        }
+ -&gt;  60    #    static staticMethod2()
+     61        {
+ =&gt;  62            |var x;
+     63        }
+     64        method1() {
+     65            var x;
+
+
+INSERTING AT: 61:0
+PAUSES AT: 62:8
+     58            var x;
+     59        }
+     60        static staticMethod2()
+ -&gt;  61    #    {
+ =&gt;  62            |var x;
+     63        }
+     64        method1() {
+     65            var x;
+
+
+INSERTING AT: 62:0
+PAUSES AT: 62:8
+     59        }
+     60        static staticMethod2()
+     61        {
+-=&gt;  62    #        |var x;
+     63        }
+     64        method1() {
+     65            var x;
+
+
+INSERTING AT: 63:0
+PAUSES AT: 63:4
+     60        static staticMethod2()
+     61        {
+     62            var x;
+-=&gt;  63    #    |}
+     64        method1() {
+     65            var x;
+     66        }
+
+
+INSERTING AT: 64:0
+PAUSES AT: 65:8
+     61        {
+     62            var x;
+     63        }
+ -&gt;  64    #    method1() {
+ =&gt;  65            |var x;
+     66        }
+     67        method2()
+     68        {
+
+
+INSERTING AT: 65:0
+PAUSES AT: 65:8
+     62            var x;
+     63        }
+     64        method1() {
+-=&gt;  65    #        |var x;
+     66        }
+     67        method2()
+     68        {
+
+
+INSERTING AT: 66:0
+PAUSES AT: 66:4
+     63        }
+     64        method1() {
+     65            var x;
+-=&gt;  66    #    |}
+     67        method2()
+     68        {
+     69            var x;
+
+
+INSERTING AT: 67:0
+PAUSES AT: 69:8
+     64        method1() {
+     65            var x;
+     66        }
+ -&gt;  67    #    method2()
+     68        {
+ =&gt;  69            |var x;
+     70        }
+     71        get getter1() {
+     72            var x;
+
+
+INSERTING AT: 68:0
+PAUSES AT: 69:8
+     65            var x;
+     66        }
+     67        method2()
+ -&gt;  68    #    {
+ =&gt;  69            |var x;
+     70        }
+     71        get getter1() {
+     72            var x;
+
+
+INSERTING AT: 69:0
+PAUSES AT: 69:8
+     66        }
+     67        method2()
+     68        {
+-=&gt;  69    #        |var x;
+     70        }
+     71        get getter1() {
+     72            var x;
+
+
+INSERTING AT: 70:0
+PAUSES AT: 70:4
+     67        method2()
+     68        {
+     69            var x;
+-=&gt;  70    #    |}
+     71        get getter1() {
+     72            var x;
+     73        }
+
+
+INSERTING AT: 71:0
+PAUSES AT: 72:8
+     68        {
+     69            var x;
+     70        }
+ -&gt;  71    #    get getter1() {
+ =&gt;  72            |var x;
+     73        }
+     74        get getter2()
+     75        {
+
+
+INSERTING AT: 72:0
+PAUSES AT: 72:8
+     69            var x;
+     70        }
+     71        get getter1() {
+-=&gt;  72    #        |var x;
+     73        }
+     74        get getter2()
+     75        {
+
+
+INSERTING AT: 73:0
+PAUSES AT: 73:4
+     70        }
+     71        get getter1() {
+     72            var x;
+-=&gt;  73    #    |}
+     74        get getter2()
+     75        {
+     76            var x;
+
+
+INSERTING AT: 74:0
+PAUSES AT: 76:8
+     71        get getter1() {
+     72            var x;
+     73        }
+ -&gt;  74    #    get getter2()
+     75        {
+ =&gt;  76            |var x;
+     77        }
+     78        set setter1(x) {
+     79            var s;
+
+
+INSERTING AT: 75:0
+PAUSES AT: 76:8
+     72            var x;
+     73        }
+     74        get getter2()
+ -&gt;  75    #    {
+ =&gt;  76            |var x;
+     77        }
+     78        set setter1(x) {
+     79            var s;
+
+
+INSERTING AT: 76:0
+PAUSES AT: 76:8
+     73        }
+     74        get getter2()
+     75        {
+-=&gt;  76    #        |var x;
+     77        }
+     78        set setter1(x) {
+     79            var s;
+
+
+INSERTING AT: 77:0
+PAUSES AT: 77:4
+     74        get getter2()
+     75        {
+     76            var x;
+-=&gt;  77    #    |}
+     78        set setter1(x) {
+     79            var s;
+     80        }
+
+
+INSERTING AT: 78:0
+PAUSES AT: 79:8
+     75        {
+     76            var x;
+     77        }
+ -&gt;  78    #    set setter1(x) {
+ =&gt;  79            |var s;
+     80        }
+     81        set setter2(x)
+     82        {
+
+
+INSERTING AT: 79:0
+PAUSES AT: 79:8
+     76            var x;
+     77        }
+     78        set setter1(x) {
+-=&gt;  79    #        |var s;
+     80        }
+     81        set setter2(x)
+     82        {
+
+
+INSERTING AT: 80:0
+PAUSES AT: 80:4
+     77        }
+     78        set setter1(x) {
+     79            var s;
+-=&gt;  80    #    |}
+     81        set setter2(x)
+     82        {
+     83            var s;
+
+
+INSERTING AT: 81:0
+PAUSES AT: 83:8
+     78        set setter1(x) {
+     79            var s;
+     80        }
+ -&gt;  81    #    set setter2(x)
+     82        {
+ =&gt;  83            |var s;
+     84        }
+     85    }
+     86    
+
+
+INSERTING AT: 82:0
+PAUSES AT: 83:8
+     79            var s;
+     80        }
+     81        set setter2(x)
+ -&gt;  82    #    {
+ =&gt;  83            |var s;
+     84        }
+     85    }
+     86    
+
+
+INSERTING AT: 83:0
+PAUSES AT: 83:8
+     80        }
+     81        set setter2(x)
+     82        {
+-=&gt;  83    #        |var s;
+     84        }
+     85    }
+     86    
+
+
+INSERTING AT: 84:0
+PAUSES AT: 84:4
+     81        set setter2(x)
+     82        {
+     83            var s;
+-=&gt;  84    #    |}
+     85    }
+     86    
+     87    x =&gt; x;
+
+
+INSERTING AT: 85:0
+PAUSES AT: 87:0
+     82        {
+     83            var s;
+     84        }
+ -&gt;  85    #}
+     86    
+ =&gt;  87    |x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+
+
+INSERTING AT: 86:0
+PAUSES AT: 87:0
+     83            var s;
+     84        }
+     85    }
+ -&gt;  86    #
+ =&gt;  87    |x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+
+
+INSERTING AT: 87:0
+PAUSES AT: 87:0
+     84        }
+     85    }
+     86    
+-=&gt;  87    |x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+
+
+INSERTING AT: 88:0
+PAUSES AT: 88:0
+     85    }
+     86    
+     87    x =&gt; x;
+-=&gt;  88    |() =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+
+
+INSERTING AT: 89:0
+PAUSES AT: 89:0
+     86    
+     87    x =&gt; x;
+     88    () =&gt; 1;
+-=&gt;  89    |(x) =&gt; x;
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+     92        x
+
+
+INSERTING AT: 90:0
+PAUSES AT: 90:0
+     87    x =&gt; x;
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+-=&gt;  90    |(x) =&gt; { x };
+     91    (x) =&gt; {
+     92        x
+     93    };
+
+
+INSERTING AT: 91:0
+PAUSES AT: 91:0
+     88    () =&gt; 1;
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+-=&gt;  91    |(x) =&gt; {
+     92        x
+     93    };
+     94    () =&gt; {
+
+
+INSERTING AT: 92:0
+PAUSES AT: 92:4
+     89    (x) =&gt; x;
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+-=&gt;  92    #    |x
+     93    };
+     94    () =&gt; {
+     95        var x;
+
+
+INSERTING AT: 93:0
+PAUSES AT: 93:0
+     90    (x) =&gt; { x };
+     91    (x) =&gt; {
+     92        x
+-=&gt;  93    |};
+     94    () =&gt; {
+     95        var x;
+     96    };
+
+
+INSERTING AT: 94:0
+PAUSES AT: 94:0
+     91    (x) =&gt; {
+     92        x
+     93    };
+-=&gt;  94    |() =&gt; {
+     95        var x;
+     96    };
+     97    
+
+
+INSERTING AT: 95:0
+PAUSES AT: 95:4
+     92        x
+     93    };
+     94    () =&gt; {
+-=&gt;  95    #    |var x;
+     96    };
+     97    
+     98    var fObj = {
+
+
+INSERTING AT: 96:0
+PAUSES AT: 96:0
+     93    };
+     94    () =&gt; {
+     95        var x;
+-=&gt;  96    |};
+     97    
+     98    var fObj = {
+     99        f1: function() {
+
+
+INSERTING AT: 97:0
+PAUSES AT: 98:0
+     94    () =&gt; {
+     95        var x;
+     96    };
+ -&gt;  97    #
+ =&gt;  98    |var fObj = {
+     99        f1: function() {
+    100            var x;
+    101        },
+
+
+INSERTING AT: 98:0
+PAUSES AT: 98:0
+     95        var x;
+     96    };
+     97    
+-=&gt;  98    |var fObj = {
+     99        f1: function() {
+    100            var x;
+    101        },
+
+
+INSERTING AT: 99:0
+PAUSES AT: 100:8
+     96    };
+     97    
+     98    var fObj = {
+ -&gt;  99    #    f1: function() {
+ =&gt; 100            |var x;
+    101        },
+    102        f2: function()
+    103        {
+
+
+INSERTING AT: 100:0
+PAUSES AT: 100:8
+     97    
+     98    var fObj = {
+     99        f1: function() {
+-=&gt; 100    #        |var x;
+    101        },
+    102        f2: function()
+    103        {
+
+
+INSERTING AT: 101:0
+PAUSES AT: 101:4
+     98    var fObj = {
+     99        f1: function() {
+    100            var x;
+-=&gt; 101    #    |},
+    102        f2: function()
+    103        {
+    104            var x;
+
+
+INSERTING AT: 102:0
+PAUSES AT: 104:8
+     99        f1: function() {
+    100            var x;
+    101        },
+ -&gt; 102    #    f2: function()
+    103        {
+ =&gt; 104            |var x;
+    105        },
+    106        f3: () =&gt; {
+    107            var x;
+
+
+INSERTING AT: 103:0
+PAUSES AT: 104:8
+    100            var x;
+    101        },
+    102        f2: function()
+ -&gt; 103    #    {
+ =&gt; 104            |var x;
+    105        },
+    106        f3: () =&gt; {
+    107            var x;
+
+
+INSERTING AT: 104:0
+PAUSES AT: 104:8
+    101        },
+    102        f2: function()
+    103        {
+-=&gt; 104    #        |var x;
+    105        },
+    106        f3: () =&gt; {
+    107            var x;
+
+
+INSERTING AT: 105:0
+PAUSES AT: 105:4
+    102        f2: function()
+    103        {
+    104            var x;
+-=&gt; 105    #    |},
+    106        f3: () =&gt; {
+    107            var x;
+    108        },
+
+
+INSERTING AT: 106:0
+PAUSES AT: 107:8
+    103        {
+    104            var x;
+    105        },
+ -&gt; 106    #    f3: () =&gt; {
+ =&gt; 107            |var x;
+    108        },
+    109        f4: () =&gt;
+    110        {
+
+
+INSERTING AT: 107:0
+PAUSES AT: 107:8
+    104            var x;
+    105        },
+    106        f3: () =&gt; {
+-=&gt; 107    #        |var x;
+    108        },
+    109        f4: () =&gt;
+    110        {
+
+
+INSERTING AT: 108:0
+PAUSES AT: 108:4
+    105        },
+    106        f3: () =&gt; {
+    107            var x;
+-=&gt; 108    #    |},
+    109        f4: () =&gt;
+    110        {
+    111            var x;
+
+
+INSERTING AT: 109:0
+PAUSES AT: 111:8
+    106        f3: () =&gt; {
+    107            var x;
+    108        },
+ -&gt; 109    #    f4: () =&gt;
+    110        {
+ =&gt; 111            |var x;
+    112        }   
+    113    };
+    114    
+
+
+INSERTING AT: 110:0
+PAUSES AT: 111:8
+    107            var x;
+    108        },
+    109        f4: () =&gt;
+ -&gt; 110    #    {
+ =&gt; 111            |var x;
+    112        }   
+    113    };
+    114    
+
+
+INSERTING AT: 111:0
+PAUSES AT: 111:8
+    108        },
+    109        f4: () =&gt;
+    110        {
+-=&gt; 111    #        |var x;
+    112        }   
+    113    };
+    114    
+
+
+INSERTING AT: 112:0
+PAUSES AT: 112:4
+    109        f4: () =&gt;
+    110        {
+    111            var x;
+-=&gt; 112    #    |}   
+    113    };
+    114    
+
+
+INSERTING AT: 113:0
+PRODUCES: Could not resolve breakpoint
+
+INSERTING AT: 114:0
+PRODUCES: Could not resolve breakpoint
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerbreakpointsresolveddumpeachlinehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-each-line.html (0 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-each-line.html                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/breakpoints/resolved-dump-each-line.html        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../../http/tests/inspector/resources/inspector-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../resources/log-pause-location.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/dump.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/dump-general.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;resources/dump-functions.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+function test()
+{
+    let suite = InspectorTest.createAsyncSuite(&quot;Debugger.resolvedBreakpoint.dumpEachLine&quot;);
+
+    window.addDumpEachLinePauseLocationTestCase(suite, {
+        name: &quot;Debugger.resolvedBreakpoint.dumpEachLine.General&quot;,
+        scriptRegex: /dump-general\.js$/,
+    });
+
+    window.addDumpEachLinePauseLocationTestCase(suite, {
+        name: &quot;Debugger.resolvedBreakpoint.dumpEachLine.Functions&quot;,
+        scriptRegex: /dump-functions\.js$/,
+    });
+
+    suite.runTestCasesAndFinish();
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;runTest()&quot;&gt;
+&lt;p&gt;Checking resolved breakpoint locations for each line in a script.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerbreakpointsresourcesdumpfunctionsjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump-functions.js (0 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump-functions.js                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump-functions.js        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -0,0 +1,114 @@
</span><ins>+function inline() {}
+function named() {
+    var x;
+}
+function outer1() {
+    function inner() {
+        var y;
+    }
+}
+function outer2()
+{
+    function inner()
+    {
+        var y;
+    }
+}
+function outer3() {
+    var x;
+    function inner() { var y; }
+}
+function outer4() {
+    function inner() { var y; }
+    var x;
+}
+function outer5() {
+    var x;
+    function inner() { var y; }
+    var x;
+}
+function outer6() {
+    function inner1() { var y; }
+    var x;
+    function inner2() { var z; }
+}
+function outer7() {
+    function inner1() { var y; }
+    function inner2() { var z; }
+    var x;
+}
+function outer7() {
+    function inner1() { var y; }
+    function inner2() { var z; }
+}
+
+(function() {
+    var x;
+})();
+
+(() =&gt; {
+    var x;
+});
+
+function* generator() {
+    var x;
+}
+
+class Class {
+    static staticMethod1() {
+        var x;
+    }
+    static staticMethod2()
+    {
+        var x;
+    }
+    method1() {
+        var x;
+    }
+    method2()
+    {
+        var x;
+    }
+    get getter1() {
+        var x;
+    }
+    get getter2()
+    {
+        var x;
+    }
+    set setter1(x) {
+        var s;
+    }
+    set setter2(x)
+    {
+        var s;
+    }
+}
+
+x =&gt; x;
+() =&gt; 1;
+(x) =&gt; x;
+(x) =&gt; { x };
+(x) =&gt; {
+    x
+};
+() =&gt; {
+    var x;
+};
+
+var fObj = {
+    f1: function() {
+        var x;
+    },
+    f2: function()
+    {
+        var x;
+    },
+    f3: () =&gt; {
+        var x;
+    },
+    f4: () =&gt;
+    {
+        var x;
+    }   
+};
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerbreakpointsresourcesdumpgeneraljs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump-general.js (0 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump-general.js                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump-general.js        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -0,0 +1,201 @@
</span><ins>+let a=function(){return 0}
+let b=function(){return 0}
+let c=function(){return 0}
+let arr=[];
+let obj={};
+
+// Control flow
+
+if (0)
+    a();
+
+if (0) {
+    a();
+}
+
+if (0)
+    a();
+else if (0)
+    a();
+else
+    a();
+
+a() ? b() : c()
+
+// Loops
+
+while (0)
+    a();
+
+while (0) {
+    a();
+}
+
+do {
+    a();
+} while (0);
+
+for (a(); b(); c())
+    break;
+
+for (; b(); c())
+    break;
+
+for (a(); b();)
+    break;
+
+for (a();; c())
+    break;
+
+for (a();;)
+    break;
+
+for (; b();)
+    break;
+
+for (;; c())
+    break;
+
+for (;;)
+    break;
+
+for (a(); b(); c()) {
+    break;
+}
+
+for (let x of arr)
+    break;
+
+for (let x in obj)
+    break;
+
+// Switch
+
+switch (0) {
+case 1:
+    a();
+    break;
+case 2:
+    a();
+    // fallthrough
+case 3:
+    a();
+    break;
+default:
+    a();
+    break;
+}
+
+// Try/Catch
+
+try {
+    a();
+} catch (e) {
+    shouldNotBeReached();
+} finally {
+    b();
+}
+
+// Class
+
+class Base {
+    constructor()
+    {
+        this._base = true;
+    }
+
+    baseMethod()
+    {
+        a();
+    }
+
+    method()
+    {
+        a();
+    }
+}
+
+class Child extends Base {
+    constructor()
+    {
+        super();
+        this._child = true;
+    }
+
+    childMethod()
+    {
+        b();
+    }
+
+    method()
+    {
+        super.method();
+        b();
+    }
+
+    get name()
+    {
+        return this._name;
+    }
+    
+    set name(x)
+    {
+        this._name = x;
+    }
+}
+
+// ---------
+/* Misc */
+// ---------
+
+    {
+        a();
+    }
+
+label:
+    {
+        a();
+    }
+
+var w1 = {x:1, y:2};
+with (w1) {
+    a();
+}
+
+var v1 = 1,
+    v2 = 1;
+let l1 = 2,
+    l2 = 2;
+const c1 = 3,
+    c2 = 3;
+
+v1 = v2 = v1;
+
+var {x, y} = obj;
+var [w, z] = arr;
+
+var o1 = {
+    p1: 1,
+    p2: a(),
+    p3: 1,
+    [&quot;p4&quot;]: 1,
+    [b()]: 1,
+};
+
+var a1 = [
+    1,
+    a(),
+    1,
+    b(),
+];
+
+var i1 = new Base;
+var i2 = new Child;
+i2.name;
+i2.name = 1;
+i2.method();
+
+var t1 = `${1} ${x=1} ${a()}`;
+var t2 = a`${1} ${x=1} ${a()}`;
+
+a(a(), b());
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerbreakpointsresourcesdumpjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump.js (0 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump.js                                (rev 0)
+++ trunk/LayoutTests/inspector/debugger/breakpoints/resources/dump.js        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -0,0 +1,88 @@
</span><ins>+TestPage.registerInitializer(() =&gt; {
+    // Debugger.Location
+    function createLocation(script, lineNumber, columnNumber) {
+        return {scriptId: script.id, lineNumber, columnNumber};
+    }
+
+    // Dump all pause locations test.
+    // Tries to set a breakpoint at every line:column in the file and
+    // logs all unique pause locations with the originator line:column.
+    window.addDumpAllPauseLocationsTestCase = function(suite, {name, scriptRegex}) {
+        suite.addTestCase({
+            name, test(resolve, reject) {
+                let script = window.findScript(scriptRegex);
+                window.loadLinesFromSourceCode(script).then((lines) =&gt; {
+                    // Iterate all possible pause locations in this file.
+                    let pauseLocations = new Map;
+                    let seenPauseLocations = new Set;
+
+                    for (let line = script.range.startLine; line &lt;= script.range.endLine; ++line) {
+                        let max = lines[line].length;
+                        for (let column = 0; column &lt;= max; ++column) {
+                            DebuggerAgent.setBreakpoint(createLocation(script, line, column), (error, breakpointId, location) =&gt; {
+                                if (error)
+                                    return;
+                                let key = JSON.stringify(location);
+                                if (seenPauseLocations.has(key))
+                                    return;
+                                pauseLocations.set({lineNumber: line, columnNumber: column}, location);
+                            });
+                        }
+                    }
+
+                    // Log the unique locations and the first input that produced it.
+                    InspectorBackend.runAfterPendingDispatches(() =&gt; {
+                        InspectorTest.log(&quot;&quot;);
+                        for (let [inputLocation, payload] of pauseLocations) {
+                            InspectorTest.log(`INSERTING AT: ${inputLocation.lineNumber}:${inputLocation.columnNumber}`);
+                            InspectorTest.log(`PAUSES AT: ${payload.lineNumber}:${payload.columnNumber}`);
+                            let resolvedLocation = script.createSourceCodeLocation(payload.lineNumber, payload.columnNumber);
+                            window.logResolvedBreakpointLinesWithContext(inputLocation, resolvedLocation, 3);
+                            InspectorTest.log(&quot;&quot;);
+                        }
+                        resolve();
+                    });
+                });
+            }
+        });
+    }
+
+    // Dump each line test.
+    // Tries to set a breakpoint at every line:0 in the file and
+    // logs its pause location. Clears breakpoints before each line.
+    window.addDumpEachLinePauseLocationTestCase = function(suite, {name, scriptRegex}) {
+        suite.addTestCase({
+            name, test(resolve, reject) {
+                let script = window.findScript(scriptRegex);
+                window.loadLinesFromSourceCode(script).then(() =&gt; {
+                    // Set one breakpoint per line.
+                    for (let line = script.range.startLine; line &lt;= script.range.endLine; ++line) {
+                        DebuggerAgent.setBreakpoint(createLocation(script, line, 0), (error, breakpointId, payload) =&gt; {
+                            InspectorTest.log(&quot;&quot;);
+                            if (error) {
+                                InspectorTest.log(`INSERTING AT: ${line}:0`);
+                                InspectorTest.log(`PRODUCES: ${error}`);
+                            } else {
+                                let inputLocation = {lineNumber: line, columnNumber: 0};
+                                let resolvedLocation = script.createSourceCodeLocation(payload.lineNumber, payload.columnNumber);
+                                InspectorTest.log(`INSERTING AT: ${inputLocation.lineNumber}:${inputLocation.columnNumber}`);
+                                InspectorTest.log(`PAUSES AT: ${payload.lineNumber}:${payload.columnNumber}`);                                
+                                window.logResolvedBreakpointLinesWithContext(inputLocation, resolvedLocation, 3);
+                                InspectorTest.log(&quot;&quot;);
+                            }
+                        });
+
+                        // Clear the breakpoint we just set without knowing its breakpoint identifier.
+                        DebuggerAgent.disable();
+                        DebuggerAgent.enable();
+                    }
+
+                    // Resolve after all lines have been tried.
+                    InspectorBackend.runAfterPendingDispatches(() =&gt; {
+                        resolve();
+                    });
+                });
+            }
+        });
+    }
+});
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggerresourceslogpauselocationjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/debugger/resources/log-pause-location.js (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/resources/log-pause-location.js        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/LayoutTests/inspector/debugger/resources/log-pause-location.js        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -1,5 +1,6 @@
</span><span class="cx"> TestPage.registerInitializer(() =&gt; {
</span><span class="cx">     let lines = [];
</span><ins>+    let linesSourceCode = null;
</ins><span class="cx"> 
</span><span class="cx">     // Switch back to String.prototype.padStart once this is fixed:
</span><span class="cx">     // FIXME: &lt;https://webkit.org/b/161944&gt; stringProtoFuncRepeatCharacter will return `null` when it should not
</span><span class="lines">@@ -10,16 +11,82 @@
</span><span class="cx">         return &quot; &quot;.repeat(desired - length) + this;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    function insertCaretIntoStringAtIndex(str, index) {
-        return str.slice(0, index) + &quot;|&quot; + str.slice(index);
</del><ins>+    function insertCaretIntoStringAtIndex(str, index, caret=&quot;|&quot;) {
+        return str.slice(0, index) + caret + str.slice(index);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    function logLinesWithContext(location, context) {
-        if (!WebInspector.frameResourceManager.mainFrame.mainResource.scripts.includes(location.sourceCode)) {
</del><ins>+    window.findScript = function(regex) {
+        let resources = WebInspector.frameResourceManager.mainFrame.resources;
+        for (let resource of resources) {
+            if (regex.test(resource.url))
+                return resource.scripts[0];
+        }
+    }
+
+    window.loadLinesFromSourceCode = function(sourceCode) {
+        linesSourceCode = sourceCode;
+        return sourceCode.requestContent()
+            .then((content) =&gt; {
+                lines = sourceCode.content.split(/\n/);
+                return lines;
+            })
+            .catch(() =&gt; {
+                InspectorTest.fail(&quot;Failed to load script content.&quot;);
+                InspectorTest.completeTest();
+            });
+    }
+
+    window.loadMainPageContent = function() {
+        return loadLinesFromSourceCode(WebInspector.frameResourceManager.mainFrame.mainResource);
+    }
+
+    window.logResolvedBreakpointLinesWithContext = function(inputLocation, resolvedLocation, context) {
+        if (resolvedLocation.sourceCode !== linesSourceCode &amp;&amp; !WebInspector.frameResourceManager.mainFrame.mainResource.scripts.includes(resolvedLocation.sourceCode)) {
</ins><span class="cx">             InspectorTest.log(&quot;--- Source Unavailable ---&quot;);
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        InspectorTest.assert(inputLocation.lineNumber &lt;= resolvedLocation.lineNumber, &quot;Input line number should always precede resolve location line number.&quot;);
+        InspectorTest.assert(inputLocation.lineNumber !== resolvedLocation.lineNumber || inputLocation.columnNumber &lt;= resolvedLocation.columnNumber, &quot;Input position should always precede resolve position.&quot;);
+
+        const inputCaret = &quot;#&quot;;
+        const resolvedCaret = &quot;|&quot;;
+
+        let startLine = inputLocation.lineNumber - context;
+        let endLine = resolvedLocation.lineNumber + context;
+        for (let lineNumber = startLine; lineNumber &lt;= endLine; ++lineNumber) {
+            let lineContent = lines[lineNumber];
+            if (typeof lineContent !== &quot;string&quot;)
+                continue;
+
+            let hasInputLocation = lineNumber === inputLocation.lineNumber;
+            let hasResolvedLocation = lineNumber === resolvedLocation.lineNumber;
+
+            let prefix = &quot;    &quot;;
+            if (hasInputLocation &amp;&amp; hasResolvedLocation) {
+                prefix = &quot;-=&gt; &quot;;
+                lineContent = insertCaretIntoStringAtIndex(lineContent, resolvedLocation.columnNumber, resolvedCaret);
+                if (inputLocation.columnNumber !== resolvedLocation.columnNumber)
+                    lineContent = insertCaretIntoStringAtIndex(lineContent, inputLocation.columnNumber, inputCaret);
+            } else if (hasInputLocation) {
+                prefix = &quot; -&gt; &quot;;
+                lineContent = insertCaretIntoStringAtIndex(lineContent, inputLocation.columnNumber, inputCaret);
+            } else if (hasResolvedLocation) {
+                prefix = &quot; =&gt; &quot;;
+                lineContent = insertCaretIntoStringAtIndex(lineContent, resolvedLocation.columnNumber, resolvedCaret);
+            }
+
+            let number = lineNumber.toString().myPadStart(3);
+            InspectorTest.log(`${prefix}${number}    ${lineContent}`);
+        }
+    }
+
+    window.logLinesWithContext = function(location, context) {
+        if (location.sourceCode !== linesSourceCode &amp;&amp; !WebInspector.frameResourceManager.mainFrame.mainResource.scripts.includes(location.sourceCode)) {
+            InspectorTest.log(&quot;--- Source Unavailable ---&quot;);
+            return;
+        }
+
</ins><span class="cx">         let startLine = location.lineNumber - context;
</span><span class="cx">         let endLine = location.lineNumber + context;
</span><span class="cx">         for (let lineNumber = startLine; lineNumber &lt;= endLine; ++lineNumber) {
</span><span class="lines">@@ -108,17 +175,6 @@
</span><span class="cx">             }
</span><span class="cx">         });
</span><span class="cx">     }
</span><del>-
-    window.loadMainPageContent = function() {
-        return WebInspector.frameResourceManager.mainFrame.mainResource.requestContent()
-            .then((content) =&gt; {
-                lines = WebInspector.frameResourceManager.mainFrame.mainResource.content.split(/\n/);
-            })
-            .catch(() =&gt; {
-                InspectorTest.fail(&quot;Failed to load page content.&quot;);
-                InspectorTest.completeTest();
-            });
-    }
</del><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> if (!window.testRunner) {
</span></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggersetBreakpointexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/debugger/setBreakpoint-expected.txt (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/setBreakpoint-expected.txt        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/LayoutTests/inspector/debugger/setBreakpoint-expected.txt        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> Debugger.setBreakpoint on line:0 in &lt;script src=&quot;...&quot;&gt;
</span><span class="cx"> 
</span><span class="cx"> Found breakpoint.js
</span><del>-PASS: Received error setting duplicate breakpoint: Breakpoint at specified location already exists.
</del><ins>+PASS: Received error setting duplicate breakpoint: Breakpoint at specified location already exists
</ins><span class="cx"> Running breakpointBasic
</span><span class="cx"> inside breakpointBasic
</span><span class="cx"> Hit Breakpoint!
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreAPIJSScriptRefcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/API/JSScriptRef.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/API/JSScriptRef.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/API/JSScriptRef.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     OpaqueJSScript(VM* vm, const String&amp; url, int startingLineNumber, const String&amp; source)
</span><del>-        : SourceProvider(url, TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber::first()))
</del><ins>+        : SourceProvider(url, TextPosition(OrdinalNumber::fromOneBasedInt(startingLineNumber), OrdinalNumber::first()), SourceProviderSourceType::Program)
</ins><span class="cx">         , m_vm(vm)
</span><span class="cx">         , m_source(source.isNull() ? *StringImpl::empty() : *source.impl())
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -248,6 +248,7 @@
</span><span class="cx">     debugger/Debugger.cpp
</span><span class="cx">     debugger/DebuggerCallFrame.cpp
</span><span class="cx">     debugger/DebuggerLocation.cpp
</span><ins>+    debugger/DebuggerParseData.cpp
</ins><span class="cx">     debugger/DebuggerScope.cpp
</span><span class="cx"> 
</span><span class="cx">     dfg/DFGAbstractHeap.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -1,5 +1,255 @@
</span><span class="cx"> 2016-09-30  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Breakpoints on blank lines or comments don't break
+        https://bugs.webkit.org/show_bug.cgi?id=9885
+        &lt;rdar://problem/6134406&gt;
+
+        Reviewed by Mark Lam.
+
+        This change introduces a way to perform a Debugger Parse of a script.
+        This debugger parse gathers a list of breakpoint locations, which
+        the backend uses to resolve breakpoint locations that came from the
+        Inspector frontend to the exact location we would actually pause.
+        We gather this information from the parser so that we can eagerly
+        get this information without requiring the code to have executed (the
+        real op_debugs are generated during bytecode generation when code
+        is actually evaluated).
+
+        If an input location was on a line with whitespace or a comment, the
+        resolved breakpoint location would be before the next statement that
+        will be executed. That may be the next line, or even later. We also
+        update our policy when setting breakpoints on and around function
+        statements to better match user expectations.
+
+        For example, when resolving breakpoints in:
+
+            1.  // Comment
+            2.  before;
+            3.
+            4.  function foo() {
+            5.      inside;
+            6.  }
+            7.
+            8.  after;
+
+        A breakpoint on line 1, a comment, resolves to line 2 the next
+        statement that will execute.
+
+        A breakpoint on line 3 or 7, empty lines, resolves to line 8 the next
+        statement that will execute. This skips past the definition of foo,
+        just like stepping would have done. The creation of foo would have
+        been hoisted, which would have happened before execution of the
+        other statements.
+
+        A breakpoint on line 4, a function signature, resolves to line 5,
+        inside the function. Users would expect to pause inside of a function
+        when setting a breakpoint on that function's name or opening brace.
+
+        A breakpoint on line 6, a function's closing brace, resolves to
+        line 6. The debugger will pause whenever execution leaves foo due to
+        a return and not an exception. This matches stepping behavior. An
+        explicit or implicit return (the implicit return undefined) will
+        pause on the closing brace as we leave the function, giving users
+        an opportunity to inspect the final state before leaving.
+
+        --
+
+        At this point, op_debug's are still emitted at custom locations during
+        bytecode generation of other statements / expressions. In order to
+        ensure the generated op_debugs correspond to locations the Parser
+        determined were breakpoint locations, the Parser sets a &quot;needs debug
+        hook&quot; flag on the nodes it will use for breakpoint locations, and
+        we assert during bytecode generation that op_debugs are only emitted
+        for nodes that were marked as needing debug hooks.
+
+        This still leaves open the possibility that the Parser will mark
+        some nodes that get missed during bytecode generation, so we might
+        fail to emit some op_debugs. The next step will be eliminating the
+        custom emitDebugHooks spread across StatementNode and ExpressionNode
+        subclasses, and instead always generating op_debugs whenever we
+        emit a flagged node.
+
+        --
+
+        * CMakeLists.txt:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        New DebuggerParseData files.
+
+        * API/JSScriptRef.cpp:
+        (OpaqueJSScript::OpaqueJSScript):
+        * jsc.cpp:
+        (functionCheckModuleSyntax):
+        * parser/SourceCode.h:
+        (JSC::makeSource):
+        * parser/SourceProvider.cpp:
+        (JSC::SourceProvider::SourceProvider):
+        * parser/SourceProvider.h:
+        (JSC::SourceProvider::sourceType):
+        (JSC::StringSourceProvider::create):
+        (JSC::StringSourceProvider::StringSourceProvider):
+        (JSC::WebAssemblySourceProvider::WebAssemblySourceProvider):
+        (JSC::SourceProvider::startPosition): Deleted.
+        Add a new type on SourceProvider to distinguish if its script was
+        intended to be a Script, Module, or WebAssembly. This information
+        will be needed to know how to best parse this file when the
+        debugger decides to lazily parse.
+
+        * runtime/Executable.cpp:
+        (JSC::EvalExecutable::EvalExecutable):
+        (JSC::ProgramExecutable::ProgramExecutable):
+        (JSC::ModuleProgramExecutable::ModuleProgramExecutable):
+        (JSC::WebAssemblyExecutable::WebAssemblyExecutable):
+        * runtime/ModuleLoaderPrototype.cpp:
+        (JSC::moduleLoaderPrototypeParseModule):
+        ASSERT the SourceProvider type matches the executable type we are
+        creating for it.
+
+        * parser/ASTBuilder.h:
+        (JSC::ASTBuilder::breakpointLocation):
+        * parser/SyntaxChecker.h:
+        (JSC::SyntaxChecker::operatorStackPop):
+        When gathering breakpoint positions, get the position from the
+        current node. In the SyntaxChecker, return an invalid position.
+
+        * parser/Nodes.h:
+        (JSC::ExpressionNode::needsDebugHook):
+        (JSC::ExpressionNode::setNeedsDebugHook):
+        (JSC::StatementNode::needsDebugHook):
+        (JSC::StatementNode::setNeedsDebugHook):
+        When gathering breakpoint positions, mark the node as needing
+        a debug hook. For now we assert op_debugs generated must come
+        from these nodes. Later we should just generate op_debugs for
+        these nodes.
+
+        * parser/Parser.cpp:
+        (JSC::Parser&lt;LexerType&gt;::Parser):
+        (JSC::Parser&lt;LexerType&gt;::parseStatementListItem):
+        (JSC::Parser&lt;LexerType&gt;::parseDoWhileStatement):
+        (JSC::Parser&lt;LexerType&gt;::parseWhileStatement):
+        (JSC::Parser&lt;LexerType&gt;::parseArrowFunctionSingleExpressionBodySourceElements):
+        (JSC::Parser&lt;LexerType&gt;::parseForStatement):
+        (JSC::Parser&lt;LexerType&gt;::parseWithStatement):
+        (JSC::Parser&lt;LexerType&gt;::parseSwitchStatement):
+        (JSC::Parser&lt;LexerType&gt;::parseStatement):
+        (JSC::Parser&lt;LexerType&gt;::parseFunctionBody):
+        (JSC::Parser&lt;LexerType&gt;::parseFunctionInfo):
+        (JSC::Parser&lt;LexerType&gt;::parseIfStatement):
+        (JSC::Parser&lt;LexerType&gt;::parseAssignmentExpression):
+        * parser/Parser.h:
+        (JSC::parse):
+        Add an optional DebuggerParseData struct to the Parser. When available
+        the Parser will gather debugger data, and parse all functions with the
+        ASTBuilder instead of SyntaxChecking inner functions.
+
+        * debugger/DebuggerParseData.cpp: Added.
+        (JSC::DebuggerPausePositions::breakpointLocationForLineColumn):
+        (JSC::DebuggerPausePositions::sort):
+        (JSC::gatherDebuggerParseData):
+        (JSC::gatherDebuggerParseDataForSource):
+        * debugger/DebuggerParseData.h: Copied from Source/JavaScriptCore/debugger/DebuggerPrimitives.h.
+        (JSC::DebuggerPausePositions::DebuggerPausePositions):
+        (JSC::DebuggerPausePositions::appendPause):
+        (JSC::DebuggerPausePositions::appendEntry):
+        (JSC::DebuggerPausePositions::appendLeave):
+        The DebuggerParseData struct currently only contains a list of pause positions.
+        Once populated it can resolve an input location to a pause position.
+
+        * bytecompiler/BytecodeGenerator.cpp:
+        (JSC::BytecodeGenerator::emitCall):
+        (JSC::BytecodeGenerator::emitCallVarargs):
+        (JSC::BytecodeGenerator::emitDebugHook):
+        (JSC::BytecodeGenerator::emitEnumeration):
+        * bytecompiler/BytecodeGenerator.h:
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::EmptyStatementNode::emitBytecode):
+        (JSC::DebuggerStatementNode::emitBytecode):
+        (JSC::ExprStatementNode::emitBytecode):
+        (JSC::DeclarationStatement::emitBytecode):
+        (JSC::IfElseNode::emitBytecode):
+        (JSC::DoWhileNode::emitBytecode):
+        (JSC::WhileNode::emitBytecode):
+        (JSC::ForNode::emitBytecode):
+        (JSC::ForInNode::emitBytecode):
+        (JSC::ContinueNode::emitBytecode):
+        (JSC::BreakNode::emitBytecode):
+        (JSC::ReturnNode::emitBytecode):
+        (JSC::WithNode::emitBytecode):
+        (JSC::SwitchNode::emitBytecode):
+        (JSC::ThrowNode::emitBytecode):
+        Emit op_debugs for the nodes themselves. Assert when we do that the
+        Parser had marked them as needing a debug hook.
+
+        * debugger/Breakpoint.h:
+        (JSC::Breakpoint::Breakpoint):
+        A breakpoint may be resolved or unresolved. Debugger::resolveBreakpoint
+        must be used to resolve the breakpoint. Most methods now require a
+        resolved breakpoint.
+
+        * debugger/Debugger.h:
+        * debugger/Debugger.cpp:
+        (JSC::Debugger::detach):
+        (JSC::Debugger::toggleBreakpoint):
+        (JSC::Debugger::debuggerParseData):
+        (JSC::Debugger::resolveBreakpoint):
+        (JSC::Debugger::setBreakpoint):
+        (JSC::Debugger::clearParsedData):
+        Provide a public method to resolve a breakpoint location in a script.
+        This will gather debugger parse data for the script if none is available.
+        Ensure clients have resolved a breakpoint before attempting to set it.
+        Currently we allow only a single breakpoint at a location. This may
+        need to change if multiple breakpoints resolve to the same location
+        but have different actions.
+
+        * inspector/ScriptDebugListener.h:
+        ScriptDebugServer::Script is effectively duplicating most of the data from
+        a SourceProvider. We should eliminate this and just use SourceProvider.
+
+        * inspector/ScriptDebugServer.cpp:
+        (Inspector::ScriptDebugServer::setBreakpointActions):
+        (Inspector::ScriptDebugServer::removeBreakpointActions):
+        (Inspector::ScriptDebugServer::getActionsForBreakpoint):
+        (Inspector::ScriptDebugServer::clearBreakpointActions):
+        (Inspector::ScriptDebugServer::evaluateBreakpointAction):
+        (Inspector::ScriptDebugServer::dispatchDidParseSource):
+        (Inspector::ScriptDebugServer::handleBreakpointHit):
+        (Inspector::ScriptDebugServer::setBreakpoint): Deleted.
+        (Inspector::ScriptDebugServer::removeBreakpoint): Deleted.
+        (Inspector::ScriptDebugServer::clearBreakpoints): Deleted.
+        * inspector/ScriptDebugServer.h:
+        Reduce ScriptDebugServer's involvement in breakpoints to just handling
+        breakpoint actions. Eventually we should eliminate it alltogether and
+        fold breakpoint logic into Debugger or DebugAgent.
+
+        * inspector/agents/InspectorDebuggerAgent.h:
+        * inspector/agents/InspectorDebuggerAgent.cpp:
+        (Inspector::buildDebuggerLocation):
+        (Inspector::parseLocation):
+        (Inspector::InspectorDebuggerAgent::setBreakpointByUrl):
+        (Inspector::InspectorDebuggerAgent::setBreakpoint):
+        (Inspector::InspectorDebuggerAgent::didSetBreakpoint):
+        (Inspector::InspectorDebuggerAgent::resolveBreakpoint):
+        (Inspector::InspectorDebuggerAgent::removeBreakpoint):
+        (Inspector::InspectorDebuggerAgent::continueToLocation):
+        (Inspector::InspectorDebuggerAgent::didParseSource):
+        (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState):
+        The Inspector can set breakpoints in multiple ways.
+        Ensure that once we have the Script that we always
+        resolve the breakpoint location before setting the
+        breakpoint. The different paths are:
+        
+        - setBreakpoint(scriptId, location)
+          - Here we know the SourceProvider by its SourceID
+            - resolve and set
+        
+        - setBreakpointByURL(url, location)
+          - Search for existing Scripts that match the URL
+            - resolve in each and set
+          - When new Scripts are parsed that match the URL
+            - resolve and set
+            
+
+2016-09-30  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
</ins><span class="cx">         Web Inspector: Stepping out of a function finishes the line that called it.
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=155325
</span><span class="cx">         &lt;rdar://problem/25094578&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -1657,6 +1657,8 @@
</span><span class="cx">                 A59455921824744700CC3843 /* JSGlobalObjectDebuggable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A59455901824744700CC3843 /* JSGlobalObjectDebuggable.cpp */; };
</span><span class="cx">                 A59455931824744700CC3843 /* JSGlobalObjectDebuggable.h in Headers */ = {isa = PBXBuildFile; fileRef = A59455911824744700CC3843 /* JSGlobalObjectDebuggable.h */; };
</span><span class="cx">                 A5945595182479EB00CC3843 /* InspectorFrontendChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = A5945594182479EB00CC3843 /* InspectorFrontendChannel.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                A5A1A0941D8CB33E004C2EB8 /* DebuggerParseData.h in Headers */ = {isa = PBXBuildFile; fileRef = A5A1A0921D8CB12F004C2EB8 /* DebuggerParseData.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                A5A1A0951D8CB341004C2EB8 /* DebuggerParseData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5A1A0931D8CB337004C2EB8 /* DebuggerParseData.cpp */; };
</ins><span class="cx">                 A5AB49DC1BEC8082007020FB /* PerGlobalObjectWrapperWorld.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5AB49DA1BEC8079007020FB /* PerGlobalObjectWrapperWorld.cpp */; };
</span><span class="cx">                 A5AB49DD1BEC8086007020FB /* PerGlobalObjectWrapperWorld.h in Headers */ = {isa = PBXBuildFile; fileRef = A5AB49DB1BEC8079007020FB /* PerGlobalObjectWrapperWorld.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 A5B6A74D18C6DBA600F11E91 /* ConsoleClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5B6A74C18C6DBA600F11E91 /* ConsoleClient.cpp */; };
</span><span class="lines">@@ -3958,6 +3960,8 @@
</span><span class="cx">                 A59455901824744700CC3843 /* JSGlobalObjectDebuggable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSGlobalObjectDebuggable.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A59455911824744700CC3843 /* JSGlobalObjectDebuggable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSGlobalObjectDebuggable.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A5945594182479EB00CC3843 /* InspectorFrontendChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorFrontendChannel.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                A5A1A0921D8CB12F004C2EB8 /* DebuggerParseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebuggerParseData.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                A5A1A0931D8CB337004C2EB8 /* DebuggerParseData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DebuggerParseData.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 A5AB49DA1BEC8079007020FB /* PerGlobalObjectWrapperWorld.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PerGlobalObjectWrapperWorld.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A5AB49DB1BEC8079007020FB /* PerGlobalObjectWrapperWorld.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerGlobalObjectWrapperWorld.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A5B6A74C18C6DBA600F11E91 /* ConsoleClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConsoleClient.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -5520,6 +5524,8 @@
</span><span class="cx">                                 6AD2CB4C19B9140100065719 /* DebuggerEvalEnabler.h */,
</span><span class="cx">                                 A5FC84B01D1DDAC8006B5C46 /* DebuggerLocation.cpp */,
</span><span class="cx">                                 A5FC84B11D1DDAC8006B5C46 /* DebuggerLocation.h */,
</span><ins>+                                A5A1A0931D8CB337004C2EB8 /* DebuggerParseData.cpp */,
+                                A5A1A0921D8CB12F004C2EB8 /* DebuggerParseData.h */,
</ins><span class="cx">                                 FEA0861F182B7A0400F6D851 /* DebuggerPrimitives.h */,
</span><span class="cx">                                 0F2D4DDB19832D34007D4B19 /* DebuggerScope.cpp */,
</span><span class="cx">                                 0F2D4DDC19832D34007D4B19 /* DebuggerScope.h */,
</span><span class="lines">@@ -8322,6 +8328,7 @@
</span><span class="cx">                                 A7386556118697B400540279 /* ThunkGenerators.h in Headers */,
</span><span class="cx">                                 141448CD13A1783700F5BA1A /* TinyBloomFilter.h in Headers */,
</span><span class="cx">                                 2684D4381C00161C0081D663 /* AirLiveness.h in Headers */,
</span><ins>+                                A5A1A0941D8CB33E004C2EB8 /* DebuggerParseData.h in Headers */,
</ins><span class="cx">                                 0F55989817C86C5800A1E543 /* ToNativeFromValue.h in Headers */,
</span><span class="cx">                                 DCEE220B1CEB9895000C2396 /* DFGControlEquivalenceAnalysis.h in Headers */,
</span><span class="cx">                                 0F2D4DE919832DAC007D4B19 /* ToThisStatus.h in Headers */,
</span><span class="lines">@@ -9509,6 +9516,7 @@
</span><span class="cx">                                 148F21B0107EC5410042EC2C /* Lexer.cpp in Sources */,
</span><span class="cx">                                 0FF4275715914A20004CB9FF /* LinkBuffer.cpp in Sources */,
</span><span class="cx">                                 A7E2EA6C0FB460CF00601F06 /* LiteralParser.cpp in Sources */,
</span><ins>+                                A5A1A0951D8CB341004C2EB8 /* DebuggerParseData.cpp in Sources */,
</ins><span class="cx">                                 FE3913541B794F6E00EDAF71 /* LiveObjectList.cpp in Sources */,
</span><span class="cx">                                 FE20CE9D15F04A9500DF3430 /* LLIntCLoop.cpp in Sources */,
</span><span class="cx">                                 0F4680D214BBD16500BFE272 /* LLIntData.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -3180,7 +3180,7 @@
</span><span class="cx">         callFrame.append(newTemporary());
</span><span class="cx"> 
</span><span class="cx">     if (m_shouldEmitDebugHooks &amp;&amp; debuggableCall == DebuggableCall::Yes)
</span><del>-        emitDebugHook(WillExecuteExpression, divotStart.line, divotStart.offset, divotStart.lineStartOffset);
</del><ins>+        emitDebugHook(WillExecuteExpression, divotStart);
</ins><span class="cx"> 
</span><span class="cx">     emitExpressionInfo(divot, divotStart, divotEnd);
</span><span class="cx"> 
</span><span class="lines">@@ -3234,7 +3234,7 @@
</span><span class="cx"> RegisterID* BytecodeGenerator::emitCallVarargs(OpcodeID opcode, RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, int32_t firstVarArgOffset, const JSTextPosition&amp; divot, const JSTextPosition&amp; divotStart, const JSTextPosition&amp; divotEnd, DebuggableCall debuggableCall)
</span><span class="cx"> {
</span><span class="cx">     if (m_shouldEmitDebugHooks &amp;&amp; debuggableCall == DebuggableCall::Yes)
</span><del>-        emitDebugHook(WillExecuteExpression, divotStart.line, divotStart.offset, divotStart.lineStartOffset);
</del><ins>+        emitDebugHook(WillExecuteExpression, divotStart);
</ins><span class="cx"> 
</span><span class="cx">     emitExpressionInfo(divot, divotStart, divotEnd);
</span><span class="cx"> 
</span><span class="lines">@@ -3459,12 +3459,11 @@
</span><span class="cx">     RELEASE_ASSERT(stackEntry.m_isWithScope);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void BytecodeGenerator::emitDebugHook(DebugHookID debugHookID, unsigned line, unsigned charOffset, unsigned lineStart)
</del><ins>+void BytecodeGenerator::emitDebugHook(DebugHookID debugHookID, const JSTextPosition&amp; divot)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_shouldEmitDebugHooks)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    JSTextPosition divot(line, charOffset, lineStart);
</del><span class="cx">     emitExpressionInfo(divot, divot, divot);
</span><span class="cx">     emitOpcode(op_debug);
</span><span class="cx">     instructions().append(debugHookID);
</span><span class="lines">@@ -3471,6 +3470,23 @@
</span><span class="cx">     instructions().append(false);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void BytecodeGenerator::emitDebugHook(DebugHookID debugHookID, unsigned line, unsigned charOffset, unsigned lineStart)
+{
+    emitDebugHook(debugHookID, JSTextPosition(line, charOffset, lineStart));
+}
+
+void BytecodeGenerator::emitDebugHook(StatementNode* statement)
+{
+    RELEASE_ASSERT(statement-&gt;needsDebugHook());
+    emitDebugHook(WillExecuteStatement, statement-&gt;position());
+}
+
+void BytecodeGenerator::emitDebugHook(ExpressionNode* expr, DebugHookID debugHookID)
+{
+    RELEASE_ASSERT(expr-&gt;needsDebugHook());
+    emitDebugHook(debugHookID, expr-&gt;position());
+}
+
</ins><span class="cx"> void BytecodeGenerator::emitWillLeaveCallFrameDebugHook()
</span><span class="cx"> {
</span><span class="cx">     RELEASE_ASSERT(m_scopeNode-&gt;isFunctionNode());
</span><span class="lines">@@ -4134,7 +4150,7 @@
</span><span class="cx">         if (forLoopNode) {
</span><span class="cx">             RELEASE_ASSERT(forLoopNode-&gt;isForOfNode());
</span><span class="cx">             prepareLexicalScopeForNextForLoopIteration(forLoopNode, forLoopSymbolTable);
</span><del>-            emitDebugHook(WillExecuteStatement, forLoopNode-&gt;expr()-&gt;firstLine(), forLoopNode-&gt;expr()-&gt;startOffset(), forLoopNode-&gt;expr()-&gt;lineStartOffset());
</del><ins>+            emitDebugHook(forLoopNode-&gt;expr(), WillExecuteStatement);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -676,7 +676,10 @@
</span><span class="cx">         void emitPutDerivedConstructorToArrowFunctionContextScope();
</span><span class="cx">         RegisterID* emitLoadDerivedConstructorFromArrowFunctionLexicalEnvironment();
</span><span class="cx"> 
</span><ins>+        void emitDebugHook(DebugHookID, const JSTextPosition&amp;);
</ins><span class="cx">         void emitDebugHook(DebugHookID, unsigned line, unsigned charOffset, unsigned lineStart);
</span><ins>+        void emitDebugHook(StatementNode*);
+        void emitDebugHook(ExpressionNode*, DebugHookID);
</ins><span class="cx">         void emitWillLeaveCallFrameDebugHook();
</span><span class="cx"> 
</span><span class="cx">         bool isInFinallyBlock() { return m_finallyDepth &gt; 0; }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerNodesCodegencpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -2341,7 +2341,7 @@
</span><span class="cx"> 
</span><span class="cx"> void EmptyStatementNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID*)
</span><span class="cx"> {
</span><del>-    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
</del><ins>+    generator.emitDebugHook(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ DebuggerStatementNode ---------------------------
</span><span class="lines">@@ -2348,7 +2348,7 @@
</span><span class="cx"> 
</span><span class="cx"> void DebuggerStatementNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID*)
</span><span class="cx"> {
</span><del>-    generator.emitDebugHook(DidReachBreakpoint, lastLine(), startOffset(), lineStartOffset());
</del><ins>+    generator.emitDebugHook(DidReachBreakpoint, position());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // ------------------------------ ExprStatementNode ----------------------------
</span><span class="lines">@@ -2356,7 +2356,7 @@
</span><span class="cx"> void ExprStatementNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID* dst)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_expr);
</span><del>-    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
</del><ins>+    generator.emitDebugHook(this);
</ins><span class="cx">     generator.emitNode(dst, m_expr);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -2365,7 +2365,7 @@
</span><span class="cx"> void DeclarationStatement::emitBytecode(BytecodeGenerator&amp; generator, RegisterID*)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_expr);
</span><del>-    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
</del><ins>+    generator.emitDebugHook(this);
</ins><span class="cx">     generator.emitNode(m_expr);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -2453,7 +2453,7 @@
</span><span class="cx"> 
</span><span class="cx"> void IfElseNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID* dst)
</span><span class="cx"> {
</span><del>-    generator.emitDebugHook(WillExecuteStatement, m_condition-&gt;firstLine(), m_condition-&gt;startOffset(), m_condition-&gt;lineStartOffset());
</del><ins>+    generator.emitDebugHook(m_condition, WillExecuteStatement);
</ins><span class="cx">     
</span><span class="cx">     RefPtr&lt;Label&gt; beforeThen = generator.newLabel();
</span><span class="cx">     RefPtr&lt;Label&gt; beforeElse = generator.newLabel();
</span><span class="lines">@@ -2499,7 +2499,7 @@
</span><span class="cx">     generator.emitNodeInTailPosition(dst, m_statement);
</span><span class="cx"> 
</span><span class="cx">     generator.emitLabel(scope-&gt;continueTarget());
</span><del>-    generator.emitDebugHook(WillExecuteStatement, m_expr-&gt;firstLine(), m_expr-&gt;startOffset(), m_expr-&gt;lineStartOffset());
</del><ins>+    generator.emitDebugHook(m_expr, WillExecuteStatement);
</ins><span class="cx">     generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope-&gt;breakTarget(), FallThroughMeansFalse);
</span><span class="cx"> 
</span><span class="cx">     generator.emitLabel(scope-&gt;breakTarget());
</span><span class="lines">@@ -2512,7 +2512,7 @@
</span><span class="cx">     LabelScopePtr scope = generator.newLabelScope(LabelScope::Loop);
</span><span class="cx">     RefPtr&lt;Label&gt; topOfLoop = generator.newLabel();
</span><span class="cx"> 
</span><del>-    generator.emitDebugHook(WillExecuteStatement, m_expr-&gt;firstLine(), m_expr-&gt;startOffset(), m_expr-&gt;lineStartOffset());
</del><ins>+    generator.emitDebugHook(m_expr, WillExecuteStatement);
</ins><span class="cx">     generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope-&gt;breakTarget(), FallThroughMeansTrue);
</span><span class="cx"> 
</span><span class="cx">     generator.emitLabel(topOfLoop.get());
</span><span class="lines">@@ -2522,7 +2522,7 @@
</span><span class="cx">     generator.emitNodeInTailPosition(dst, m_statement);
</span><span class="cx"> 
</span><span class="cx">     generator.emitLabel(scope-&gt;continueTarget());
</span><del>-    generator.emitDebugHook(WillExecuteStatement, m_expr-&gt;firstLine(), m_expr-&gt;startOffset(), m_expr-&gt;lineStartOffset());
</del><ins>+    generator.emitDebugHook(m_expr, WillExecuteStatement);
</ins><span class="cx"> 
</span><span class="cx">     generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope-&gt;breakTarget(), FallThroughMeansFalse);
</span><span class="cx"> 
</span><span class="lines">@@ -2542,17 +2542,17 @@
</span><span class="cx"> 
</span><span class="cx">     if (m_expr1 || m_expr2) {
</span><span class="cx">         ExpressionNode* firstExpr = m_expr1 ? m_expr1 : m_expr2;
</span><del>-        generator.emitDebugHook(WillExecuteStatement, firstExpr-&gt;firstLine(), firstExpr-&gt;startOffset(), firstExpr-&gt;lineStartOffset());
</del><ins>+        generator.emitDebugHook(firstExpr, WillExecuteStatement);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_expr1) {
</span><del>-        generator.emitDebugHook(WillExecuteExpression, m_expr1-&gt;firstLine(), m_expr1-&gt;startOffset(), m_expr1-&gt;lineStartOffset());
</del><ins>+        generator.emitDebugHook(m_expr1, WillExecuteExpression);
</ins><span class="cx">         generator.emitNode(generator.ignoredResult(), m_expr1);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Label&gt; topOfLoop = generator.newLabel();
</span><span class="cx">     if (m_expr2) {
</span><del>-        generator.emitDebugHook(WillExecuteExpression, m_expr2-&gt;firstLine(), m_expr2-&gt;startOffset(), m_expr2-&gt;lineStartOffset());
</del><ins>+        generator.emitDebugHook(m_expr2, WillExecuteExpression);
</ins><span class="cx">         generator.emitNodeInConditionContext(m_expr2, topOfLoop.get(), scope-&gt;breakTarget(), FallThroughMeansTrue);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -2565,12 +2565,12 @@
</span><span class="cx">     generator.emitLabel(scope-&gt;continueTarget());
</span><span class="cx">     generator.prepareLexicalScopeForNextForLoopIteration(this, forLoopSymbolTable);
</span><span class="cx">     if (m_expr3) {
</span><del>-        generator.emitDebugHook(WillExecuteStatement, m_expr3-&gt;firstLine(), m_expr3-&gt;startOffset(), m_expr3-&gt;lineStartOffset());
</del><ins>+        generator.emitDebugHook(m_expr3, WillExecuteStatement);
</ins><span class="cx">         generator.emitNode(generator.ignoredResult(), m_expr3);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_expr2) {
</span><del>-        generator.emitDebugHook(WillExecuteStatement, m_expr2-&gt;firstLine(), m_expr2-&gt;startOffset(), m_expr2-&gt;lineStartOffset());
</del><ins>+        generator.emitDebugHook(m_expr2, WillExecuteStatement);
</ins><span class="cx">         generator.emitNodeInConditionContext(m_expr2, topOfLoop.get(), scope-&gt;breakTarget(), FallThroughMeansFalse);
</span><span class="cx">     } else
</span><span class="cx">         generator.emitJump(topOfLoop.get());
</span><span class="lines">@@ -2701,7 +2701,7 @@
</span><span class="cx">     RegisterID* forLoopSymbolTable = nullptr;
</span><span class="cx">     generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::Optimize, BytecodeGenerator::NestedScopeType::IsNested, &amp;forLoopSymbolTable);
</span><span class="cx"> 
</span><del>-    generator.emitDebugHook(WillExecuteStatement, m_expr-&gt;firstLine(), m_expr-&gt;startOffset(), m_expr-&gt;lineStartOffset());
</del><ins>+    generator.emitDebugHook(m_expr, WillExecuteStatement);
</ins><span class="cx"> 
</span><span class="cx">     if (m_lexpr-&gt;isAssignResolveNode())
</span><span class="cx">         generator.emitNode(generator.ignoredResult(), m_lexpr);
</span><span class="lines">@@ -2751,7 +2751,7 @@
</span><span class="cx">         generator.emitLabel(scope-&gt;continueTarget());
</span><span class="cx">         generator.prepareLexicalScopeForNextForLoopIteration(this, forLoopSymbolTable);
</span><span class="cx">         generator.emitInc(i.get());
</span><del>-        generator.emitDebugHook(WillExecuteStatement, m_expr-&gt;firstLine(), m_expr-&gt;startOffset(), m_expr-&gt;lineStartOffset());
</del><ins>+        generator.emitDebugHook(m_expr, WillExecuteStatement);
</ins><span class="cx">         generator.emitJump(loopStart.get());
</span><span class="cx"> 
</span><span class="cx">         generator.emitLabel(scope-&gt;breakTarget());
</span><span class="lines">@@ -2791,7 +2791,7 @@
</span><span class="cx">         generator.prepareLexicalScopeForNextForLoopIteration(this, forLoopSymbolTable);
</span><span class="cx">         generator.emitInc(enumeratorIndex.get());
</span><span class="cx">         generator.emitEnumeratorStructurePropertyName(propertyName.get(), enumerator.get(), enumeratorIndex.get());
</span><del>-        generator.emitDebugHook(WillExecuteStatement, m_expr-&gt;firstLine(), m_expr-&gt;startOffset(), m_expr-&gt;lineStartOffset());
</del><ins>+        generator.emitDebugHook(m_expr, WillExecuteStatement);
</ins><span class="cx">         generator.emitJump(loopStart.get());
</span><span class="cx">         
</span><span class="cx">         generator.emitLabel(scope-&gt;breakTarget());
</span><span class="lines">@@ -2828,7 +2828,7 @@
</span><span class="cx">         generator.prepareLexicalScopeForNextForLoopIteration(this, forLoopSymbolTable);
</span><span class="cx">         generator.emitInc(enumeratorIndex.get());
</span><span class="cx">         generator.emitEnumeratorGenericPropertyName(propertyName.get(), enumerator.get(), enumeratorIndex.get());
</span><del>-        generator.emitDebugHook(WillExecuteStatement, m_expr-&gt;firstLine(), m_expr-&gt;startOffset(), m_expr-&gt;lineStartOffset());
</del><ins>+        generator.emitDebugHook(m_expr, WillExecuteStatement);
</ins><span class="cx">         generator.emitJump(loopStart.get());
</span><span class="cx"> 
</span><span class="cx">         generator.emitLabel(scope-&gt;breakTarget());
</span><span class="lines">@@ -2925,7 +2925,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ContinueNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID*)
</span><span class="cx"> {
</span><del>-    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
</del><ins>+    generator.emitDebugHook(this);
</ins><span class="cx">     
</span><span class="cx">     LabelScopePtr scope = generator.continueTarget(m_ident);
</span><span class="cx">     ASSERT(scope);
</span><span class="lines">@@ -2954,7 +2954,7 @@
</span><span class="cx"> 
</span><span class="cx"> void BreakNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID*)
</span><span class="cx"> {
</span><del>-    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
</del><ins>+    generator.emitDebugHook(this);
</ins><span class="cx">     
</span><span class="cx">     LabelScopePtr scope = generator.breakTarget(m_ident);
</span><span class="cx">     ASSERT(scope);
</span><span class="lines">@@ -2969,7 +2969,8 @@
</span><span class="cx"> 
</span><span class="cx"> void ReturnNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID* dst)
</span><span class="cx"> {
</span><del>-    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
</del><ins>+    generator.emitDebugHook(this);
+
</ins><span class="cx">     ASSERT(generator.codeType() == FunctionCode);
</span><span class="cx"> 
</span><span class="cx">     if (dst == generator.ignoredResult())
</span><span class="lines">@@ -2996,7 +2997,7 @@
</span><span class="cx"> 
</span><span class="cx"> void WithNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID* dst)
</span><span class="cx"> {
</span><del>-    generator.emitDebugHook(WillExecuteStatement, m_expr-&gt;firstLine(), m_expr-&gt;startOffset(), m_expr-&gt;lineStartOffset());
</del><ins>+    generator.emitDebugHook(m_expr, WillExecuteStatement);
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;RegisterID&gt; scope = generator.emitNode(m_expr);
</span><span class="cx">     generator.emitExpressionInfo(m_divot, m_divot - m_expressionLength, m_divot);
</span><span class="lines">@@ -3171,7 +3172,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SwitchNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID* dst)
</span><span class="cx"> {
</span><del>-    generator.emitDebugHook(WillExecuteStatement, m_expr-&gt;firstLine(), m_expr-&gt;startOffset(), m_expr-&gt;lineStartOffset());
</del><ins>+    generator.emitDebugHook(m_expr, WillExecuteStatement);
</ins><span class="cx">     
</span><span class="cx">     LabelScopePtr scope = generator.newLabelScope(LabelScope::Switch);
</span><span class="cx"> 
</span><span class="lines">@@ -3201,7 +3202,7 @@
</span><span class="cx"> 
</span><span class="cx"> void ThrowNode::emitBytecode(BytecodeGenerator&amp; generator, RegisterID* dst)
</span><span class="cx"> {
</span><del>-    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
</del><ins>+    generator.emitDebugHook(this);
</ins><span class="cx"> 
</span><span class="cx">     if (dst == generator.ignoredResult())
</span><span class="cx">         dst = 0;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerBreakpointh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/Breakpoint.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/Breakpoint.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/debugger/Breakpoint.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -20,7 +20,7 @@
</span><span class="cx">  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
</span><span class="cx">  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span class="cx">  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
</span><del>- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
</del><ins>+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</ins><span class="cx">  */
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="lines">@@ -56,6 +56,7 @@
</span><span class="cx">         , autoContinue(other.autoContinue)
</span><span class="cx">         , ignoreCount(other.ignoreCount)
</span><span class="cx">         , hitCount(other.hitCount)
</span><ins>+        , resolved(other.resolved)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -67,6 +68,7 @@
</span><span class="cx">     bool autoContinue { false };
</span><span class="cx">     unsigned ignoreCount { 0 };
</span><span class="cx">     unsigned hitCount { 0 };
</span><ins>+    bool resolved { false };
</ins><span class="cx"> 
</span><span class="cx">     static const unsigned unspecifiedColumn = UINT_MAX;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/Debugger.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/Debugger.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/debugger/Debugger.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -27,10 +27,10 @@
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;HeapIterationScope.h&quot;
</span><span class="cx"> #include &quot;Interpreter.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSCJSValueInlines.h&quot;
</span><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><del>-#include &quot;JSCInlines.h&quot;
</del><span class="cx"> #include &quot;MarkedSpaceInlines.h&quot;
</span><span class="cx"> #include &quot;Parser.h&quot;
</span><span class="cx"> #include &quot;Protect.h&quot;
</span><span class="lines">@@ -183,6 +183,9 @@
</span><span class="cx">         clearDebuggerRequests(globalObject);
</span><span class="cx"> 
</span><span class="cx">     globalObject-&gt;setDebugger(nullptr);
</span><ins>+
+    if (m_globalObjects.isEmpty())
+        clearParsedData();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool Debugger::isAttached(JSGlobalObject* globalObject)
</span><span class="lines">@@ -251,6 +254,8 @@
</span><span class="cx"> 
</span><span class="cx"> void Debugger::toggleBreakpoint(CodeBlock* codeBlock, Breakpoint&amp; breakpoint, BreakpointState enabledOrNot)
</span><span class="cx"> {
</span><ins>+    ASSERT(breakpoint.resolved);
+
</ins><span class="cx">     ScriptExecutable* executable = codeBlock-&gt;ownerScriptExecutable();
</span><span class="cx"> 
</span><span class="cx">     SourceID sourceID = static_cast&lt;SourceID&gt;(executable-&gt;sourceID());
</span><span class="lines">@@ -278,6 +283,7 @@
</span><span class="cx">         if (line == endLine &amp;&amp; column &gt; endColumn)
</span><span class="cx">             return;
</span><span class="cx">     }
</span><ins>+
</ins><span class="cx">     if (!codeBlock-&gt;hasOpDebugForLineAndColumn(line, column))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -331,15 +337,55 @@
</span><span class="cx">     m_vm.deleteAllCode();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-BreakpointID Debugger::setBreakpoint(Breakpoint breakpoint, unsigned&amp; actualLine, unsigned&amp; actualColumn)
</del><ins>+DebuggerParseData&amp; Debugger::debuggerParseData(SourceID sourceID, SourceProvider* provider)
</ins><span class="cx"> {
</span><ins>+    auto iter = m_parseDataMap.find(sourceID);
+    if (iter != m_parseDataMap.end())
+        return iter-&gt;value;
+
+    DebuggerParseData parseData;
+    gatherDebuggerParseDataForSource(m_vm, provider, parseData);
+    auto result = m_parseDataMap.add(sourceID, parseData);
+    return result.iterator-&gt;value;
+}
+
+void Debugger::resolveBreakpoint(Breakpoint&amp; breakpoint, SourceProvider* sourceProvider)
+{
+    RELEASE_ASSERT(!breakpoint.resolved);
+    ASSERT(breakpoint.sourceID != noSourceID);
+
+    // FIXME: &lt;https://webkit.org/b/162771&gt; Web Inspector: Adopt TextPosition in Inspector to avoid oneBasedInt/zeroBasedInt ambiguity
+    // Inspector breakpoint line and column values are zero-based but the executable
+    // and CodeBlock line and column values are one-based.
+    unsigned line = breakpoint.line + 1;
+    unsigned column = breakpoint.column ? breakpoint.column : Breakpoint::unspecifiedColumn;
+
+    DebuggerParseData&amp; parseData = debuggerParseData(breakpoint.sourceID, sourceProvider);
+    Optional&lt;JSTextPosition&gt; resolvedPosition = parseData.pausePositions.breakpointLocationForLineColumn((int)line, (int)column);
+    if (!resolvedPosition)
+        return;
+
+    unsigned resolvedLine = resolvedPosition-&gt;line;
+    unsigned resolvedColumn = resolvedPosition-&gt;offset - resolvedPosition-&gt;lineStartOffset + 1;
+
+    breakpoint.line = resolvedLine - 1;
+    breakpoint.column = resolvedColumn - 1;
+    breakpoint.resolved = true;
+}
+
+BreakpointID Debugger::setBreakpoint(Breakpoint&amp; breakpoint, bool&amp; existing)
+{
+    ASSERT(breakpoint.resolved);
+    ASSERT(breakpoint.sourceID != noSourceID);
+
</ins><span class="cx">     SourceID sourceID = breakpoint.sourceID;
</span><span class="cx">     unsigned line = breakpoint.line;
</span><span class="cx">     unsigned column = breakpoint.column;
</span><span class="cx"> 
</span><del>-    SourceIDToBreakpointsMap::iterator it = m_sourceIDToBreakpoints.find(sourceID);
</del><ins>+    SourceIDToBreakpointsMap::iterator it = m_sourceIDToBreakpoints.find(breakpoint.sourceID);
</ins><span class="cx">     if (it == m_sourceIDToBreakpoints.end())
</span><span class="cx">         it = m_sourceIDToBreakpoints.set(sourceID, LineToBreakpointsMap()).iterator;
</span><ins>+
</ins><span class="cx">     LineToBreakpointsMap::iterator breaksIt = it-&gt;value.find(line);
</span><span class="cx">     if (breaksIt == it-&gt;value.end())
</span><span class="cx">         breaksIt = it-&gt;value.set(line, adoptRef(new BreakpointsList)).iterator;
</span><span class="lines">@@ -347,26 +393,23 @@
</span><span class="cx">     BreakpointsList&amp; breakpoints = *breaksIt-&gt;value;
</span><span class="cx">     for (Breakpoint* current = breakpoints.head(); current; current = current-&gt;next()) {
</span><span class="cx">         if (current-&gt;column == column) {
</span><del>-            // The breakpoint already exists. We're not allowed to create a new
-            // breakpoint at this location. Rather than returning the breakpointID
-            // of the pre-existing breakpoint, we need to return noBreakpointID
-            // to indicate that we're not creating a new one.
-            return noBreakpointID;
</del><ins>+            // Found existing breakpoint. Do not create a duplicate at this location.
+            existing = true;
+            return current-&gt;id;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    existing = false;
</ins><span class="cx">     BreakpointID id = ++m_topBreakpointID;
</span><span class="cx">     RELEASE_ASSERT(id != noBreakpointID);
</span><span class="cx"> 
</span><span class="cx">     breakpoint.id = id;
</span><del>-    actualLine = line;
-    actualColumn = column;
</del><span class="cx"> 
</span><span class="cx">     Breakpoint* newBreakpoint = new Breakpoint(breakpoint);
</span><span class="cx">     breakpoints.append(newBreakpoint);
</span><span class="cx">     m_breakpointIDToBreakpoint.set(id, newBreakpoint);
</span><span class="cx"> 
</span><del>-    toggleBreakpoint(breakpoint, BreakpointEnabled);
</del><ins>+    toggleBreakpoint(*newBreakpoint, BreakpointEnabled);
</ins><span class="cx"> 
</span><span class="cx">     return id;
</span><span class="cx"> }
</span><span class="lines">@@ -420,7 +463,7 @@
</span><span class="cx"> 
</span><span class="cx">     unsigned line = position.m_line.zeroBasedInt();
</span><span class="cx">     unsigned column = position.m_column.zeroBasedInt();
</span><del>-
</del><ins>+    
</ins><span class="cx">     LineToBreakpointsMap::const_iterator breaksIt = it-&gt;value.find(line);
</span><span class="cx">     if (breaksIt == it-&gt;value.end())
</span><span class="cx">         return false;
</span><span class="lines">@@ -530,6 +573,11 @@
</span><span class="cx">     m_vm.heap.forEachCodeBlock(functor);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Debugger::clearParsedData()
+{
+    m_parseDataMap.clear();
+}
+
</ins><span class="cx"> void Debugger::setBreakpointsActivated(bool activated)
</span><span class="cx"> {
</span><span class="cx">     if (activated == m_breakpointsActivated)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/debugger/Debugger.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/Debugger.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/debugger/Debugger.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -24,6 +24,7 @@
</span><span class="cx"> #include &quot;Breakpoint.h&quot;
</span><span class="cx"> #include &quot;CallData.h&quot;
</span><span class="cx"> #include &quot;DebuggerCallFrame.h&quot;
</span><ins>+#include &quot;DebuggerParseData.h&quot;
</ins><span class="cx"> #include &quot;DebuggerPrimitives.h&quot;
</span><span class="cx"> #include &quot;JSCJSValue.h&quot;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="lines">@@ -72,9 +73,11 @@
</span><span class="cx">     void detach(JSGlobalObject*, ReasonForDetach);
</span><span class="cx">     bool isAttached(JSGlobalObject*);
</span><span class="cx"> 
</span><del>-    BreakpointID setBreakpoint(Breakpoint, unsigned&amp; actualLine, unsigned&amp; actualColumn);
</del><ins>+    void resolveBreakpoint(Breakpoint&amp;, SourceProvider*);
+    BreakpointID setBreakpoint(Breakpoint&amp;, bool&amp; existing);
</ins><span class="cx">     void removeBreakpoint(BreakpointID);
</span><span class="cx">     void clearBreakpoints();
</span><ins>+
</ins><span class="cx">     void activateBreakpoints() { setBreakpointsActivated(true); }
</span><span class="cx">     void deactivateBreakpoints() { setBreakpointsActivated(false); }
</span><span class="cx">     bool breakpointsActive() const { return m_breakpointsActivated; }
</span><span class="lines">@@ -178,6 +181,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool hasBreakpoint(SourceID, const TextPosition&amp;, Breakpoint* hitBreakpoint);
</span><span class="cx"> 
</span><ins>+    DebuggerParseData&amp; debuggerParseData(SourceID, SourceProvider*);
+
</ins><span class="cx">     void updateNeedForOpDebugCallbacks();
</span><span class="cx"> 
</span><span class="cx">     // These update functions are only needed because our current breakpoints are
</span><span class="lines">@@ -207,9 +212,11 @@
</span><span class="cx">     void toggleBreakpoint(Breakpoint&amp;, BreakpointState);
</span><span class="cx"> 
</span><span class="cx">     void clearDebuggerRequests(JSGlobalObject*);
</span><ins>+    void clearParsedData();
</ins><span class="cx"> 
</span><span class="cx">     VM&amp; m_vm;
</span><span class="cx">     HashSet&lt;JSGlobalObject*&gt; m_globalObjects;
</span><ins>+    HashMap&lt;SourceID, DebuggerParseData&gt; m_parseDataMap;
</ins><span class="cx"> 
</span><span class="cx">     PauseOnExceptionsState m_pauseOnExceptionsState;
</span><span class="cx">     bool m_pauseAtNextOpportunity : 1;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggerParseDatacpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/debugger/DebuggerParseData.cpp (0 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/DebuggerParseData.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/debugger/DebuggerParseData.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -0,0 +1,184 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;DebuggerParseData.h&quot;
+
+#include &quot;Parser.h&quot;
+
+namespace JSC {
+
+Optional&lt;JSTextPosition&gt; DebuggerPausePositions::breakpointLocationForLineColumn(int line, int column)
+{
+    unsigned start = 0;
+    unsigned end = m_positions.size();
+    while (start != end) {
+        unsigned middle = start + ((end - start) / 2);
+        DebuggerPausePosition&amp; pausePosition = m_positions[middle];
+        int pauseLine = pausePosition.position.line;
+        int pauseColumn = pausePosition.position.offset - pausePosition.position.lineStartOffset;
+
+        if (line &lt; pauseLine) {
+            end = middle;
+            continue;
+        }
+        if (line &gt; pauseLine) {
+            start = middle + 1;
+            continue;
+        }
+
+        if (column == pauseColumn) {
+            // Found an exact position match. Roll forward if this was a function Entry.
+            // We are guarenteed to have a Leave for an Entry so we don't need to bounds check.
+            while (true) {
+                if (pausePosition.type != DebuggerPausePositionType::Enter)
+                    return Optional&lt;JSTextPosition&gt;(pausePosition.position);
+                pausePosition = m_positions[middle++];
+            }
+        }
+
+        if (column &lt; pauseColumn)
+            end = middle;
+        else
+            start = middle + 1;
+    }
+
+    // Past the end, no possible pause locations.
+    if (start &gt;= m_positions.size())
+        return Nullopt;
+
+    // If the next location is a function Entry we will need to decide if we should go into
+    // the function or go past the function. We decide to go into the function if the
+    // input is on the same line as the function entry. For example:
+    //
+    //     1. x;
+    //     2.
+    //     3. function foo() {
+    //     4.     x;
+    //     5. }
+    //     6.
+    //     7. x;
+    //
+    // If the input was line 2, skip past functions to pause on line 7.
+    // If the input was line 3, go into the function to pause on line 4.
+
+    // Valid pause location. Use it.
+    DebuggerPausePosition&amp; firstSlidePosition = m_positions[start];
+    if (firstSlidePosition.type != DebuggerPausePositionType::Enter)
+        return Optional&lt;JSTextPosition&gt;(firstSlidePosition.position);
+
+    // Determine if we should enter this function or skip past it.
+    // If entryStackSize is &gt; 0 we are skipping functions.
+    bool shouldEnterFunction = firstSlidePosition.position.line == line;
+    int entryStackSize = shouldEnterFunction ? 0 : 1;
+    for (unsigned i = start + 1; i &lt; m_positions.size(); ++i) {
+        DebuggerPausePosition&amp; slidePosition = m_positions[i];
+        ASSERT(entryStackSize &gt;= 0);
+
+        // Already skipping functions.
+        if (entryStackSize) {
+            if (slidePosition.type == DebuggerPausePositionType::Enter)
+                entryStackSize++;
+            else if (slidePosition.type == DebuggerPausePositionType::Leave)
+                entryStackSize--;
+            continue;
+        }
+
+        // Start skipping functions.
+        if (slidePosition.type == DebuggerPausePositionType::Enter) {
+            entryStackSize++;
+            continue;
+        }
+
+        // Found pause position.
+        return Optional&lt;JSTextPosition&gt;(slidePosition.position);
+    }
+
+    // No pause positions found.
+    return Nullopt;
+}
+
+void DebuggerPausePositions::sort()
+{
+    std::sort(m_positions.begin(), m_positions.end(), [] (const DebuggerPausePosition&amp; a, const DebuggerPausePosition&amp; b) {
+        return a.position.offset &lt; b.position.offset;
+    });
+}
+
+typedef enum { Program, Module } DebuggerParseInfoTag;
+template &lt;DebuggerParseInfoTag T&gt; struct DebuggerParseInfo { };
+
+template &lt;&gt; struct DebuggerParseInfo&lt;Program&gt; {
+    typedef JSC::ProgramNode RootNode;
+    static const SourceParseMode parseMode = SourceParseMode::ProgramMode;
+    static const JSParserStrictMode strictMode = JSParserStrictMode::NotStrict;
+    static const JSParserScriptMode scriptMode = JSParserScriptMode::Classic;
+};
+
+template &lt;&gt; struct DebuggerParseInfo&lt;Module&gt; {
+    typedef JSC::ModuleProgramNode RootNode;
+    static const SourceParseMode parseMode = SourceParseMode::ModuleEvaluateMode;
+    static const JSParserStrictMode strictMode = JSParserStrictMode::Strict;
+    static const JSParserScriptMode scriptMode = JSParserScriptMode::Module;
+};
+
+template &lt;DebuggerParseInfoTag T&gt;
+bool gatherDebuggerParseData(VM&amp; vm, const SourceCode&amp; source, DebuggerParseData&amp; debuggerParseData)
+{
+    typedef typename DebuggerParseInfo&lt;T&gt;::RootNode RootNode;
+    SourceParseMode parseMode = DebuggerParseInfo&lt;T&gt;::parseMode;
+    JSParserStrictMode strictMode = DebuggerParseInfo&lt;T&gt;::strictMode;
+    JSParserScriptMode scriptMode = DebuggerParseInfo&lt;T&gt;::scriptMode;
+
+    ParserError error;
+    std::unique_ptr&lt;RootNode&gt; rootNode = parse&lt;RootNode&gt;(&amp;vm, source, Identifier(),
+        JSParserBuiltinMode::NotBuiltin, strictMode, scriptMode, parseMode, SuperBinding::NotNeeded,
+        error, nullptr, ConstructorKind::None, DerivedContextType::None, EvalContextType::None,
+        &amp;debuggerParseData);
+    if (!rootNode)
+        return false;
+
+    debuggerParseData.pausePositions.sort();
+
+    return true;
+}
+
+bool gatherDebuggerParseDataForSource(VM&amp; vm, SourceProvider* provider, DebuggerParseData&amp; debuggerParseData)
+{
+    int startLine = provider-&gt;startPosition().m_line.oneBasedInt();
+    int startColumn = provider-&gt;startPosition().m_column.oneBasedInt();
+    SourceCode completeSource(provider, startLine, startColumn);
+
+    switch (provider-&gt;sourceType()) {
+    case SourceProviderSourceType::Program:
+        return gatherDebuggerParseData&lt;Program&gt;(vm, completeSource, debuggerParseData);        
+    case SourceProviderSourceType::Module:
+        return gatherDebuggerParseData&lt;Module&gt;(vm, completeSource, debuggerParseData);
+    default:
+        return false;
+    }
+}
+
+} // namespace JSC
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoredebuggerDebuggerParseDatahfromrev206652trunkSourceJavaScriptCoreparserSourceProvidercpp"></a>
<div class="copfile"><h4>Copied: trunk/Source/JavaScriptCore/debugger/DebuggerParseData.h (from rev 206652, trunk/Source/JavaScriptCore/parser/SourceProvider.cpp) (0 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/debugger/DebuggerParseData.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/debugger/DebuggerParseData.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -0,0 +1,81 @@
</span><ins>+/*
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;ParserTokens.h&quot;
+#include &lt;wtf/Optional.h&gt;
+#include &lt;wtf/Vector.h&gt;
+
+namespace JSC {
+
+class SourceProvider;
+class VM;
+
+enum class DebuggerPausePositionType { Enter, Leave, Pause };
+struct DebuggerPausePosition {
+    DebuggerPausePositionType type;
+    JSTextPosition position;
+};
+
+class DebuggerPausePositions {
+public:
+    DebuggerPausePositions() { }
+    ~DebuggerPausePositions() { }
+
+    void appendPause(const JSTextPosition&amp; position)
+    {
+        m_positions.append({ DebuggerPausePositionType::Pause, position });
+    }
+
+    void appendEntry(const JSTextPosition&amp; position)
+    {
+        m_positions.append({ DebuggerPausePositionType::Enter, position });
+    }
+
+    void appendLeave(const JSTextPosition&amp; position)
+    {
+        m_positions.append({ DebuggerPausePositionType::Leave, position });
+    }
+
+    Optional&lt;JSTextPosition&gt; breakpointLocationForLineColumn(int line, int column);
+
+    void sort();
+
+private:
+    Vector&lt;DebuggerPausePosition&gt; m_positions;
+};
+
+
+struct DebuggerParseData {
+    DebuggerParseData() { }
+    ~DebuggerParseData() { }
+
+    DebuggerPausePositions pausePositions;
+};
+
+bool gatherDebuggerParseDataForSource(VM&amp;, SourceProvider*, DebuggerParseData&amp;);
+
+} // namespace JSC
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorScriptDebugListenerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/ScriptDebugListener.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/ScriptDebugListener.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/inspector/ScriptDebugListener.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include &quot;debugger/Debugger.h&quot;
</span><ins>+#include &quot;parser/SourceProvider.h&quot;
</ins><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace Inspector {
</span><span class="lines">@@ -43,6 +44,7 @@
</span><span class="cx">         String source;
</span><span class="cx">         String sourceURL;
</span><span class="cx">         String sourceMappingURL;
</span><ins>+        RefPtr&lt;JSC::SourceProvider&gt; sourceProvider;
</ins><span class="cx">         int startLine {0};
</span><span class="cx">         int startColumn {0};
</span><span class="cx">         int endLine {0};
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorScriptDebugServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -36,7 +36,6 @@
</span><span class="cx"> #include &quot;Exception.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &quot;JSJavaScriptCallFrame.h&quot;
</span><del>-#include &quot;JSLock.h&quot;
</del><span class="cx"> #include &quot;JavaScriptCallFrame.h&quot;
</span><span class="cx"> #include &quot;ScriptValue.h&quot;
</span><span class="cx"> #include &quot;SourceProvider.h&quot;
</span><span class="lines">@@ -56,34 +55,38 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSC::BreakpointID ScriptDebugServer::setBreakpoint(JSC::SourceID sourceID, const ScriptBreakpoint&amp; scriptBreakpoint, unsigned* actualLineNumber, unsigned* actualColumnNumber)
</del><ins>+void ScriptDebugServer::setBreakpointActions(BreakpointID id, const ScriptBreakpoint&amp; scriptBreakpoint)
</ins><span class="cx"> {
</span><del>-    if (!sourceID)
-        return JSC::noBreakpointID;
</del><ins>+    ASSERT(id != noBreakpointID);
+    ASSERT(!m_breakpointIDToActions.contains(id));
</ins><span class="cx"> 
</span><del>-    JSC::Breakpoint breakpoint(sourceID, scriptBreakpoint.lineNumber, scriptBreakpoint.columnNumber, scriptBreakpoint.condition, scriptBreakpoint.autoContinue, scriptBreakpoint.ignoreCount);
-    JSC::BreakpointID id = Debugger::setBreakpoint(breakpoint, *actualLineNumber, *actualColumnNumber);
-    if (id != JSC::noBreakpointID &amp;&amp; !scriptBreakpoint.actions.isEmpty()) {
-#ifndef NDEBUG
-        BreakpointIDToActionsMap::iterator it = m_breakpointIDToActions.find(id);
-        ASSERT(it == m_breakpointIDToActions.end());
-#endif
-        const BreakpointActions&amp; actions = scriptBreakpoint.actions;
-        m_breakpointIDToActions.set(id, actions);
-    }
-    return id;
</del><ins>+    m_breakpointIDToActions.set(id, scriptBreakpoint.actions);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ScriptDebugServer::removeBreakpoint(JSC::BreakpointID id)
</del><ins>+void ScriptDebugServer::removeBreakpointActions(BreakpointID id)
</ins><span class="cx"> {
</span><del>-    ASSERT(id != JSC::noBreakpointID);
-    BreakpointIDToActionsMap::iterator it = m_breakpointIDToActions.find(id);
-    if (it != m_breakpointIDToActions.end())
-        m_breakpointIDToActions.remove(it);
</del><ins>+    ASSERT(id != noBreakpointID);
</ins><span class="cx"> 
</span><del>-    Debugger::removeBreakpoint(id);
</del><ins>+    m_breakpointIDToActions.remove(id);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+const BreakpointActions&amp; ScriptDebugServer::getActionsForBreakpoint(BreakpointID id)
+{
+    ASSERT(id != noBreakpointID);
+
+    auto entry = m_breakpointIDToActions.find(id);
+    if (entry != m_breakpointIDToActions.end())
+        return entry-&gt;value;
+
+    static NeverDestroyed&lt;BreakpointActions&gt; emptyActionVector = BreakpointActions();
+    return emptyActionVector;
+}
+
+void ScriptDebugServer::clearBreakpointActions()
+{
+    m_breakpointIDToActions.clear();
+}
+
</ins><span class="cx"> bool ScriptDebugServer::evaluateBreakpointAction(const ScriptBreakpointAction&amp; breakpointAction)
</span><span class="cx"> {
</span><span class="cx">     DebuggerCallFrame* debuggerCallFrame = currentDebuggerCallFrame();
</span><span class="lines">@@ -111,7 +114,7 @@
</span><span class="cx">         JSC::ExecState* exec = debuggerCallFrame-&gt;globalExec();
</span><span class="cx">         if (exception)
</span><span class="cx">             reportException(exec, exception);
</span><del>-        
</del><ins>+
</ins><span class="cx">         dispatchBreakpointActionProbe(exec, breakpointAction, exception ? exception-&gt;value() : result);
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -122,12 +125,6 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ScriptDebugServer::clearBreakpoints()
-{
-    Debugger::clearBreakpoints();
-    m_breakpointIDToActions.clear();
-}
-
</del><span class="cx"> void ScriptDebugServer::dispatchDidPause(ScriptDebugListener* listener)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isPaused());
</span><span class="lines">@@ -197,7 +194,9 @@
</span><span class="cx"> {
</span><span class="cx">     JSC::SourceID sourceID = sourceProvider-&gt;asID();
</span><span class="cx"> 
</span><ins>+    // FIXME: &lt;https://webkit.org/b/162773&gt; Web Inspector: Simplify ScriptDebugListener::Script to use SourceProvider
</ins><span class="cx">     ScriptDebugListener::Script script;
</span><ins>+    script.sourceProvider = sourceProvider;
</ins><span class="cx">     script.url = sourceProvider-&gt;url();
</span><span class="cx">     script.source = sourceProvider-&gt;source().toString();
</span><span class="cx">     script.startLine = sourceProvider-&gt;startPosition().m_line.zeroBasedInt();
</span><span class="lines">@@ -289,9 +288,9 @@
</span><span class="cx"> 
</span><span class="cx">     m_currentProbeBatchId++;
</span><span class="cx"> 
</span><del>-    BreakpointIDToActionsMap::iterator it = m_breakpointIDToActions.find(breakpoint.id);
-    if (it != m_breakpointIDToActions.end()) {
-        BreakpointActions actions = it-&gt;value;
</del><ins>+    auto entry = m_breakpointIDToActions.find(breakpoint.id);
+    if (entry != m_breakpointIDToActions.end()) {
+        BreakpointActions actions = entry-&gt;value;
</ins><span class="cx">         for (size_t i = 0; i &lt; actions.size(); ++i) {
</span><span class="cx">             if (!evaluateBreakpointAction(actions[i]))
</span><span class="cx">                 return;
</span><span class="lines">@@ -318,17 +317,6 @@
</span><span class="cx">     dispatchFunctionToListeners(&amp;ScriptDebugServer::dispatchDidContinue);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const BreakpointActions&amp; ScriptDebugServer::getActionsForBreakpoint(JSC::BreakpointID breakpointID)
-{
-    ASSERT(breakpointID != JSC::noBreakpointID);
-
-    if (m_breakpointIDToActions.contains(breakpointID))
-        return m_breakpointIDToActions.find(breakpointID)-&gt;value;
-    
-    static NeverDestroyed&lt;BreakpointActions&gt; emptyActionVector = BreakpointActions();
-    return emptyActionVector;
-}
-
</del><span class="cx"> void ScriptDebugServer::addListener(ScriptDebugListener* listener)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(listener);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorScriptDebugServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -49,10 +49,12 @@
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(ScriptDebugServer);
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>-    JSC::BreakpointID setBreakpoint(JSC::SourceID, const ScriptBreakpoint&amp;, unsigned* actualLineNumber, unsigned* actualColumnNumber);
-    void removeBreakpoint(JSC::BreakpointID);
-    void clearBreakpoints();
</del><span class="cx"> 
</span><ins>+    // FIXME: Move BreakpointAction handling into JSC::Debugger or InspectorDebuggerAgent.
+    void setBreakpointActions(JSC::BreakpointID, const ScriptBreakpoint&amp;);
+    void removeBreakpointActions(JSC::BreakpointID);
+    void clearBreakpointActions();
+
</ins><span class="cx">     const BreakpointActions&amp; getActionsForBreakpoint(JSC::BreakpointID);
</span><span class="cx"> 
</span><span class="cx">     void addListener(ScriptDebugListener*);
</span><span class="lines">@@ -86,7 +88,7 @@
</span><span class="cx">     void dispatchBreakpointActionSound(JSC::ExecState*, int breakpointActionIdentifier);
</span><span class="cx">     void dispatchBreakpointActionProbe(JSC::ExecState*, const ScriptBreakpointAction&amp;, JSC::JSValue sample);
</span><span class="cx"> 
</span><del>-    bool m_doneProcessingDebuggerEvents {true};
</del><ins>+    bool m_doneProcessingDebuggerEvents { true };
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     typedef HashMap&lt;JSC::BreakpointID, BreakpointActions&gt; BreakpointIDToActionsMap;
</span><span class="lines">@@ -100,12 +102,10 @@
</span><span class="cx">     JSC::JSValue exceptionOrCaughtValue(JSC::ExecState*);
</span><span class="cx"> 
</span><span class="cx">     BreakpointIDToActionsMap m_breakpointIDToActions;
</span><del>-
</del><span class="cx">     ListenerSet m_listeners;
</span><del>-    bool m_callingListeners {false};
-
-    unsigned m_nextProbeSampleId {1};
-    unsigned m_currentProbeBatchId {0};
</del><ins>+    bool m_callingListeners { false };
+    unsigned m_nextProbeSampleId { 1 };
+    unsigned m_currentProbeBatchId { 0 };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -289,6 +289,34 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static RefPtr&lt;Inspector::Protocol::Debugger::Location&gt; buildDebuggerLocation(const JSC::Breakpoint&amp; breakpoint)
+{
+    ASSERT(breakpoint.resolved);
+
+    auto location = Inspector::Protocol::Debugger::Location::create()
+        .setScriptId(String::number(breakpoint.sourceID))
+        .setLineNumber(breakpoint.line)
+        .release();
+    location-&gt;setColumnNumber(breakpoint.column);
+
+    return WTFMove(location);
+}
+
+static bool parseLocation(ErrorString&amp; errorString, const InspectorObject&amp; location, JSC::SourceID&amp; sourceID, unsigned&amp; lineNumber, unsigned&amp; columnNumber)
+{
+    String scriptIDStr;
+    if (!location.getString(ASCIILiteral(&quot;scriptId&quot;), scriptIDStr) || !location.getInteger(ASCIILiteral(&quot;lineNumber&quot;), lineNumber)) {
+        sourceID = JSC::noSourceID;
+        errorString = ASCIILiteral(&quot;scriptId and lineNumber are required.&quot;);
+        return false;
+    }
+
+    sourceID = scriptIDStr.toIntPtr();
+    columnNumber = 0;
+    location.getInteger(ASCIILiteral(&quot;columnNumber&quot;), columnNumber);
+    return true;
+}
+
</ins><span class="cx"> void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString&amp; errorString, int lineNumber, const String* const optionalURL, const String* const optionalURLRegex, const int* const optionalColumnNumber, const InspectorObject* options, Inspector::Protocol::Debugger::BreakpointId* outBreakpointIdentifier, RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::Debugger::Location&gt;&gt;&amp; locations)
</span><span class="cx"> {
</span><span class="cx">     locations = Inspector::Protocol::Array&lt;Inspector::Protocol::Debugger::Location&gt;::create();
</span><span class="lines">@@ -324,32 +352,30 @@
</span><span class="cx"> 
</span><span class="cx">     m_javaScriptBreakpoints.set(breakpointIdentifier, buildObjectForBreakpointCookie(url, lineNumber, columnNumber, condition, actions, isRegex, autoContinue, ignoreCount));
</span><span class="cx"> 
</span><del>-    ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition, breakpointActions, autoContinue, ignoreCount);
-    for (ScriptsMap::iterator it = m_scripts.begin(); it != m_scripts.end(); ++it) {
-        String scriptURLForBreakpoints = !it-&gt;value.sourceURL.isEmpty() ? it-&gt;value.sourceURL : it-&gt;value.url;
</del><ins>+    for (auto&amp; entry : m_scripts) {
+        Script&amp; script = entry.value;
+        String scriptURLForBreakpoints = !script.sourceURL.isEmpty() ? script.sourceURL : script.url;
</ins><span class="cx">         if (!matches(scriptURLForBreakpoints, url, isRegex))
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        RefPtr&lt;Inspector::Protocol::Debugger::Location&gt; location = resolveBreakpoint(breakpointIdentifier, it-&gt;key, breakpoint);
-        if (location)
-            locations-&gt;addItem(WTFMove(location));
-    }
-    *outBreakpointIdentifier = breakpointIdentifier;
-}
</del><ins>+        JSC::SourceID sourceID = entry.key;
+        JSC::Breakpoint breakpoint(sourceID, lineNumber, columnNumber, condition, autoContinue, ignoreCount);
+        resolveBreakpoint(script, breakpoint);
+        if (!breakpoint.resolved)
+            continue;
</ins><span class="cx"> 
</span><del>-static bool parseLocation(ErrorString&amp; errorString, const InspectorObject&amp; location, JSC::SourceID&amp; sourceID, unsigned&amp; lineNumber, unsigned&amp; columnNumber)
-{
-    String scriptIDStr;
-    if (!location.getString(ASCIILiteral(&quot;scriptId&quot;), scriptIDStr) || !location.getInteger(ASCIILiteral(&quot;lineNumber&quot;), lineNumber)) {
-        sourceID = JSC::noSourceID;
-        errorString = ASCIILiteral(&quot;scriptId and lineNumber are required.&quot;);
-        return false;
</del><ins>+        bool existing;
+        setBreakpoint(breakpoint, existing);
+        if (existing)
+            continue;
+
+        ScriptBreakpoint scriptBreakpoint(breakpoint.line, breakpoint.column, condition, breakpointActions, autoContinue, ignoreCount);
+        didSetBreakpoint(breakpoint, breakpointIdentifier, scriptBreakpoint);
+
+        locations-&gt;addItem(buildDebuggerLocation(breakpoint));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    sourceID = scriptIDStr.toIntPtr();
-    columnNumber = 0;
-    location.getInteger(ASCIILiteral(&quot;columnNumber&quot;), columnNumber);
-    return true;
</del><ins>+    *outBreakpointIdentifier = breakpointIdentifier;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorDebuggerAgent::setBreakpoint(ErrorString&amp; errorString, const InspectorObject&amp; location, const InspectorObject* options, Inspector::Protocol::Debugger::BreakpointId* outBreakpointIdentifier, RefPtr&lt;Inspector::Protocol::Debugger::Location&gt;&amp; actualLocation)
</span><span class="lines">@@ -375,22 +401,61 @@
</span><span class="cx">     if (!breakpointActionsFromProtocol(errorString, actions, &amp;breakpointActions))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    String breakpointIdentifier = String::number(sourceID) + ':' + String::number(lineNumber) + ':' + String::number(columnNumber);
-    if (m_breakpointIdentifierToDebugServerBreakpointIDs.find(breakpointIdentifier) != m_breakpointIdentifierToDebugServerBreakpointIDs.end()) {
-        errorString = ASCIILiteral(&quot;Breakpoint at specified location already exists.&quot;);
</del><ins>+    auto scriptIterator = m_scripts.find(sourceID);
+    if (scriptIterator == m_scripts.end()) {
+        errorString = ASCIILiteral(&quot;No script for id: &quot;) + String::number(sourceID);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition, breakpointActions, autoContinue, ignoreCount);
-    actualLocation = resolveBreakpoint(breakpointIdentifier, sourceID, breakpoint);
-    if (!actualLocation) {
</del><ins>+    Script&amp; script = scriptIterator-&gt;value;
+    JSC::Breakpoint breakpoint(sourceID, lineNumber, columnNumber, condition, autoContinue, ignoreCount);
+    resolveBreakpoint(script, breakpoint);
+    if (!breakpoint.resolved) {
</ins><span class="cx">         errorString = ASCIILiteral(&quot;Could not resolve breakpoint&quot;);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool existing;
+    setBreakpoint(breakpoint, existing);
+    if (existing) {
+        errorString = ASCIILiteral(&quot;Breakpoint at specified location already exists&quot;);
+        return;
+    }
+
+    String breakpointIdentifier = String::number(sourceID) + ':' + String::number(breakpoint.line) + ':' + String::number(breakpoint.column);
+    ScriptBreakpoint scriptBreakpoint(breakpoint.line, breakpoint.column, condition, breakpointActions, autoContinue, ignoreCount);
+    didSetBreakpoint(breakpoint, breakpointIdentifier, scriptBreakpoint);
+
+    actualLocation = buildDebuggerLocation(breakpoint);
</ins><span class="cx">     *outBreakpointIdentifier = breakpointIdentifier;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void InspectorDebuggerAgent::didSetBreakpoint(const JSC::Breakpoint&amp; breakpoint, const String&amp; breakpointIdentifier, const ScriptBreakpoint&amp; scriptBreakpoint)
+{
+    JSC::BreakpointID id = breakpoint.id;
+    m_scriptDebugServer.setBreakpointActions(id, scriptBreakpoint);
+
+    auto debugServerBreakpointIDsIterator = m_breakpointIdentifierToDebugServerBreakpointIDs.find(breakpointIdentifier);
+    if (debugServerBreakpointIDsIterator == m_breakpointIdentifierToDebugServerBreakpointIDs.end())
+        debugServerBreakpointIDsIterator = m_breakpointIdentifierToDebugServerBreakpointIDs.set(breakpointIdentifier, Vector&lt;JSC::BreakpointID&gt;()).iterator;
+    debugServerBreakpointIDsIterator-&gt;value.append(id);
+
+    m_debuggerBreakpointIdentifierToInspectorBreakpointIdentifier.set(id, breakpointIdentifier);
+}
+
+void InspectorDebuggerAgent::resolveBreakpoint(const Script&amp; script, JSC::Breakpoint&amp; breakpoint)
+{
+    if (breakpoint.line &lt; static_cast&lt;unsigned&gt;(script.startLine) || static_cast&lt;unsigned&gt;(script.endLine) &lt; breakpoint.line)
+        return;
+
+    m_scriptDebugServer.resolveBreakpoint(breakpoint, script.sourceProvider.get());
+}
+
+void InspectorDebuggerAgent::setBreakpoint(JSC::Breakpoint&amp; breakpoint, bool&amp; existing)
+{
+    m_scriptDebugServer.setBreakpoint(breakpoint, existing);
+}
+
</ins><span class="cx"> void InspectorDebuggerAgent::removeBreakpoint(ErrorString&amp;, const String&amp; breakpointIdentifier)
</span><span class="cx"> {
</span><span class="cx">     m_javaScriptBreakpoints.remove(breakpointIdentifier);
</span><span class="lines">@@ -402,6 +467,7 @@
</span><span class="cx">         for (auto&amp; action : breakpointActions)
</span><span class="cx">             m_injectedScriptManager.releaseObjectGroup(objectGroupForBreakpointAction(action));
</span><span class="cx"> 
</span><ins>+        m_scriptDebugServer.removeBreakpointActions(breakpointID);
</ins><span class="cx">         m_scriptDebugServer.removeBreakpoint(breakpointID);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -419,39 +485,35 @@
</span><span class="cx">     if (!parseLocation(errorString, location, sourceID, lineNumber, columnNumber))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    ScriptBreakpoint breakpoint(lineNumber, columnNumber, &quot;&quot;, false, 0);
-    m_continueToLocationBreakpointID = m_scriptDebugServer.setBreakpoint(sourceID, breakpoint, &amp;lineNumber, &amp;columnNumber);
-    resume(errorString);
-}
</del><ins>+    auto scriptIterator = m_scripts.find(sourceID);
+    if (scriptIterator == m_scripts.end()) {
+        m_scriptDebugServer.continueProgram();
+        errorString = ASCIILiteral(&quot;No script for id: &quot;) + String::number(sourceID);
+        return;
+    }
</ins><span class="cx"> 
</span><del>-RefPtr&lt;Inspector::Protocol::Debugger::Location&gt; InspectorDebuggerAgent::resolveBreakpoint(const String&amp; breakpointIdentifier, JSC::SourceID sourceID, const ScriptBreakpoint&amp; breakpoint)
-{
-    ScriptsMap::iterator scriptIterator = m_scripts.find(sourceID);
-    if (scriptIterator == m_scripts.end())
-        return nullptr;
</del><ins>+    String condition;
+    bool autoContinue = false;
+    unsigned ignoreCount = 0;
+    JSC::Breakpoint breakpoint(sourceID, lineNumber, columnNumber, condition, autoContinue, ignoreCount);
</ins><span class="cx">     Script&amp; script = scriptIterator-&gt;value;
</span><del>-    if (breakpoint.lineNumber &lt; script.startLine || script.endLine &lt; breakpoint.lineNumber)
-        return nullptr;
</del><ins>+    resolveBreakpoint(script, breakpoint);
+    if (!breakpoint.resolved) {
+        m_scriptDebugServer.continueProgram();
+        errorString = ASCIILiteral(&quot;Could not resolve breakpoint&quot;);
+        return;
+    }
</ins><span class="cx"> 
</span><del>-    unsigned actualLineNumber;
-    unsigned actualColumnNumber;
-    JSC::BreakpointID debugServerBreakpointID = m_scriptDebugServer.setBreakpoint(sourceID, breakpoint, &amp;actualLineNumber, &amp;actualColumnNumber);
-    if (debugServerBreakpointID == JSC::noBreakpointID)
-        return nullptr;
</del><ins>+    bool existing;
+    setBreakpoint(breakpoint, existing);
+    if (existing) {
+        m_scriptDebugServer.continueProgram();
+        return;
+    }
</ins><span class="cx"> 
</span><del>-    BreakpointIdentifierToDebugServerBreakpointIDsMap::iterator debugServerBreakpointIDsIterator = m_breakpointIdentifierToDebugServerBreakpointIDs.find(breakpointIdentifier);
-    if (debugServerBreakpointIDsIterator == m_breakpointIdentifierToDebugServerBreakpointIDs.end())
-        debugServerBreakpointIDsIterator = m_breakpointIdentifierToDebugServerBreakpointIDs.set(breakpointIdentifier, Vector&lt;JSC::BreakpointID&gt;()).iterator;
-    debugServerBreakpointIDsIterator-&gt;value.append(debugServerBreakpointID);
-    
-    m_debuggerBreakpointIdentifierToInspectorBreakpointIdentifier.set(debugServerBreakpointID, breakpointIdentifier);
</del><ins>+    m_continueToLocationBreakpointID = breakpoint.id;
</ins><span class="cx"> 
</span><del>-    auto location = Inspector::Protocol::Debugger::Location::create()
-        .setScriptId(String::number(sourceID))
-        .setLineNumber(actualLineNumber)
-        .release();
-    location-&gt;setColumnNumber(actualColumnNumber);
-    return WTFMove(location);
</del><ins>+    resume(errorString);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorDebuggerAgent::searchInContent(ErrorString&amp; error, const String&amp; scriptIDStr, const String&amp; query, const bool* optionalCaseSensitive, const bool* optionalIsRegex, RefPtr&lt;Inspector::Protocol::Array&lt;Inspector::Protocol::GenericTypes::SearchMatch&gt;&gt;&amp; results)
</span><span class="lines">@@ -638,10 +700,8 @@
</span><span class="cx">     if (scriptURLForBreakpoints.isEmpty())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    for (auto it = m_javaScriptBreakpoints.begin(), end = m_javaScriptBreakpoints.end(); it != end; ++it) {
-        RefPtr&lt;InspectorObject&gt; breakpointObject;
-        if (!it-&gt;value-&gt;asObject(breakpointObject))
-            return;
</del><ins>+    for (auto&amp; entry : m_javaScriptBreakpoints) {
+        RefPtr&lt;InspectorObject&gt; breakpointObject = entry.value;
</ins><span class="cx"> 
</span><span class="cx">         bool isRegex;
</span><span class="cx">         String url;
</span><span class="lines">@@ -650,23 +710,34 @@
</span><span class="cx">         if (!matches(scriptURLForBreakpoints, url, isRegex))
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        ScriptBreakpoint breakpoint;
-        breakpointObject-&gt;getInteger(ASCIILiteral(&quot;lineNumber&quot;), breakpoint.lineNumber);
-        breakpointObject-&gt;getInteger(ASCIILiteral(&quot;columnNumber&quot;), breakpoint.columnNumber);
-        breakpointObject-&gt;getString(ASCIILiteral(&quot;condition&quot;), breakpoint.condition);
-        breakpointObject-&gt;getBoolean(ASCIILiteral(&quot;autoContinue&quot;), breakpoint.autoContinue);
-        breakpointObject-&gt;getInteger(ASCIILiteral(&quot;ignoreCount&quot;), breakpoint.ignoreCount);
</del><ins>+        ScriptBreakpoint scriptBreakpoint;
+        breakpointObject-&gt;getInteger(ASCIILiteral(&quot;lineNumber&quot;), scriptBreakpoint.lineNumber);
+        breakpointObject-&gt;getInteger(ASCIILiteral(&quot;columnNumber&quot;), scriptBreakpoint.columnNumber);
+        breakpointObject-&gt;getString(ASCIILiteral(&quot;condition&quot;), scriptBreakpoint.condition);
+        breakpointObject-&gt;getBoolean(ASCIILiteral(&quot;autoContinue&quot;), scriptBreakpoint.autoContinue);
+        breakpointObject-&gt;getInteger(ASCIILiteral(&quot;ignoreCount&quot;), scriptBreakpoint.ignoreCount);
</ins><span class="cx">         ErrorString errorString;
</span><span class="cx">         RefPtr&lt;InspectorArray&gt; actions;
</span><span class="cx">         breakpointObject-&gt;getArray(ASCIILiteral(&quot;actions&quot;), actions);
</span><del>-        if (!breakpointActionsFromProtocol(errorString, actions, &amp;breakpoint.actions)) {
</del><ins>+        if (!breakpointActionsFromProtocol(errorString, actions, &amp;scriptBreakpoint.actions)) {
</ins><span class="cx">             ASSERT_NOT_REACHED();
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        RefPtr&lt;Inspector::Protocol::Debugger::Location&gt; location = resolveBreakpoint(it-&gt;key, sourceID, breakpoint);
-        if (location)
-            m_frontendDispatcher-&gt;breakpointResolved(it-&gt;key, location);
</del><ins>+        JSC::Breakpoint breakpoint(sourceID, scriptBreakpoint.lineNumber, scriptBreakpoint.columnNumber, scriptBreakpoint.condition, scriptBreakpoint.autoContinue, scriptBreakpoint.ignoreCount);
+        resolveBreakpoint(script, breakpoint);
+        if (!breakpoint.resolved)
+            continue;
+
+        bool existing;
+        setBreakpoint(breakpoint, existing);
+        if (existing)
+            continue;
+
+        String breakpointIdentifier = entry.key;
+        didSetBreakpoint(breakpoint, breakpointIdentifier, scriptBreakpoint);
+
+        m_frontendDispatcher-&gt;breakpointResolved(breakpointIdentifier, buildDebuggerLocation(breakpoint));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -795,6 +866,7 @@
</span><span class="cx"> 
</span><span class="cx"> void InspectorDebuggerAgent::clearDebuggerBreakpointState()
</span><span class="cx"> {
</span><ins>+    m_scriptDebugServer.clearBreakpointActions();
</ins><span class="cx">     m_scriptDebugServer.clearBreakpoints();
</span><span class="cx"> 
</span><span class="cx">     m_pausedScriptState = nullptr;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectoragentsInspectorDebuggerAgenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -47,7 +47,6 @@
</span><span class="cx"> class InjectedScriptManager;
</span><span class="cx"> class InspectorArray;
</span><span class="cx"> class InspectorObject;
</span><del>-class InspectorValue;
</del><span class="cx"> class ScriptDebugServer;
</span><span class="cx"> typedef String ErrorString;
</span><span class="cx"> 
</span><span class="lines">@@ -131,7 +130,10 @@
</span><span class="cx">     void breakpointActionSound(int breakpointActionIdentifier) final;
</span><span class="cx">     void breakpointActionProbe(JSC::ExecState&amp;, const ScriptBreakpointAction&amp;, unsigned batchId, unsigned sampleId, JSC::JSValue sample) final;
</span><span class="cx"> 
</span><del>-    RefPtr&lt;Inspector::Protocol::Debugger::Location&gt; resolveBreakpoint(const String&amp; breakpointIdentifier, JSC::SourceID, const ScriptBreakpoint&amp;);
</del><ins>+    void resolveBreakpoint(const Script&amp;, JSC::Breakpoint&amp;);
+    void setBreakpoint(JSC::Breakpoint&amp;, bool&amp; existing);    
+    void didSetBreakpoint(const JSC::Breakpoint&amp;, const String&amp;, const ScriptBreakpoint&amp;);
+
</ins><span class="cx">     bool assertPaused(ErrorString&amp;);
</span><span class="cx">     void clearDebuggerBreakpointState();
</span><span class="cx">     void clearInspectorBreakpointState();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jsc.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jsc.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/jsc.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -1977,7 +1977,7 @@
</span><span class="cx">     stopWatch.start();
</span><span class="cx"> 
</span><span class="cx">     ParserError error;
</span><del>-    bool validSyntax = checkModuleSyntax(exec, makeSource(source), error);
</del><ins>+    bool validSyntax = checkModuleSyntax(exec, makeSource(source, String(), TextPosition::minimumPosition(), SourceProviderSourceType::Module), error);
</ins><span class="cx">     stopWatch.stop();
</span><span class="cx"> 
</span><span class="cx">     if (!validSyntax)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserASTBuilderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/ASTBuilder.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/parser/ASTBuilder.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -612,6 +612,11 @@
</span><span class="cx">         return isObjectLiteral(node) || isArrayLiteral(node);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool shouldSkipPauseLocation(StatementNode* statement) const
+    {
+        return !statement || statement-&gt;isLabel();
+    }
+
</ins><span class="cx">     StatementNode* createEmptyStatement(const JSTokenLocation&amp; location) { return new (m_parserArena) EmptyStatementNode(location); }
</span><span class="cx"> 
</span><span class="cx">     StatementNode* createDeclarationStatement(const JSTokenLocation&amp; location, ExpressionNode* expr, int start, int end)
</span><span class="lines">@@ -968,7 +973,18 @@
</span><span class="cx">         node-&gt;setStartOffset(offset);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    JSTextPosition breakpointLocation(StatementNode* statement)
+    {
+        statement-&gt;setNeedsDebugHook();
+        return statement-&gt;position();
+    }
</ins><span class="cx"> 
</span><ins>+    JSTextPosition breakpointLocation(ExpressionNode* expr)
+    {
+        expr-&gt;setNeedsDebugHook();
+        return expr-&gt;position();
+    }
+
</ins><span class="cx">     void propagateArgumentsUse() { usesArguments(); }
</span><span class="cx">     
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserNodesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Nodes.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Nodes.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/parser/Nodes.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> #include &quot;JITCode.h&quot;
</span><span class="cx"> #include &quot;ParserArena.h&quot;
</span><span class="cx"> #include &quot;ParserTokens.h&quot;
</span><span class="lines">@@ -190,8 +191,12 @@
</span><span class="cx"> 
</span><span class="cx">         ResultType resultDescriptor() const { return m_resultType; }
</span><span class="cx"> 
</span><ins>+        bool needsDebugHook() { return m_needsDebugHook; }
+        void setNeedsDebugHook() { m_needsDebugHook = true; }
+
</ins><span class="cx">     private:
</span><span class="cx">         ResultType m_resultType;
</span><ins>+        bool m_needsDebugHook { false };
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     class StatementNode : public Node {
</span><span class="lines">@@ -213,14 +218,19 @@
</span><span class="cx">         virtual bool isExprStatement() const { return false; }
</span><span class="cx">         virtual bool isBreak() const { return false; }
</span><span class="cx">         virtual bool isContinue() const { return false; }
</span><ins>+        virtual bool isLabel() const { return false; }
</ins><span class="cx">         virtual bool isBlock() const { return false; }
</span><span class="cx">         virtual bool isFuncDeclNode() const { return false; }
</span><span class="cx">         virtual bool isModuleDeclarationNode() const { return false; }
</span><span class="cx">         virtual bool isForOfNode() const { return false; }
</span><span class="cx"> 
</span><ins>+        bool needsDebugHook() { return m_needsDebugHook; }
+        void setNeedsDebugHook() { m_needsDebugHook = true; }
+
</ins><span class="cx">     protected:
</span><span class="cx">         StatementNode* m_next;
</span><span class="cx">         int m_lastLine;
</span><ins>+        bool m_needsDebugHook { false };
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     class VariableEnvironmentNode : public ParserArenaDeletable {
</span><span class="lines">@@ -1546,6 +1556,8 @@
</span><span class="cx">     public:
</span><span class="cx">         LabelNode(const JSTokenLocation&amp;, const Identifier&amp; name, StatementNode*);
</span><span class="cx"> 
</span><ins>+        bool isLabel() const override { return true; }
+
</ins><span class="cx">     private:
</span><span class="cx">         void emitBytecode(BytecodeGenerator&amp;, RegisterID* = 0) override;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/parser/Parser.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -24,6 +24,7 @@
</span><span class="cx"> #include &quot;Parser.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ASTBuilder.h&quot;
</span><ins>+#include &quot;DebuggerParseData.h&quot;
</ins><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &quot;SetForScope.h&quot;
</span><span class="cx"> #include &quot;VM.h&quot;
</span><span class="lines">@@ -30,7 +31,6 @@
</span><span class="cx"> #include &lt;utility&gt;
</span><span class="cx"> #include &lt;wtf/StringPrintStream.h&gt;
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> #define updateErrorMessage(shouldPrintToken, ...) do {\
</span><span class="cx">     propagateError(); \
</span><span class="cx">     logError(shouldPrintToken, __VA_ARGS__); \
</span><span class="lines">@@ -190,7 +190,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><del>-Parser&lt;LexerType&gt;::Parser(VM* vm, const SourceCode&amp; source, JSParserBuiltinMode builtinMode, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, SourceParseMode parseMode, SuperBinding superBinding, ConstructorKind defaultConstructorKind, DerivedContextType derivedContextType, bool isEvalContext, EvalContextType evalContextType)
</del><ins>+Parser&lt;LexerType&gt;::Parser(VM* vm, const SourceCode&amp; source, JSParserBuiltinMode builtinMode, JSParserStrictMode strictMode, JSParserScriptMode scriptMode, SourceParseMode parseMode, SuperBinding superBinding, ConstructorKind defaultConstructorKind, DerivedContextType derivedContextType, bool isEvalContext, EvalContextType evalContextType, DebuggerParseData* debuggerParseData)
</ins><span class="cx">     : m_vm(vm)
</span><span class="cx">     , m_source(&amp;source)
</span><span class="cx">     , m_hasStackOverflow(false)
</span><span class="lines">@@ -203,6 +203,7 @@
</span><span class="cx">     , m_superBinding(superBinding)
</span><span class="cx">     , m_defaultConstructorKind(defaultConstructorKind)
</span><span class="cx">     , m_immediateParentAllowsFunctionDeclarationInStatement(false)
</span><ins>+    , m_debuggerParseData(debuggerParseData)
</ins><span class="cx"> {
</span><span class="cx">     m_lexer = std::make_unique&lt;LexerType&gt;(vm, builtinMode, scriptMode);
</span><span class="cx">     m_lexer-&gt;setCode(source, &amp;m_parserArena);
</span><span class="lines">@@ -592,9 +593,12 @@
</span><span class="cx">     m_statementDepth++;
</span><span class="cx">     TreeStatement result = 0;
</span><span class="cx">     bool shouldSetEndOffset = true;
</span><ins>+    bool shouldSetPauseLocation = false;
+
</ins><span class="cx">     switch (m_token.m_type) {
</span><span class="cx">     case CONSTTOKEN:
</span><span class="cx">         result = parseVariableDeclaration(context, DeclarationType::ConstDeclaration);
</span><ins>+        shouldSetPauseLocation = true;
</ins><span class="cx">         break;
</span><span class="cx">     case LET: {
</span><span class="cx">         bool shouldParseVariableDeclaration = true;
</span><span class="lines">@@ -616,7 +620,7 @@
</span><span class="cx">             bool allowFunctionDeclarationAsStatement = true;
</span><span class="cx">             result = parseExpressionOrLabelStatement(context, allowFunctionDeclarationAsStatement);
</span><span class="cx">         }
</span><del>-
</del><ins>+        shouldSetPauseLocation = !context.shouldSkipPauseLocation(result);
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx">     case CLASSTOKEN:
</span><span class="lines">@@ -648,6 +652,7 @@
</span><span class="cx">         // ``` function foo() { label: function bar() { } } ```
</span><span class="cx">         bool allowFunctionDeclarationAsStatement = true;
</span><span class="cx">         result = parseExpressionOrLabelStatement(context, allowFunctionDeclarationAsStatement);
</span><ins>+        shouldSetPauseLocation = !context.shouldSkipPauseLocation(result);
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx">     default:
</span><span class="lines">@@ -657,8 +662,12 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (result &amp;&amp; shouldSetEndOffset)
-        context.setEndOffset(result, m_lastTokenEndPosition.offset);
</del><ins>+    if (result) {
+        if (shouldSetEndOffset)
+            context.setEndOffset(result, m_lastTokenEndPosition.offset);
+        if (shouldSetPauseLocation)
+            recordPauseLocation(context.breakpointLocation(result));
+    }
</ins><span class="cx"> 
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="lines">@@ -700,6 +709,7 @@
</span><span class="cx">     semanticFailIfTrue(match(CLOSEPAREN), &quot;Must provide an expression as a do-while loop condition&quot;);
</span><span class="cx">     TreeExpression expr = parseExpression(context);
</span><span class="cx">     failIfFalse(expr, &quot;Unable to parse do-while loop condition&quot;);
</span><ins>+    recordPauseLocation(context.breakpointLocation(expr));
</ins><span class="cx">     handleProductionOrFail(CLOSEPAREN, &quot;)&quot;, &quot;end&quot;, &quot;do-while loop condition&quot;);
</span><span class="cx">     if (match(SEMICOLON))
</span><span class="cx">         next(); // Always performs automatic semicolon insertion.
</span><span class="lines">@@ -718,9 +728,10 @@
</span><span class="cx">     semanticFailIfTrue(match(CLOSEPAREN), &quot;Must provide an expression as a while loop condition&quot;);
</span><span class="cx">     TreeExpression expr = parseExpression(context);
</span><span class="cx">     failIfFalse(expr, &quot;Unable to parse while loop condition&quot;);
</span><ins>+    recordPauseLocation(context.breakpointLocation(expr));
</ins><span class="cx">     int endLine = tokenLine();
</span><span class="cx">     handleProductionOrFail(CLOSEPAREN, &quot;)&quot;, &quot;end&quot;, &quot;while loop condition&quot;);
</span><del>-    
</del><ins>+
</ins><span class="cx">     const Identifier* unused = 0;
</span><span class="cx">     startLoop();
</span><span class="cx">     TreeStatement statement = parseStatement(context, unused);
</span><span class="lines">@@ -922,6 +933,7 @@
</span><span class="cx">     TreeSourceElements sourceElements = context.createSourceElements();
</span><span class="cx">     TreeStatement body = context.createReturnStatement(location, expr, start, end);
</span><span class="cx">     context.setEndOffset(body, m_lastTokenEndPosition.offset);
</span><ins>+    recordPauseLocation(context.breakpointLocation(body));
</ins><span class="cx">     context.appendStatement(sourceElements, body);
</span><span class="cx"> 
</span><span class="cx">     return sourceElements;
</span><span class="lines">@@ -1249,6 +1261,7 @@
</span><span class="cx">         }
</span><span class="cx">         TreeExpression expr = parseExpression(context);
</span><span class="cx">         failIfFalse(expr, &quot;Expected expression to enumerate&quot;);
</span><ins>+        recordPauseLocation(context.breakpointLocation(expr));
</ins><span class="cx">         JSTextPosition exprEnd = lastTokenEndPosition();
</span><span class="cx">         
</span><span class="cx">         int endLine = tokenLine();
</span><span class="lines">@@ -1291,11 +1304,14 @@
</span><span class="cx">         declsEnd = lastTokenEndPosition();
</span><span class="cx">         m_allowsIn = true;
</span><span class="cx">         failIfFalse(decls, &quot;Cannot parse for loop declarations&quot;);
</span><ins>+        recordPauseLocation(context.breakpointLocation(decls));
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     if (match(SEMICOLON)) {
</span><span class="cx">     standardForLoop:
</span><span class="cx">         // Standard for loop
</span><ins>+        if (decls)
+            recordPauseLocation(context.breakpointLocation(decls));
</ins><span class="cx">         next();
</span><span class="cx">         TreeExpression condition = 0;
</span><span class="cx">         failIfTrue(forLoopConstDoesNotHaveInitializer &amp;&amp; isConstDeclaration, &quot;const variables in for loops must have initializers&quot;);
</span><span class="lines">@@ -1303,6 +1319,7 @@
</span><span class="cx">         if (!match(SEMICOLON)) {
</span><span class="cx">             condition = parseExpression(context);
</span><span class="cx">             failIfFalse(condition, &quot;Cannot parse for loop condition expression&quot;);
</span><ins>+            recordPauseLocation(context.breakpointLocation(condition));
</ins><span class="cx">         }
</span><span class="cx">         consumeOrFail(SEMICOLON, &quot;Expected a ';' after the for loop condition expression&quot;);
</span><span class="cx">         
</span><span class="lines">@@ -1310,6 +1327,7 @@
</span><span class="cx">         if (!match(CLOSEPAREN)) {
</span><span class="cx">             increment = parseExpression(context);
</span><span class="cx">             failIfFalse(increment, &quot;Cannot parse for loop iteration expression&quot;);
</span><ins>+            recordPauseLocation(context.breakpointLocation(increment));
</ins><span class="cx">         }
</span><span class="cx">         int endLine = tokenLine();
</span><span class="cx">         handleProductionOrFail(CLOSEPAREN, &quot;)&quot;, &quot;end&quot;, &quot;for-loop header&quot;);
</span><span class="lines">@@ -1335,6 +1353,7 @@
</span><span class="cx">     }
</span><span class="cx">     TreeExpression expr = parseExpression(context);
</span><span class="cx">     failIfFalse(expr, &quot;Cannot parse subject for-&quot;, isOfEnumeration ? &quot;of&quot; : &quot;in&quot;, &quot; statement&quot;);
</span><ins>+    recordPauseLocation(context.breakpointLocation(expr));
</ins><span class="cx">     JSTextPosition exprEnd = lastTokenEndPosition();
</span><span class="cx">     int endLine = tokenLine();
</span><span class="cx">     
</span><span class="lines">@@ -1469,6 +1488,7 @@
</span><span class="cx">     int start = tokenStart();
</span><span class="cx">     TreeExpression expr = parseExpression(context);
</span><span class="cx">     failIfFalse(expr, &quot;Cannot parse 'with' subject expression&quot;);
</span><ins>+    recordPauseLocation(context.breakpointLocation(expr));
</ins><span class="cx">     JSTextPosition end = lastTokenEndPosition();
</span><span class="cx">     int endLine = tokenLine();
</span><span class="cx">     handleProductionOrFail(CLOSEPAREN, &quot;)&quot;, &quot;start&quot;, &quot;subject of a 'with' statement&quot;);
</span><span class="lines">@@ -1489,6 +1509,7 @@
</span><span class="cx">     handleProductionOrFail(OPENPAREN, &quot;(&quot;, &quot;start&quot;, &quot;subject of a 'switch'&quot;);
</span><span class="cx">     TreeExpression expr = parseExpression(context);
</span><span class="cx">     failIfFalse(expr, &quot;Cannot parse switch subject expression&quot;);
</span><ins>+    recordPauseLocation(context.breakpointLocation(expr));
</ins><span class="cx">     int endLine = tokenLine();
</span><span class="cx">     
</span><span class="cx">     handleProductionOrFail(CLOSEPAREN, &quot;)&quot;, &quot;end&quot;, &quot;subject of a 'switch'&quot;);
</span><span class="lines">@@ -1681,6 +1702,7 @@
</span><span class="cx">     failIfStackOverflow();
</span><span class="cx">     TreeStatement result = 0;
</span><span class="cx">     bool shouldSetEndOffset = true;
</span><ins>+    bool shouldSetPauseLocation = false;
</ins><span class="cx">     bool parentAllowsFunctionDeclarationAsStatement = m_immediateParentAllowsFunctionDeclarationInStatement;
</span><span class="cx">     m_immediateParentAllowsFunctionDeclarationInStatement = false;
</span><span class="cx"> 
</span><span class="lines">@@ -1691,6 +1713,7 @@
</span><span class="cx">         break;
</span><span class="cx">     case VAR:
</span><span class="cx">         result = parseVariableDeclaration(context, DeclarationType::VarDeclaration);
</span><ins>+        shouldSetPauseLocation = true;
</ins><span class="cx">         break;
</span><span class="cx">     case FUNCTION: {
</span><span class="cx">         const bool isAsync = false;
</span><span class="lines">@@ -1701,6 +1724,7 @@
</span><span class="cx">         JSTokenLocation location(tokenLocation());
</span><span class="cx">         next();
</span><span class="cx">         result = context.createEmptyStatement(location);
</span><ins>+        shouldSetPauseLocation = true;
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx">     case IF:
</span><span class="lines">@@ -1717,12 +1741,15 @@
</span><span class="cx">         break;
</span><span class="cx">     case CONTINUE:
</span><span class="cx">         result = parseContinueStatement(context);
</span><ins>+        shouldSetPauseLocation = true;
</ins><span class="cx">         break;
</span><span class="cx">     case BREAK:
</span><span class="cx">         result = parseBreakStatement(context);
</span><ins>+        shouldSetPauseLocation = true;
</ins><span class="cx">         break;
</span><span class="cx">     case RETURN:
</span><span class="cx">         result = parseReturnStatement(context);
</span><ins>+        shouldSetPauseLocation = true;
</ins><span class="cx">         break;
</span><span class="cx">     case WITH:
</span><span class="cx">         result = parseWithStatement(context);
</span><span class="lines">@@ -1732,6 +1759,7 @@
</span><span class="cx">         break;
</span><span class="cx">     case THROW:
</span><span class="cx">         result = parseThrowStatement(context);
</span><ins>+        shouldSetPauseLocation = true;
</ins><span class="cx">         break;
</span><span class="cx">     case TRY:
</span><span class="cx">         result = parseTryStatement(context);
</span><span class="lines">@@ -1738,6 +1766,7 @@
</span><span class="cx">         break;
</span><span class="cx">     case DEBUGGER:
</span><span class="cx">         result = parseDebuggerStatement(context);
</span><ins>+        shouldSetPauseLocation = true;
</ins><span class="cx">         break;
</span><span class="cx">     case EOFTOK:
</span><span class="cx">     case CASE:
</span><span class="lines">@@ -1755,6 +1784,7 @@
</span><span class="cx">     case YIELD: {
</span><span class="cx">         bool allowFunctionDeclarationAsStatement = false;
</span><span class="cx">         result = parseExpressionOrLabelStatement(context, allowFunctionDeclarationAsStatement);
</span><ins>+        shouldSetPauseLocation = !context.shouldSkipPauseLocation(result);
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx">     case STRING:
</span><span class="lines">@@ -1768,11 +1798,17 @@
</span><span class="cx">         if (directive &amp;&amp; nonTrivialExpressionCount != m_parserState.nonTrivialExpressionCount)
</span><span class="cx">             directive = nullptr;
</span><span class="cx">         result = exprStatement;
</span><ins>+        shouldSetPauseLocation = true;
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (result &amp;&amp; shouldSetEndOffset)
-        context.setEndOffset(result, m_lastTokenEndPosition.offset);
</del><ins>+    if (result) {
+        if (shouldSetEndOffset)
+            context.setEndOffset(result, m_lastTokenEndPosition.offset);
+        if (shouldSetPauseLocation)
+            recordPauseLocation(context.breakpointLocation(result));
+    }
+
</ins><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1908,10 +1944,17 @@
</span><span class="cx"> 
</span><span class="cx">     DepthManager statementDepth(&amp;m_statementDepth);
</span><span class="cx">     m_statementDepth = 0;
</span><del>-    if (bodyType == ArrowFunctionBodyExpression)
-        failIfFalse(parseArrowFunctionSingleExpressionBodySourceElements(syntaxChecker), &quot;Cannot parse body of this arrow function&quot;);
-    else
-        failIfFalse(parseSourceElements(syntaxChecker, CheckForStrictMode), bodyType == StandardFunctionBodyBlock ? &quot;Cannot parse body of this function&quot; : &quot;Cannot parse body of this arrow function&quot;);
</del><ins>+    if (bodyType == ArrowFunctionBodyExpression) {
+        if (m_debuggerParseData)
+            failIfFalse(parseArrowFunctionSingleExpressionBodySourceElements(context), &quot;Cannot parse body of this arrow function&quot;);
+        else
+            failIfFalse(parseArrowFunctionSingleExpressionBodySourceElements(syntaxChecker), &quot;Cannot parse body of this arrow function&quot;);
+    } else {
+        if (m_debuggerParseData)
+            failIfFalse(parseSourceElements(context, CheckForStrictMode), bodyType == StandardFunctionBodyBlock ? &quot;Cannot parse body of this function&quot; : &quot;Cannot parse body of this arrow function&quot;);
+        else
+            failIfFalse(parseSourceElements(syntaxChecker, CheckForStrictMode), bodyType == StandardFunctionBodyBlock ? &quot;Cannot parse body of this function&quot; : &quot;Cannot parse body of this arrow function&quot;);
+    }
</ins><span class="cx">     unsigned endColumn = tokenColumn();
</span><span class="cx">     return context.createFunctionMetadata(startLocation, tokenLocation(), startColumn, endColumn, functionKeywordStart, functionNameStart, parametersStart, strictMode(), constructorKind, superBinding, parameterCount, functionLength, parseMode, isArrowFunctionBodyExpression);
</span><span class="cx"> }
</span><span class="lines">@@ -2082,6 +2125,9 @@
</span><span class="cx">         if (UNLIKELY(!Options::useSourceProviderCache()))
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><ins>+        if (UNLIKELY(m_debuggerParseData))
+            return false;
+
</ins><span class="cx">         ASSERT(parametersStart != -1);
</span><span class="cx">         ASSERT(startColumn != -1);
</span><span class="cx"> 
</span><span class="lines">@@ -2328,8 +2374,11 @@
</span><span class="cx">     if (functionBodyType == ArrowFunctionBodyExpression) {
</span><span class="cx">         location = locationBeforeLastToken();
</span><span class="cx">         functionInfo.endOffset = location.endOffset;
</span><ins>+    } else {
+        recordFunctionEntryLocation(JSTextPosition(startLocation.line, startLocation.startOffset, startLocation.lineStartOffset));
+        recordFunctionLeaveLocation(JSTextPosition(location.line, location.startOffset, location.lineStartOffset));
</ins><span class="cx">     }
</span><del>-    
</del><ins>+
</ins><span class="cx">     // Cache the tokenizer state and the function scope the first time the function is parsed.
</span><span class="cx">     // Any future reparsing can then skip the function.
</span><span class="cx">     // For arrow function is 8 = x=&gt;x + 4 symbols;
</span><span class="lines">@@ -2833,6 +2882,7 @@
</span><span class="cx"> 
</span><span class="cx">     TreeExpression condition = parseExpression(context);
</span><span class="cx">     failIfFalse(condition, &quot;Expected a expression as the condition for an if statement&quot;);
</span><ins>+    recordPauseLocation(context.breakpointLocation(condition));
</ins><span class="cx">     int end = tokenLine();
</span><span class="cx">     handleProductionOrFail2(CLOSEPAREN, &quot;)&quot;, &quot;end&quot;, &quot;'if' condition&quot;);
</span><span class="cx"> 
</span><span class="lines">@@ -2868,6 +2918,7 @@
</span><span class="cx"> 
</span><span class="cx">         TreeExpression innerCondition = parseExpression(context);
</span><span class="cx">         failIfFalse(innerCondition, &quot;Expected a expression as the condition for an if statement&quot;);
</span><ins>+        recordPauseLocation(context.breakpointLocation(innerCondition));
</ins><span class="cx">         int innerEnd = tokenLine();
</span><span class="cx">         handleProductionOrFail2(CLOSEPAREN, &quot;)&quot;, &quot;end&quot;, &quot;'if' condition&quot;);
</span><span class="cx">         const Identifier* unused = 0;
</span><span class="lines">@@ -3853,6 +3904,36 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename LexerType&gt;
</span><ins>+void Parser&lt;LexerType&gt;::recordPauseLocation(const JSTextPosition&amp; position)
+{
+    if (LIKELY(!m_debuggerParseData))
+        return;
+
+    if (position.line &lt; 0)
+        return;
+
+    m_debuggerParseData-&gt;pausePositions.appendPause(position);
+}
+
+template &lt;typename LexerType&gt;
+void Parser&lt;LexerType&gt;::recordFunctionEntryLocation(const JSTextPosition&amp; position)
+{
+    if (LIKELY(!m_debuggerParseData))
+        return;
+
+    m_debuggerParseData-&gt;pausePositions.appendEntry(position);
+}
+
+template &lt;typename LexerType&gt;
+void Parser&lt;LexerType&gt;::recordFunctionLeaveLocation(const JSTextPosition&amp; position)
+{
+    if (LIKELY(!m_debuggerParseData))
+        return;
+
+    m_debuggerParseData-&gt;pausePositions.appendLeave(position);
+}
+
+template &lt;typename LexerType&gt;
</ins><span class="cx"> template &lt;class TreeBuilder&gt; TreeExpression Parser&lt;LexerType&gt;::parseObjectLiteral(TreeBuilder&amp; context)
</span><span class="cx"> {
</span><span class="cx">     SavePoint savePoint = createSavePoint();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/Parser.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/Parser.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/parser/Parser.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -47,6 +47,7 @@
</span><span class="cx"> class VM;
</span><span class="cx"> class SourceCode;
</span><span class="cx"> class SyntaxChecker;
</span><ins>+struct DebuggerParseData;
</ins><span class="cx"> 
</span><span class="cx"> // Macros to make the more common TreeBuilder types a little less verbose
</span><span class="cx"> #define TreeStatement typename TreeBuilder::Statement
</span><span class="lines">@@ -847,7 +848,7 @@
</span><span class="cx">     WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> 
</span><span class="cx"> public:
</span><del>-    Parser(VM*, const SourceCode&amp;, JSParserBuiltinMode, JSParserStrictMode, JSParserScriptMode, SourceParseMode, SuperBinding, ConstructorKind defaultConstructorKind = ConstructorKind::None, DerivedContextType = DerivedContextType::None, bool isEvalContext = false, EvalContextType = EvalContextType::None);
</del><ins>+    Parser(VM*, const SourceCode&amp;, JSParserBuiltinMode, JSParserStrictMode, JSParserScriptMode, SourceParseMode, SuperBinding, ConstructorKind defaultConstructorKind = ConstructorKind::None, DerivedContextType = DerivedContextType::None, bool isEvalContext = false, EvalContextType = EvalContextType::None, DebuggerParseData* = nullptr);
</ins><span class="cx">     ~Parser();
</span><span class="cx"> 
</span><span class="cx">     template &lt;class ParsedNode&gt;
</span><span class="lines">@@ -1370,7 +1371,11 @@
</span><span class="cx">         m_errorMessage = String(msg);
</span><span class="cx">         ASSERT(!m_errorMessage.isNull());
</span><span class="cx">     }
</span><del>-    
</del><ins>+
+    ALWAYS_INLINE void recordPauseLocation(const JSTextPosition&amp;);
+    ALWAYS_INLINE void recordFunctionEntryLocation(const JSTextPosition&amp;);
+    ALWAYS_INLINE void recordFunctionLeaveLocation(const JSTextPosition&amp;);
+
</ins><span class="cx">     void startLoop() { currentScope()-&gt;startLoop(); }
</span><span class="cx">     void endLoop() { currentScope()-&gt;endLoop(); }
</span><span class="cx">     void startSwitch() { currentScope()-&gt;startSwitch(); }
</span><span class="lines">@@ -1706,7 +1711,8 @@
</span><span class="cx">     bool m_isEvalContext;
</span><span class="cx">     bool m_immediateParentAllowsFunctionDeclarationInStatement;
</span><span class="cx">     RefPtr&lt;ModuleScopeData&gt; m_moduleScopeData;
</span><del>-    
</del><ins>+    DebuggerParseData* m_debuggerParseData;
+
</ins><span class="cx">     struct DepthManager {
</span><span class="cx">         DepthManager(int* depth)
</span><span class="cx">         : m_originalDepth(*depth)
</span><span class="lines">@@ -1826,11 +1832,14 @@
</span><span class="cx">     const Identifier&amp; name, JSParserBuiltinMode builtinMode,
</span><span class="cx">     JSParserStrictMode strictMode, JSParserScriptMode scriptMode, SourceParseMode parseMode, SuperBinding superBinding,
</span><span class="cx">     ParserError&amp; error, JSTextPosition* positionBeforeLastNewline = nullptr,
</span><del>-    ConstructorKind defaultConstructorKind = ConstructorKind::None, DerivedContextType derivedContextType = DerivedContextType::None, EvalContextType evalContextType = EvalContextType::None)
</del><ins>+    ConstructorKind defaultConstructorKind = ConstructorKind::None,
+    DerivedContextType derivedContextType = DerivedContextType::None,
+    EvalContextType evalContextType = EvalContextType::None,
+    DebuggerParseData* debuggerParseData = nullptr)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!source.provider()-&gt;source().isNull());
</span><span class="cx">     if (source.provider()-&gt;source().is8Bit()) {
</span><del>-        Parser&lt;Lexer&lt;LChar&gt;&gt; parser(vm, source, builtinMode, strictMode, scriptMode, parseMode, superBinding, defaultConstructorKind, derivedContextType, isEvalNode&lt;ParsedNode&gt;(), evalContextType);
</del><ins>+        Parser&lt;Lexer&lt;LChar&gt;&gt; parser(vm, source, builtinMode, strictMode, scriptMode, parseMode, superBinding, defaultConstructorKind, derivedContextType, isEvalNode&lt;ParsedNode&gt;(), evalContextType, debuggerParseData);
</ins><span class="cx">         std::unique_ptr&lt;ParsedNode&gt; result = parser.parse&lt;ParsedNode&gt;(error, name, parseMode);
</span><span class="cx">         if (positionBeforeLastNewline)
</span><span class="cx">             *positionBeforeLastNewline = parser.positionBeforeLastNewline();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSourceCodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SourceCode.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SourceCode.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/parser/SourceCode.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -118,9 +118,9 @@
</span><span class="cx">         int m_startColumn;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    inline SourceCode makeSource(const String&amp; source, const String&amp; url = String(), const TextPosition&amp; startPosition = TextPosition::minimumPosition())
</del><ins>+    inline SourceCode makeSource(const String&amp; source, const String&amp; url = String(), const TextPosition&amp; startPosition = TextPosition::minimumPosition(), SourceProviderSourceType sourceType = SourceProviderSourceType::Program)
</ins><span class="cx">     {
</span><del>-        return SourceCode(StringSourceProvider::create(source, url, startPosition), startPosition.m_line.oneBasedInt(), startPosition.m_column.oneBasedInt());
</del><ins>+        return SourceCode(StringSourceProvider::create(source, url, startPosition, sourceType), startPosition.m_line.oneBasedInt(), startPosition.m_column.oneBasedInt());
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     inline SourceCode SourceCode::subExpression(unsigned openBrace, unsigned closeBrace, int firstLine, int startColumn)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSourceProvidercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SourceProvider.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SourceProvider.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/parser/SourceProvider.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -31,9 +31,10 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-SourceProvider::SourceProvider(const String&amp; url, const TextPosition&amp; startPosition)
</del><ins>+SourceProvider::SourceProvider(const String&amp; url, const TextPosition&amp; startPosition, SourceProviderSourceType sourceType)
</ins><span class="cx">     : m_url(url)
</span><span class="cx">     , m_startPosition(startPosition)
</span><ins>+    , m_sourceType(sourceType)
</ins><span class="cx">     , m_validated(false)
</span><span class="cx">     , m_id(0)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSourceProviderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SourceProvider.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SourceProvider.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/parser/SourceProvider.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -34,11 +34,17 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+    enum class SourceProviderSourceType {
+        Program,
+        Module,
+        WebAssembly,
+    };
+
</ins><span class="cx">     class SourceProvider : public RefCounted&lt;SourceProvider&gt; {
</span><span class="cx">     public:
</span><span class="cx">         static const intptr_t nullID = 1;
</span><span class="cx">         
</span><del>-        JS_EXPORT_PRIVATE SourceProvider(const String&amp; url, const TextPosition&amp; startPosition);
</del><ins>+        JS_EXPORT_PRIVATE SourceProvider(const String&amp; url, const TextPosition&amp; startPosition, SourceProviderSourceType);
</ins><span class="cx"> 
</span><span class="cx">         JS_EXPORT_PRIVATE virtual ~SourceProvider();
</span><span class="cx"> 
</span><span class="lines">@@ -54,6 +60,8 @@
</span><span class="cx">         const String&amp; sourceMappingURL() const { return m_sourceMappingURLDirective; }
</span><span class="cx"> 
</span><span class="cx">         TextPosition startPosition() const { return m_startPosition; }
</span><ins>+        SourceProviderSourceType sourceType() const { return m_sourceType; }
+
</ins><span class="cx">         intptr_t asID()
</span><span class="cx">         {
</span><span class="cx">             if (!m_id)
</span><span class="lines">@@ -74,6 +82,7 @@
</span><span class="cx">         String m_sourceURLDirective;
</span><span class="cx">         String m_sourceMappingURLDirective;
</span><span class="cx">         TextPosition m_startPosition;
</span><ins>+        SourceProviderSourceType m_sourceType;
</ins><span class="cx">         bool m_validated : 1;
</span><span class="cx">         uintptr_t m_id : sizeof(uintptr_t) * 8 - 1;
</span><span class="cx">     };
</span><span class="lines">@@ -80,9 +89,9 @@
</span><span class="cx"> 
</span><span class="cx">     class StringSourceProvider : public SourceProvider {
</span><span class="cx">     public:
</span><del>-        static Ref&lt;StringSourceProvider&gt; create(const String&amp; source, const String&amp; url, const TextPosition&amp; startPosition = TextPosition::minimumPosition())
</del><ins>+        static Ref&lt;StringSourceProvider&gt; create(const String&amp; source, const String&amp; url, const TextPosition&amp; startPosition = TextPosition::minimumPosition(), SourceProviderSourceType sourceType = SourceProviderSourceType::Program)
</ins><span class="cx">         {
</span><del>-            return adoptRef(*new StringSourceProvider(source, url, startPosition));
</del><ins>+            return adoptRef(*new StringSourceProvider(source, url, startPosition, sourceType));
</ins><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         unsigned hash() const override
</span><span class="lines">@@ -96,8 +105,8 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">     private:
</span><del>-        StringSourceProvider(const String&amp; source, const String&amp; url, const TextPosition&amp; startPosition)
-            : SourceProvider(url, startPosition)
</del><ins>+        StringSourceProvider(const String&amp; source, const String&amp; url, const TextPosition&amp; startPosition, SourceProviderSourceType sourceType)
+            : SourceProvider(url, startPosition, sourceType)
</ins><span class="cx">             , m_source(source.isNull() ? *StringImpl::empty() : *source.impl())
</span><span class="cx">         {
</span><span class="cx">         }
</span><span class="lines">@@ -130,7 +139,7 @@
</span><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         WebAssemblySourceProvider(const Vector&lt;uint8_t&gt;&amp; data, const String&amp; url)
</span><del>-            : SourceProvider(url, TextPosition::minimumPosition())
</del><ins>+            : SourceProvider(url, TextPosition::minimumPosition(), SourceProviderSourceType::WebAssembly)
</ins><span class="cx">             , m_source(&quot;[WebAssembly source]&quot;)
</span><span class="cx">             , m_data(data)
</span><span class="cx">         {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreparserSyntaxCheckerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/parser/SyntaxChecker.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/parser/SyntaxChecker.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -389,10 +389,14 @@
</span><span class="cx">         return isObjectLiteral(type) || isArrayLiteral(type);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool shouldSkipPauseLocation(int) const { return true; }
+
</ins><span class="cx">     void setEndOffset(int, int) { }
</span><span class="cx">     int endOffset(int) { return 0; }
</span><span class="cx">     void setStartOffset(int, int) { }
</span><span class="cx"> 
</span><ins>+    JSTextPosition breakpointLocation(int) { return JSTextPosition(-1, 0, 0); }
+
</ins><span class="cx">     void propagateArgumentsUse() { }
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeExecutablecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/Executable.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Executable.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/runtime/Executable.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -454,6 +454,7 @@
</span><span class="cx"> EvalExecutable::EvalExecutable(ExecState* exec, const SourceCode&amp; source, bool inStrictContext, DerivedContextType derivedContextType, bool isArrowFunctionContext, EvalContextType evalContextType)
</span><span class="cx">     : ScriptExecutable(exec-&gt;vm().evalExecutableStructure.get(), exec-&gt;vm(), source, inStrictContext, derivedContextType, isArrowFunctionContext, evalContextType, NoIntrinsic)
</span><span class="cx"> {
</span><ins>+    ASSERT(source.provider()-&gt;sourceType() == SourceProviderSourceType::Program);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void EvalExecutable::destroy(JSCell* cell)
</span><span class="lines">@@ -466,6 +467,7 @@
</span><span class="cx"> ProgramExecutable::ProgramExecutable(ExecState* exec, const SourceCode&amp; source)
</span><span class="cx">     : ScriptExecutable(exec-&gt;vm().programExecutableStructure.get(), exec-&gt;vm(), source, false, DerivedContextType::None, false, EvalContextType::None, NoIntrinsic)
</span><span class="cx"> {
</span><ins>+    ASSERT(source.provider()-&gt;sourceType() == SourceProviderSourceType::Program);
</ins><span class="cx">     m_typeProfilingStartOffset = 0;
</span><span class="cx">     m_typeProfilingEndOffset = source.length() - 1;
</span><span class="cx">     if (exec-&gt;vm().typeProfiler() || exec-&gt;vm().controlFlowProfiler())
</span><span class="lines">@@ -482,6 +484,7 @@
</span><span class="cx"> ModuleProgramExecutable::ModuleProgramExecutable(ExecState* exec, const SourceCode&amp; source)
</span><span class="cx">     : ScriptExecutable(exec-&gt;vm().moduleProgramExecutableStructure.get(), exec-&gt;vm(), source, false, DerivedContextType::None, false, EvalContextType::None, NoIntrinsic)
</span><span class="cx"> {
</span><ins>+    ASSERT(source.provider()-&gt;sourceType() == SourceProviderSourceType::Module);
</ins><span class="cx">     m_typeProfilingStartOffset = 0;
</span><span class="cx">     m_typeProfilingEndOffset = source.length() - 1;
</span><span class="cx">     if (exec-&gt;vm().typeProfiler() || exec-&gt;vm().controlFlowProfiler())
</span><span class="lines">@@ -751,6 +754,7 @@
</span><span class="cx">     , m_module(vm, this, module)
</span><span class="cx">     , m_functionIndex(functionIndex)
</span><span class="cx"> {
</span><ins>+    ASSERT(source.provider()-&gt;sourceType() == SourceProviderSourceType::WebAssembly);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebAssemblyExecutable::destroy(JSCell* cell)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeModuleLoaderPrototypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/ModuleLoaderPrototype.cpp (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/ModuleLoaderPrototype.cpp        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/JavaScriptCore/runtime/ModuleLoaderPrototype.cpp        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -117,7 +117,7 @@
</span><span class="cx">     String source = exec-&gt;argument(1).toString(exec)-&gt;value(exec);
</span><span class="cx">     RETURN_IF_EXCEPTION(scope, encodedJSValue());
</span><span class="cx"> 
</span><del>-    SourceCode sourceCode = makeSource(source, moduleKey.impl());
</del><ins>+    SourceCode sourceCode = makeSource(source, moduleKey.impl(), TextPosition::minimumPosition(), SourceProviderSourceType::Module);
</ins><span class="cx"> 
</span><span class="cx">     CodeProfiling profile(sourceCode);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/WebCore/ChangeLog        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -1,5 +1,19 @@
</span><span class="cx"> 2016-09-30  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Breakpoints on blank lines or comments don't break
+        https://bugs.webkit.org/show_bug.cgi?id=9885
+        &lt;rdar://problem/6134406&gt;
+
+        Reviewed by Mark Lam.
+
+        Tests: inspector/debugger/breakpoints/resolved-dump-all-pause-locations.html
+               inspector/debugger/breakpoints/resolved-dump-each-line.html
+
+        * bindings/js/CachedScriptSourceProvider.h:
+        (WebCore::CachedScriptSourceProvider::CachedScriptSourceProvider):
+
+2016-09-30  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
</ins><span class="cx">         Web Inspector: Stepping out of a function finishes the line that called it.
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=155325
</span><span class="cx">         &lt;rdar://problem/25094578&gt;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsCachedScriptSourceProviderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/CachedScriptSourceProvider.h (206652 => 206653)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/CachedScriptSourceProvider.h        2016-09-30 19:22:37 UTC (rev 206652)
+++ trunk/Source/WebCore/bindings/js/CachedScriptSourceProvider.h        2016-09-30 19:22:50 UTC (rev 206653)
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     CachedScriptSourceProvider(CachedScript* cachedScript)
</span><del>-        : SourceProvider(cachedScript-&gt;response().url(), TextPosition::minimumPosition())
</del><ins>+        : SourceProvider(cachedScript-&gt;response().url(), TextPosition::minimumPosition(), JSC::SourceProviderSourceType::Program)
</ins><span class="cx">         , m_cachedScript(cachedScript)
</span><span class="cx">     {
</span><span class="cx">         m_cachedScript-&gt;addClient(this);
</span></span></pre>
</div>
</div>

</body>
</html>