Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(209)

Unified Diff: src/interpreter/bytecode-generator.cc

Issue 2201193004: Use Variable::binding_needs_init() to determine hole initialization (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove one more comment Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/interpreter/bytecode-generator.cc
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc
index 7a1a7a051154bf4c583f4a02460b1f61be3bc5fe..bf25e0e17fed02e9f6ab91fbd1fd4c7ece2caf9b 100644
--- a/src/interpreter/bytecode-generator.cc
+++ b/src/interpreter/bytecode-generator.cc
@@ -832,10 +832,6 @@ void BytecodeGenerator::VisitBlockDeclarationsAndStatements(Block* stmt) {
void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) {
Variable* variable = decl->proxy()->var();
- VariableMode mode = decl->mode();
- // Const and let variables are initialized with the hole so that we can
- // check that they are only assigned once.
- bool hole_init = mode == CONST || mode == LET;
switch (variable->location()) {
case VariableLocation::GLOBAL:
case VariableLocation::UNALLOCATED: {
@@ -845,13 +841,13 @@ void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) {
break;
}
case VariableLocation::LOCAL:
- if (hole_init) {
+ if (variable->binding_needs_init()) {
Register destination(variable->index());
builder()->LoadTheHole().StoreAccumulatorInRegister(destination);
}
break;
case VariableLocation::PARAMETER:
- if (hole_init) {
+ if (variable->binding_needs_init()) {
// The parameter indices are shifted by 1 (receiver is variable
// index -1 but is parameter index 0 in BytecodeArrayBuilder).
Register destination(builder()->Parameter(variable->index() + 1));
@@ -859,14 +855,14 @@ void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) {
}
break;
case VariableLocation::CONTEXT:
- if (hole_init) {
+ if (variable->binding_needs_init()) {
builder()->LoadTheHole().StoreContextSlot(execution_context()->reg(),
variable->index());
}
break;
case VariableLocation::LOOKUP: {
- DCHECK_EQ(VAR, mode);
- DCHECK(!hole_init);
+ DCHECK_EQ(VAR, variable->mode());
+ DCHECK(!variable->binding_needs_init());
Register name = register_allocator()->NewRegister();
@@ -1843,22 +1839,20 @@ void BytecodeGenerator::VisitVariableProxy(VariableProxy* proxy) {
VisitVariableLoad(proxy->var(), proxy->VariableFeedbackSlot());
}
-void BytecodeGenerator::BuildHoleCheckForVariableLoad(VariableMode mode,
- Handle<String> name) {
- if (mode == LET || mode == CONST) {
- BuildThrowIfHole(name);
+void BytecodeGenerator::BuildHoleCheckForVariableLoad(Variable* variable) {
+ if (variable->binding_needs_init()) {
+ BuildThrowIfHole(variable->name());
}
}
void BytecodeGenerator::VisitVariableLoad(Variable* variable,
FeedbackVectorSlot slot,
TypeofMode typeof_mode) {
- VariableMode mode = variable->mode();
switch (variable->location()) {
case VariableLocation::LOCAL: {
Register source(Register(variable->index()));
builder()->LoadAccumulatorWithRegister(source);
- BuildHoleCheckForVariableLoad(mode, variable->name());
+ BuildHoleCheckForVariableLoad(variable);
execution_result()->SetResultInAccumulator();
break;
}
@@ -1867,7 +1861,7 @@ void BytecodeGenerator::VisitVariableLoad(Variable* variable,
// index -1 but is parameter index 0 in BytecodeArrayBuilder).
Register source = builder()->Parameter(variable->index() + 1);
builder()->LoadAccumulatorWithRegister(source);
- BuildHoleCheckForVariableLoad(mode, variable->name());
+ BuildHoleCheckForVariableLoad(variable);
execution_result()->SetResultInAccumulator();
break;
}
@@ -1901,7 +1895,7 @@ void BytecodeGenerator::VisitVariableLoad(Variable* variable,
}
builder()->LoadContextSlot(context_reg, variable->index());
- BuildHoleCheckForVariableLoad(mode, variable->name());
+ BuildHoleCheckForVariableLoad(variable);
execution_result()->SetResultInAccumulator();
break;
}
« no previous file with comments | « src/interpreter/bytecode-generator.h ('k') | test/cctest/interpreter/bytecode_expectations/BasicLoops.golden » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698