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):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@180875 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
index b42ecb7..dfc3be8 100644
--- a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
+++ b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
@@ -178,7 +178,7 @@
JSTextPosition divot = m_start + m_ident.length();
generator.emitExpressionInfo(divot, m_start, divot);
ResolveScopeInfo resolveScopeInfo;
- RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo);
+ RefPtr<RegisterID> scope = generator.emitResolveScope(dst, m_ident, resolveScopeInfo);
RegisterID* finalDest = generator.finalDestination(dst);
RegisterID* result = generator.emitGetFromScope(finalDest, scope.get(), m_ident, ThrowIfNotFound, resolveScopeInfo);
if (generator.vm()->typeProfiler()) {
@@ -507,7 +507,9 @@
JSTextPosition newDivot = divotStart() + 4;
generator.emitExpressionInfo(newDivot, divotStart(), newDivot);
ResolveScopeInfo resolveScopeInfo;
- generator.emitResolveScope(callArguments.thisRegister(), generator.propertyNames().eval, resolveScopeInfo);
+ generator.moveToDestinationIfNeeded(
+ callArguments.thisRegister(),
+ generator.emitResolveScope(callArguments.thisRegister(), generator.propertyNames().eval, resolveScopeInfo));
generator.emitGetFromScope(func.get(), callArguments.thisRegister(), generator.propertyNames().eval, ThrowIfNotFound, resolveScopeInfo);
return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), callArguments, divot(), divotStart(), divotEnd());
}
@@ -556,7 +558,9 @@
JSTextPosition newDivot = divotStart() + m_ident.length();
generator.emitExpressionInfo(newDivot, divotStart(), newDivot);
ResolveScopeInfo resolveScopeInfo;
- generator.emitResolveScope(callArguments.thisRegister(), m_ident, resolveScopeInfo);
+ generator.moveToDestinationIfNeeded(
+ callArguments.thisRegister(),
+ generator.emitResolveScope(callArguments.thisRegister(), m_ident, resolveScopeInfo));
generator.emitGetFromScope(func.get(), callArguments.thisRegister(), m_ident, ThrowIfNotFound, resolveScopeInfo);
RegisterID* ret = generator.emitCall(returnValue.get(), func.get(), expectedFunction, callArguments, divot(), divotStart(), divotEnd());
if (generator.vm()->typeProfiler()) {
@@ -838,7 +842,7 @@
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
ResolveScopeInfo resolveScopeInfo;
- RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo);
+ RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, ident, resolveScopeInfo);
RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound, resolveScopeInfo);
RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound, resolveScopeInfo);
@@ -924,7 +928,7 @@
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
ResolveScopeInfo resolveScopeInfo;
- RefPtr<RegisterID> base = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo);
+ RefPtr<RegisterID> base = generator.emitResolveScope(dst, m_ident, resolveScopeInfo);
return generator.emitDeleteById(generator.finalDestination(dst, base.get()), base.get(), m_ident);
}
@@ -982,7 +986,7 @@
}
ResolveScopeInfo resolveScopeInfo;
- RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), m_ident, resolveScopeInfo);
+ RefPtr<RegisterID> scope = generator.emitResolveScope(dst, m_ident, resolveScopeInfo);
RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound, resolveScopeInfo);
if (dst == generator.ignoredResult())
return 0;
@@ -1029,7 +1033,7 @@
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
ResolveScopeInfo resolveScopeInfo;
- RefPtr<RegisterID> scope = generator.emitResolveScope(generator.tempDestination(dst), ident, resolveScopeInfo);
+ RefPtr<RegisterID> scope = generator.emitResolveScope(dst, ident, resolveScopeInfo);
RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), ident, ThrowIfNotFound, resolveScopeInfo);
emitIncOrDec(generator, value.get(), m_operator);
generator.emitPutToScope(scope.get(), ident, value.get(), ThrowIfNotFound, resolveScopeInfo);
@@ -1551,7 +1555,7 @@
generator.emitExpressionInfo(newDivot, divotStart(), newDivot);
ResolveScopeInfo resolveScopeInfo;
- RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo);
+ RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, m_ident, resolveScopeInfo);
RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, ThrowIfNotFound, resolveScopeInfo);
RefPtr<RegisterID> result = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()), this);
RegisterID* returnResult = generator.emitPutToScope(scope.get(), m_ident, result.get(), ThrowIfNotFound, resolveScopeInfo);
@@ -1588,7 +1592,7 @@
if (generator.isStrictMode())
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
ResolveScopeInfo resolveScopeInfo;
- RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo);
+ RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, m_ident, resolveScopeInfo);
if (dst == generator.ignoredResult())
dst = 0;
RefPtr<RegisterID> result = generator.emitNode(dst, m_right);
@@ -1734,7 +1738,7 @@
// FIXME: This will result in incorrect assignment if m_ident exists in an intervening with scope.
ResolveScopeInfo resolveScopeInfo;
- RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo);
+ RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, m_ident, resolveScopeInfo);
return generator.emitPutToScope(scope.get(), m_ident, value.get(), DoNotThrowIfNotFound, resolveScopeInfo);
}
@@ -1831,7 +1835,7 @@
generator.emitProfileType(local.get(), ProfileTypeBytecodeHasGlobalID, nullptr);
else {
ResolveScopeInfo resolveScopeInfo;
- RefPtr<RegisterID> scope = generator.emitResolveScope(generator.newTemporary(), m_ident, resolveScopeInfo);
+ RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, m_ident, resolveScopeInfo);
RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), m_ident, DoNotThrowIfNotFound, resolveScopeInfo);
generator.emitProfileType(value.get(), resolveScopeInfo.isLocal() ? ProfileTypeBytecodeGetFromLocalScope : ProfileTypeBytecodeGetFromScope, &m_ident);
}
@@ -2035,7 +2039,7 @@
if (generator.isStrictMode())
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
ResolveScopeInfo resolveScopeInfo;
- RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo);
+ RegisterID* scope = generator.emitResolveScope(nullptr, ident, resolveScopeInfo);
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
generator.emitPutToScope(scope, ident, propertyName, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo);
if (generator.vm()->typeProfiler())
@@ -2259,7 +2263,7 @@
if (generator.isStrictMode())
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
ResolveScopeInfo resolveScopeInfo;
- RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), ident, resolveScopeInfo);
+ RegisterID* scope = generator.emitResolveScope(nullptr, ident, resolveScopeInfo);
generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
generator.emitPutToScope(scope, ident, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo);
if (generator.vm()->typeProfiler())
@@ -2968,7 +2972,7 @@
if (generator.isStrictMode())
generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd());
ResolveScopeInfo resolveScopeInfo;
- RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), m_boundProperty, resolveScopeInfo);
+ RegisterID* scope = generator.emitResolveScope(nullptr, m_boundProperty, resolveScopeInfo);
generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd());
generator.emitPutToScope(scope, m_boundProperty, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, resolveScopeInfo);
if (generator.vm()->typeProfiler()) {