<!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>[180875] trunk/Source/JavaScriptCore</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/180875">180875</a></dd>
<dt>Author</dt> <dd>fpizlo@apple.com</dd>
<dt>Date</dt> <dd>2015-03-01 18:08:26 -0800 (Sun, 01 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>BytecodeGenerator shouldn't emit op_resolve_scope as a roundabout way of returning the scopeRegister
https://bugs.webkit.org/show_bug.cgi?id=142153

Reviewed by Michael Saboff.
        
We don't need a op_resolve_scope if we know that it will simply return the scope register.
This changes the BytecodeGenerator to use the scope register directly in those cases where
we know statically that we would just have returned that from op_resolve_scope.
        
This doesn't appear to have a significant impact on performance.

* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::CodeBlock):
* bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::emitResolveScope):
(JSC::BytecodeGenerator::emitReturn):
(JSC::BytecodeGenerator::emitGetOwnScope): Deleted.
* bytecompiler/BytecodeGenerator.h:
* bytecompiler/NodesCodegen.cpp:
(JSC::ResolveNode::emitBytecode):
(JSC::EvalFunctionCallNode::emitBytecode):
(JSC::FunctionCallResolveNode::emitBytecode):
(JSC::PostfixNode::emitResolve):
(JSC::DeleteResolveNode::emitBytecode):
(JSC::TypeOfResolveNode::emitBytecode):
(JSC::PrefixNode::emitResolve):
(JSC::ReadModifyResolveNode::emitBytecode):
(JSC::AssignResolveNode::emitBytecode):
(JSC::ConstDeclNode::emitCodeSingle):
(JSC::EmptyVarExpression::emitBytecode):
(JSC::ForInNode::emitLoopHeader):
(JSC::ForOfNode::emitBytecode):
(JSC::BindingNode::bindValue):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCodeBlockcpp">trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp</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>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (180874 => 180875)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-03-02 01:53:46 UTC (rev 180874)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-03-02 02:08:26 UTC (rev 180875)
</span><span class="lines">@@ -1,3 +1,39 @@
</span><ins>+2015-03-01  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        BytecodeGenerator shouldn't emit op_resolve_scope as a roundabout way of returning the scopeRegister
+        https://bugs.webkit.org/show_bug.cgi?id=142153
+
+        Reviewed by Michael Saboff.
+        
+        We don't need a op_resolve_scope if we know that it will simply return the scope register.
+        This changes the BytecodeGenerator to use the scope register directly in those cases where
+        we know statically that we would just have returned that from op_resolve_scope.
+        
+        This doesn't appear to have a significant impact on performance.
+
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::CodeBlock):
+        * bytecompiler/BytecodeGenerator.cpp:
+        (JSC::BytecodeGenerator::emitResolveScope):
+        (JSC::BytecodeGenerator::emitReturn):
+        (JSC::BytecodeGenerator::emitGetOwnScope): Deleted.
+        * bytecompiler/BytecodeGenerator.h:
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::ResolveNode::emitBytecode):
+        (JSC::EvalFunctionCallNode::emitBytecode):
+        (JSC::FunctionCallResolveNode::emitBytecode):
+        (JSC::PostfixNode::emitResolve):
+        (JSC::DeleteResolveNode::emitBytecode):
+        (JSC::TypeOfResolveNode::emitBytecode):
+        (JSC::PrefixNode::emitResolve):
+        (JSC::ReadModifyResolveNode::emitBytecode):
+        (JSC::AssignResolveNode::emitBytecode):
+        (JSC::ConstDeclNode::emitCodeSingle):
+        (JSC::EmptyVarExpression::emitBytecode):
+        (JSC::ForInNode::emitLoopHeader):
+        (JSC::ForOfNode::emitBytecode):
+        (JSC::BindingNode::bindValue):
+
</ins><span class="cx"> 2015-02-27  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [JSC] Use the way number constants are written to help type speculation
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp (180874 => 180875)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-03-02 01:53:46 UTC (rev 180874)
+++ trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-03-02 02:08:26 UTC (rev 180875)
</span><span class="lines">@@ -1955,10 +1955,7 @@
</span><span class="cx">         case op_resolve_scope: {
</span><span class="cx">             const Identifier&amp; ident = identifier(pc[3].u.operand);
</span><span class="cx">             ResolveType type = static_cast&lt;ResolveType&gt;(pc[4].u.operand);
</span><del>-            if (type == LocalClosureVar) {
-                instructions[i + 4].u.operand = ClosureVar;
-                break;
-            }
</del><ins>+            RELEASE_ASSERT(type != LocalClosureVar);
</ins><span class="cx"> 
</span><span class="cx">             ResolveOp op = JSScope::abstractResolve(m_globalObject-&gt;globalExec(), needsActivation(), scope, ident, Get, type);
</span><span class="cx">             instructions[i + 4].u.operand = op.type;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp (180874 => 180875)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2015-03-02 01:53:46 UTC (rev 180874)
+++ trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp        2015-03-02 02:08:26 UTC (rev 180875)
</span><span class="lines">@@ -1257,27 +1257,21 @@
</span><span class="cx"> 
</span><span class="cx"> RegisterID* BytecodeGenerator::emitResolveScope(RegisterID* dst, const Identifier&amp; identifier, ResolveScopeInfo&amp; info)
</span><span class="cx"> {
</span><del>-    m_codeBlock-&gt;addPropertyAccessInstruction(instructions().size());
-
</del><span class="cx">     if (m_symbolTable &amp;&amp; m_codeType == FunctionCode &amp;&amp; !m_localScopeDepth) {
</span><span class="cx">         SymbolTableEntry entry = m_symbolTable-&gt;get(identifier.impl());
</span><span class="cx">         if (!entry.isNull()) {
</span><del>-            emitOpcode(op_resolve_scope);
-            instructions().append(kill(dst));
-            instructions().append(scopeRegister()-&gt;index());
-            instructions().append(addConstant(identifier));
-            instructions().append(LocalClosureVar);
-            instructions().append(0);
-            instructions().append(0);
</del><span class="cx">             info = ResolveScopeInfo(entry.getIndex());
</span><del>-            return dst;
</del><ins>+            return scopeRegister();
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!m_symbolTable || !m_symbolTable-&gt;contains(identifier.impl()) || resolveType() == Dynamic);
</span><span class="cx"> 
</span><ins>+    m_codeBlock-&gt;addPropertyAccessInstruction(instructions().size());
+
</ins><span class="cx">     // resolve_scope dst, id, ResolveType, depth
</span><span class="cx">     emitOpcode(op_resolve_scope);
</span><ins>+    dst = tempDestination(dst);
</ins><span class="cx">     instructions().append(kill(dst));
</span><span class="cx">     instructions().append(scopeRegister()-&gt;index());
</span><span class="cx">     instructions().append(addConstant(identifier));
</span><span class="lines">@@ -1288,20 +1282,6 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-RegisterID* BytecodeGenerator::emitGetOwnScope(RegisterID* dst, const Identifier&amp; identifier, OwnScopeLookupRules)
-{
-    emitOpcode(op_resolve_scope);
-    instructions().append(kill(dst));
-    instructions().append(scopeRegister()-&gt;index());
-    instructions().append(addConstant(identifier));
-    instructions().append(LocalClosureVar);
-    // This should be m_localScopeDepth if we aren't doing
-    // resolution during emitReturn()
-    instructions().append(0);
-    instructions().append(0);
-    return dst;
-}
-
</del><span class="cx"> RegisterID* BytecodeGenerator::emitResolveConstantLocal(RegisterID* dst, const Identifier&amp; identifier, ResolveScopeInfo&amp; info)
</span><span class="cx"> {
</span><span class="cx">     if (!m_symbolTable || m_codeType != FunctionCode)
</span><span class="lines">@@ -1914,9 +1894,8 @@
</span><span class="cx">         int argumentsIndex = unmodifiedArgumentsRegister(m_codeBlock-&gt;argumentsRegister()).offset();
</span><span class="cx">         if (m_lexicalEnvironmentRegister &amp;&amp; m_codeType == FunctionCode) {
</span><span class="cx">             scratchRegister = newTemporary();
</span><del>-            emitGetOwnScope(scratchRegister.get(), propertyNames().arguments, OwnScopeForReturn);
</del><span class="cx">             ResolveScopeInfo scopeInfo(unmodifiedArgumentsRegister(m_codeBlock-&gt;argumentsRegister()).offset());
</span><del>-            emitGetFromScope(scratchRegister.get(), scratchRegister.get(), propertyNames().arguments, ThrowIfNotFound, scopeInfo);
</del><ins>+            emitGetFromScope(scratchRegister.get(), scopeRegister(), propertyNames().arguments, ThrowIfNotFound, scopeInfo);
</ins><span class="cx">             argumentsIndex = scratchRegister-&gt;index();
</span><span class="cx">         }
</span><span class="cx">         emitOpcode(op_tear_off_arguments);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerBytecodeGeneratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h (180874 => 180875)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h        2015-03-02 01:53:46 UTC (rev 180874)
+++ trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h        2015-03-02 02:08:26 UTC (rev 180875)
</span><span class="lines">@@ -503,6 +503,10 @@
</span><span class="cx"> 
</span><span class="cx">         ResolveType resolveType();
</span><span class="cx">         RegisterID* emitResolveConstantLocal(RegisterID* dst, const Identifier&amp;, ResolveScopeInfo&amp;);
</span><ins>+        // Calls tempDestination(dst), so it's safe to pass nullptr. It's also redundant to call
+        // tempDestination(dst) on the thing you pass as the destination. The reason why this
+        // calls tempDestination() for you is that it may not need a spare register. It may return
+        // scopeRegister() directly. So, you cannot rely on this storing to dst.
</ins><span class="cx">         RegisterID* emitResolveScope(RegisterID* dst, const Identifier&amp;, ResolveScopeInfo&amp;);
</span><span class="cx">         RegisterID* emitGetFromScope(RegisterID* dst, RegisterID* scope, const Identifier&amp;, ResolveMode, const ResolveScopeInfo&amp;);
</span><span class="cx">         RegisterID* emitPutToScope(RegisterID* scope, const Identifier&amp;, RegisterID* value, ResolveMode, const ResolveScopeInfo&amp;);
</span><span class="lines">@@ -663,13 +667,6 @@
</span><span class="cx">         RegisterID* emitCallVarargs(OpcodeID, RegisterID* dst, RegisterID* func, RegisterID* thisRegister, RegisterID* arguments, RegisterID* firstFreeRegister, int32_t firstVarArgOffset, RegisterID* profileHookRegister, const JSTextPosition&amp; divot, const JSTextPosition&amp; divotStart, const JSTextPosition&amp; divotEnd);
</span><span class="cx">         RegisterID* initializeCapturedVariable(RegisterID* dst, const Identifier&amp;, RegisterID*);
</span><span class="cx"> 
</span><del>-        // We'll may want a non-return mode in future, but currently
-        // this is only used during emitReturn(). emitReturn() occurs
-        // with the novel state of having popped off all the local scope
-        // nodes, but not actually modify any internal stack depth tracking.
-        enum OwnScopeLookupRules { OwnScopeForReturn };
-        RegisterID* emitGetOwnScope(RegisterID* dst, const Identifier&amp;, OwnScopeLookupRules);
-
</del><span class="cx">     public:
</span><span class="cx">         JSString* addStringConstant(const Identifier&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecompilerNodesCodegencpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp (180874 => 180875)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2015-03-02 01:53:46 UTC (rev 180874)
+++ trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp        2015-03-02 02:08:26 UTC (rev 180875)
</span><span class="lines">@@ -178,7 +178,7 @@
</span><span class="cx">     JSTextPosition divot = m_start + m_ident.length();
</span><span class="cx">     generator.emitExpressionInfo(divot, m_start, divot);
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo);
</del><ins>+    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(dst, m_ident, resolveScopeInfo);
</ins><span class="cx">     RegisterID* finalDest = generator.finalDestination(dst);
</span><span class="cx">     RegisterID* result = generator.emitGetFromScope(finalDest, scope.get(), m_ident, ThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">     if (generator.vm()-&gt;typeProfiler()) {
</span><span class="lines">@@ -507,7 +507,9 @@
</span><span class="cx">     JSTextPosition newDivot = divotStart() + 4;
</span><span class="cx">     generator.emitExpressionInfo(newDivot, divotStart(), newDivot);
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    generator.emitResolveScope(callArguments.thisRegister(), generator.propertyNames().eval, resolveScopeInfo);
</del><ins>+    generator.moveToDestinationIfNeeded(
+        callArguments.thisRegister(),
+        generator.emitResolveScope(callArguments.thisRegister(), generator.propertyNames().eval, resolveScopeInfo));
</ins><span class="cx">     generator.emitGetFromScope(func.get(), callArguments.thisRegister(), generator.propertyNames().eval, ThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">     return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), callArguments, divot(), divotStart(), divotEnd());
</span><span class="cx"> }
</span><span class="lines">@@ -556,7 +558,9 @@
</span><span class="cx">     JSTextPosition newDivot = divotStart() + m_ident.length();
</span><span class="cx">     generator.emitExpressionInfo(newDivot, divotStart(), newDivot);
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    generator.emitResolveScope(callArguments.thisRegister(), m_ident, resolveScopeInfo);
</del><ins>+    generator.moveToDestinationIfNeeded(
+        callArguments.thisRegister(),
+        generator.emitResolveScope(callArguments.thisRegister(), m_ident, resolveScopeInfo));
</ins><span class="cx">     generator.emitGetFromScope(func.get(), callArguments.thisRegister(), m_ident, ThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">     RegisterID* ret = generator.emitCall(returnValue.get(), func.get(), expectedFunction, callArguments, divot(), divotStart(), divotEnd());
</span><span class="cx">     if (generator.vm()-&gt;typeProfiler()) {
</span><span class="lines">@@ -838,7 +842,7 @@
</span><span class="cx"> 
</span><span class="cx">     generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo);
</del><ins>+    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(nullptr, ident, resolveScopeInfo);
</ins><span class="cx">     RefPtr&lt;RegisterID&gt; value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">     RefPtr&lt;RegisterID&gt; oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
</span><span class="cx">     generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound, resolveScopeInfo);
</span><span class="lines">@@ -924,7 +928,7 @@
</span><span class="cx"> 
</span><span class="cx">     generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    RefPtr&lt;RegisterID&gt; base = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo);
</del><ins>+    RefPtr&lt;RegisterID&gt; base = generator.emitResolveScope(dst, m_ident, resolveScopeInfo);
</ins><span class="cx">     return generator.emitDeleteById(generator.finalDestination(dst, base.get()), base.get(), m_ident);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -982,7 +986,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo);
</del><ins>+    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(dst, m_ident, resolveScopeInfo);
</ins><span class="cx">     RefPtr&lt;RegisterID&gt; value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">     if (dst == generator.ignoredResult())
</span><span class="cx">         return 0;
</span><span class="lines">@@ -1029,7 +1033,7 @@
</span><span class="cx"> 
</span><span class="cx">     generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(generator.tempDestination(dst), ident, resolveScopeInfo);
</del><ins>+    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(dst, ident, resolveScopeInfo);
</ins><span class="cx">     RefPtr&lt;RegisterID&gt; value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">     emitIncOrDec(generator, value.get(), m_operator);
</span><span class="cx">     generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound, resolveScopeInfo);
</span><span class="lines">@@ -1551,7 +1555,7 @@
</span><span class="cx"> 
</span><span class="cx">     generator.emitExpressionInfo(newDivot, divotStart(), newDivot);
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo);
</del><ins>+    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(nullptr, m_ident, resolveScopeInfo);
</ins><span class="cx">     RefPtr&lt;RegisterID&gt; value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, ThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">     RefPtr&lt;RegisterID&gt; result = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right-&gt;resultDescriptor()), this);
</span><span class="cx">     RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), ThrowIfNotFound, resolveScopeInfo);
</span><span class="lines">@@ -1588,7 +1592,7 @@
</span><span class="cx">     if (generator.isStrictMode())
</span><span class="cx">         generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo);
</del><ins>+    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(nullptr, m_ident, resolveScopeInfo);
</ins><span class="cx">     if (dst == generator.ignoredResult())
</span><span class="cx">         dst = 0;
</span><span class="cx">     RefPtr&lt;RegisterID&gt; result = generator.emitNode(dst, m_right);
</span><span class="lines">@@ -1734,7 +1738,7 @@
</span><span class="cx"> 
</span><span class="cx">     // FIXME: This will result in incorrect assignment if m_ident exists in an intervening with scope.
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo);
</del><ins>+    RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(nullptr, m_ident, resolveScopeInfo);
</ins><span class="cx">     return generator.emitPutToScope(scope.get(), m_ident, value.get(), DoNotThrowIfNotFound, resolveScopeInfo);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1831,7 +1835,7 @@
</span><span class="cx">         generator.emitProfileType(local.get(), ProfileTypeBytecodeHasGlobalID, nullptr);
</span><span class="cx">     else {
</span><span class="cx">         ResolveScopeInfo resolveScopeInfo;
</span><del>-        RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo);
</del><ins>+        RefPtr&lt;RegisterID&gt; scope = generator.emitResolveScope(nullptr, m_ident, resolveScopeInfo);
</ins><span class="cx">         RefPtr&lt;RegisterID&gt; value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">         generator.emitProfileType(value.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodeGetFromLocalScope : ProfileTypeBytecodeGetFromScope, &amp;m_ident);
</span><span class="cx">     }
</span><span class="lines">@@ -2035,7 +2039,7 @@
</span><span class="cx">             if (generator.isStrictMode())
</span><span class="cx">                 generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
</span><span class="cx">             ResolveScopeInfo resolveScopeInfo;
</span><del>-            RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo);
</del><ins>+            RegisterID* scope = generator.emitResolveScope(nullptr, ident, resolveScopeInfo);
</ins><span class="cx">             generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
</span><span class="cx">             generator.emitPutToScope(scope, ident, propertyName, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">             if (generator.vm()-&gt;typeProfiler())
</span><span class="lines">@@ -2259,7 +2263,7 @@
</span><span class="cx">                 if (generator.isStrictMode())
</span><span class="cx">                     generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
</span><span class="cx">                 ResolveScopeInfo resolveScopeInfo;
</span><del>-                RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo);
</del><ins>+                RegisterID* scope = generator.emitResolveScope(nullptr, ident, resolveScopeInfo);
</ins><span class="cx">                 generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
</span><span class="cx">                 generator.emitPutToScope(scope, ident, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">                 if (generator.vm()-&gt;typeProfiler())
</span><span class="lines">@@ -2968,7 +2972,7 @@
</span><span class="cx">     if (generator.isStrictMode())
</span><span class="cx">         generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd());
</span><span class="cx">     ResolveScopeInfo resolveScopeInfo;
</span><del>-    RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), m_boundProperty, resolveScopeInfo);
</del><ins>+    RegisterID* scope = generator.emitResolveScope(nullptr, m_boundProperty, resolveScopeInfo);
</ins><span class="cx">     generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd());
</span><span class="cx">     generator.emitPutToScope(scope, m_boundProperty, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo);
</span><span class="cx">     if (generator.vm()-&gt;typeProfiler()) {
</span></span></pre>
</div>
</div>

</body>
</html>