Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp (194303 => 194304)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2015-12-19 00:16:15 UTC (rev 194303)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2015-12-19 00:19:41 UTC (rev 194304)
@@ -581,7 +581,7 @@
emitPutDerivedConstructorToArrowFunctionContextScope();
}
- pushLexicalScope(m_scopeNode, true);
+ pushLexicalScope(m_scopeNode, TDZCheckOptimization::Optimize);
}
BytecodeGenerator::BytecodeGenerator(VM& vm, EvalNode* evalNode, UnlinkedEvalCodeBlock* codeBlock, DebuggerMode debuggerMode, ProfilerMode profilerMode, const VariableEnvironment* parentScopeTDZVariables)
@@ -632,7 +632,7 @@
emitPutThisToArrowFunctionContextScope();
}
- pushLexicalScope(m_scopeNode, true);
+ pushLexicalScope(m_scopeNode, TDZCheckOptimization::Optimize);
}
BytecodeGenerator::BytecodeGenerator(VM& vm, ModuleProgramNode* moduleProgramNode, UnlinkedModuleProgramCodeBlock* codeBlock, DebuggerMode debuggerMode, ProfilerMode profilerMode, const VariableEnvironment* parentScopeTDZVariables)
@@ -809,7 +809,7 @@
}
// This implements step 25 of section 9.2.12.
- pushLexicalScopeInternal(environment, true, false, nullptr, TDZRequirement::UnderTDZ, ScopeType::LetConstScope, ScopeRegisterType::Block);
+ pushLexicalScopeInternal(environment, TDZCheckOptimization::Optimize, NestedScopeType::IsNotNested, nullptr, TDZRequirement::UnderTDZ, ScopeType::LetConstScope, ScopeRegisterType::Block);
RefPtr<RegisterID> temp = newTemporary();
for (unsigned i = 0; i < parameters.size(); i++) {
@@ -927,7 +927,7 @@
}
size_t size = m_symbolTableStack.size();
- pushLexicalScopeInternal(environment, true, false, nullptr, TDZRequirement::UnderTDZ, ScopeType::LetConstScope, ScopeRegisterType::Block);
+ pushLexicalScopeInternal(environment, TDZCheckOptimization::Optimize, NestedScopeType::IsNotNested, nullptr, TDZRequirement::UnderTDZ, ScopeType::LetConstScope, ScopeRegisterType::Block);
ASSERT_UNUSED(size, m_symbolTableStack.size() == size + 1);
@@ -1797,13 +1797,13 @@
}
}
-void BytecodeGenerator::pushLexicalScope(VariableEnvironmentNode* node, bool canOptimizeTDZChecks, bool isNestedLexicalScope, RegisterID** constantSymbolTableResult)
+void BytecodeGenerator::pushLexicalScope(VariableEnvironmentNode* node, TDZCheckOptimization tdzCheckOptimization, NestedScopeType nestedScopeType, RegisterID** constantSymbolTableResult)
{
VariableEnvironment& environment = node->lexicalVariables();
- pushLexicalScopeInternal(environment, canOptimizeTDZChecks, isNestedLexicalScope, constantSymbolTableResult, TDZRequirement::UnderTDZ, ScopeType::LetConstScope, ScopeRegisterType::Block);
+ pushLexicalScopeInternal(environment, tdzCheckOptimization, nestedScopeType, constantSymbolTableResult, TDZRequirement::UnderTDZ, ScopeType::LetConstScope, ScopeRegisterType::Block);
}
-void BytecodeGenerator::pushLexicalScopeInternal(VariableEnvironment& environment, bool canOptimizeTDZChecks, bool isNestedLexicalScope,
+void BytecodeGenerator::pushLexicalScopeInternal(VariableEnvironment& environment, TDZCheckOptimization tdzCheckOptimization, NestedScopeType nestedScopeType,
RegisterID** constantSymbolTableResult, TDZRequirement tdzRequirement, ScopeType scopeType, ScopeRegisterType scopeRegisterType)
{
if (!environment.size())
@@ -1825,7 +1825,7 @@
break;
}
- if (isNestedLexicalScope)
+ if (nestedScopeType == NestedScopeType::IsNested)
symbolTable->markIsNestedLexicalScope();
auto lookUpVarKind = [] (UniquedStringImpl*, const VariableEnvironmentEntry& entry) -> VarKind {
@@ -1867,6 +1867,7 @@
}
m_symbolTableStack.append(SymbolTableStackEntry{ symbolTable, newScope, false, symbolTableConstantIndex });
+ bool canOptimizeTDZChecks = tdzCheckOptimization == TDZCheckOptimization::Optimize;
if (tdzRequirement == TDZRequirement::UnderTDZ)
m_TDZStack.append(std::make_pair(environment, canOptimizeTDZChecks));
@@ -3566,7 +3567,7 @@
addResult.iterator->value.setIsCaptured();
addResult.iterator->value.setIsConst(); // The function name scope name acts like a const variable.
unsigned numVars = m_codeBlock->m_numVars;
- pushLexicalScopeInternal(nameScopeEnvironment, true, false, nullptr, TDZRequirement::NotUnderTDZ, ScopeType::FunctionNameScope, ScopeRegisterType::Var);
+ pushLexicalScopeInternal(nameScopeEnvironment, TDZCheckOptimization::Optimize, NestedScopeType::IsNotNested, nullptr, TDZRequirement::NotUnderTDZ, ScopeType::FunctionNameScope, ScopeRegisterType::Var);
ASSERT_UNUSED(numVars, m_codeBlock->m_numVars == static_cast<int>(numVars + 1)); // Should have only created one new "var" for the function name scope.
bool shouldTreatAsLexicalVariable = isStrictMode();
Variable functionVar = variableForLocalEntry(property, m_symbolTableStack.last().m_symbolTable->get(property.impl()), m_symbolTableStack.last().m_symbolTableConstantIndex, shouldTreatAsLexicalVariable);
@@ -3592,7 +3593,7 @@
void BytecodeGenerator::emitPushCatchScope(const Identifier& property, RegisterID* exceptionValue, VariableEnvironment& environment)
{
RELEASE_ASSERT(environment.contains(property.impl()));
- pushLexicalScopeInternal(environment, true, false, nullptr, TDZRequirement::NotUnderTDZ, ScopeType::CatchScope, ScopeRegisterType::Block);
+ pushLexicalScopeInternal(environment, TDZCheckOptimization::Optimize, NestedScopeType::IsNotNested, nullptr, TDZRequirement::NotUnderTDZ, ScopeType::CatchScope, ScopeRegisterType::Block);
Variable exceptionVar = variable(property);
RELEASE_ASSERT(exceptionVar.isResolved());
RefPtr<RegisterID> scope = emitResolveScope(nullptr, exceptionVar);
Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h (194303 => 194304)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2015-12-19 00:16:15 UTC (rev 194303)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2015-12-19 00:19:41 UTC (rev 194304)
@@ -700,11 +700,13 @@
OpcodeID lastOpcodeID() const { return m_lastOpcodeID; }
+ enum class TDZCheckOptimization { Optimize, DoNotOptimize };
+ enum class NestedScopeType { IsNested, IsNotNested };
private:
enum class TDZRequirement { UnderTDZ, NotUnderTDZ };
enum class ScopeType { CatchScope, LetConstScope, FunctionNameScope };
enum class ScopeRegisterType { Var, Block };
- void pushLexicalScopeInternal(VariableEnvironment&, bool canOptimizeTDZChecks, bool isNestedLexicalScope, RegisterID** constantSymbolTableResult, TDZRequirement, ScopeType, ScopeRegisterType);
+ void pushLexicalScopeInternal(VariableEnvironment&, TDZCheckOptimization, NestedScopeType, RegisterID** constantSymbolTableResult, TDZRequirement, ScopeType, ScopeRegisterType);
void popLexicalScopeInternal(VariableEnvironment&, TDZRequirement);
template<typename LookUpVarKindFunctor>
bool instantiateLexicalVariables(const VariableEnvironment&, SymbolTable*, ScopeRegisterType, LookUpVarKindFunctor);
@@ -715,7 +717,7 @@
void emitNewFunctionExpressionCommon(RegisterID*, BaseFuncExprNode*);
public:
- void pushLexicalScope(VariableEnvironmentNode*, bool canOptimizeTDZChecks, bool isNestedLexicalScope = false, RegisterID** constantSymbolTableResult = nullptr);
+ void pushLexicalScope(VariableEnvironmentNode*, TDZCheckOptimization, NestedScopeType = NestedScopeType::IsNotNested, RegisterID** constantSymbolTableResult = nullptr);
void popLexicalScope(VariableEnvironmentNode*);
void prepareLexicalScopeForNextForLoopIteration(VariableEnvironmentNode*, RegisterID* loopSymbolTable);
int labelScopeDepth() const;
Modified: trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp (194303 => 194304)
--- trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2015-12-19 00:16:15 UTC (rev 194303)
+++ trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2015-12-19 00:19:41 UTC (rev 194304)
@@ -2049,7 +2049,7 @@
{
if (!m_statements)
return;
- generator.pushLexicalScope(this, true, true);
+ generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::Optimize, BytecodeGenerator::NestedScopeType::IsNested);
m_statements->emitBytecode(generator, dst);
generator.popLexicalScope(this);
}
@@ -2254,7 +2254,7 @@
LabelScopePtr scope = generator.newLabelScope(LabelScope::Loop);
RegisterID* forLoopSymbolTable = nullptr;
- generator.pushLexicalScope(this, true, true, &forLoopSymbolTable);
+ generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::Optimize, BytecodeGenerator::NestedScopeType::IsNested, &forLoopSymbolTable);
generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
@@ -2382,7 +2382,7 @@
RefPtr<Label> end = generator.newLabel();
RegisterID* forLoopSymbolTable = nullptr;
- generator.pushLexicalScope(this, true, true, &forLoopSymbolTable);
+ generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::Optimize, BytecodeGenerator::NestedScopeType::IsNested, &forLoopSymbolTable);
generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
@@ -2532,7 +2532,7 @@
}
RegisterID* forLoopSymbolTable = nullptr;
- generator.pushLexicalScope(this, true, true, &forLoopSymbolTable);
+ generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::Optimize, BytecodeGenerator::NestedScopeType::IsNested, &forLoopSymbolTable);
generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
auto extractor = [this, dst](BytecodeGenerator& generator, RegisterID* value)
{
@@ -2848,7 +2848,7 @@
RefPtr<RegisterID> r0 = generator.emitNode(m_expr);
- generator.pushLexicalScope(this, false, true);
+ generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::DoNotOptimize, BytecodeGenerator::NestedScopeType::IsNested);
m_block->emitBytecodeForBlock(generator, r0.get(), dst);
generator.popLexicalScope(this);
@@ -3181,7 +3181,7 @@
RegisterID* ClassExprNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
if (!m_name.isNull())
- generator.pushLexicalScope(this, true, true);
+ generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::Optimize, BytecodeGenerator::NestedScopeType::IsNested);
RefPtr<RegisterID> superclass;
if (m_classHeritage) {