| Index: src/compiler/bytecode-graph-builder.cc
|
| diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc
|
| index c07aa742cc11cb36ccc15599c646455c61523abb..d26ff93e3f2373fb4d230e0950f36b5bd4ff9b2d 100644
|
| --- a/src/compiler/bytecode-graph-builder.cc
|
| +++ b/src/compiler/bytecode-graph-builder.cc
|
| @@ -896,8 +896,6 @@ BytecodeGraphBuilder::Environment* BytecodeGraphBuilder::CheckContextExtensions(
|
| // Output environment where the context has an extension
|
| Environment* slow_environment = nullptr;
|
|
|
| - DCHECK_GT(depth, 0u);
|
| -
|
| // We only need to check up to the last-but-one depth, because the an eval in
|
| // the same scope as the variable itself has no way of shadowing it.
|
| for (uint32_t d = 0; d < depth; d++) {
|
| @@ -931,7 +929,9 @@ BytecodeGraphBuilder::Environment* BytecodeGraphBuilder::CheckContextExtensions(
|
| }
|
| }
|
|
|
| - DCHECK_NOT_NULL(slow_environment);
|
| + // The depth can be zero, in which case no slow-path checks are built, and the
|
| + // slow path environment can be null.
|
| + DCHECK(depth == 0 || slow_environment != nullptr);
|
|
|
| return slow_environment;
|
| }
|
| @@ -949,28 +949,33 @@ void BytecodeGraphBuilder::BuildLdaLookupContextSlot(TypeofMode typeof_mode) {
|
| const Operator* op = javascript()->LoadContext(depth, slot_index, false);
|
| Node* context = environment()->Context();
|
| environment()->BindAccumulator(NewNode(op, context));
|
| - NewMerge();
|
| }
|
| - Environment* fast_environment = environment();
|
|
|
| - // Slow path, do a runtime load lookup.
|
| - set_environment(slow_environment);
|
| - {
|
| - FrameStateBeforeAndAfter states(this);
|
| + // Only build the slow path if there were any slow-path checks.
|
| + if (slow_environment != nullptr) {
|
| + // Add a merge to the fast environment.
|
| + NewMerge();
|
| + Environment* fast_environment = environment();
|
|
|
| - Node* name =
|
| - jsgraph()->Constant(bytecode_iterator().GetConstantForIndexOperand(0));
|
| + // Slow path, do a runtime load lookup.
|
| + set_environment(slow_environment);
|
| + {
|
| + FrameStateBeforeAndAfter states(this);
|
|
|
| - const Operator* op =
|
| - javascript()->CallRuntime(typeof_mode == TypeofMode::NOT_INSIDE_TYPEOF
|
| - ? Runtime::kLoadLookupSlot
|
| - : Runtime::kLoadLookupSlotInsideTypeof);
|
| - Node* value = NewNode(op, name);
|
| - environment()->BindAccumulator(value, &states);
|
| - }
|
| + Node* name = jsgraph()->Constant(
|
| + bytecode_iterator().GetConstantForIndexOperand(0));
|
| +
|
| + const Operator* op =
|
| + javascript()->CallRuntime(typeof_mode == TypeofMode::NOT_INSIDE_TYPEOF
|
| + ? Runtime::kLoadLookupSlot
|
| + : Runtime::kLoadLookupSlotInsideTypeof);
|
| + Node* value = NewNode(op, name);
|
| + environment()->BindAccumulator(value, &states);
|
| + }
|
|
|
| - fast_environment->Merge(environment());
|
| - set_environment(fast_environment);
|
| + fast_environment->Merge(environment());
|
| + set_environment(fast_environment);
|
| + }
|
| }
|
|
|
| void BytecodeGraphBuilder::VisitLdaLookupContextSlot() {
|
| @@ -993,29 +998,33 @@ void BytecodeGraphBuilder::BuildLdaLookupGlobalSlot(TypeofMode typeof_mode) {
|
| Node* node =
|
| BuildLoadGlobal(bytecode_iterator().GetIndexOperand(1), typeof_mode);
|
| environment()->BindAccumulator(node, &states);
|
| + }
|
|
|
| + // Only build the slow path if there were any slow-path checks.
|
| + if (slow_environment != nullptr) {
|
| + // Add a merge to the fast environment.
|
| NewMerge();
|
| - }
|
| - Environment* fast_environment = environment();
|
| + Environment* fast_environment = environment();
|
|
|
| - // Slow path, do a runtime load lookup.
|
| - set_environment(slow_environment);
|
| - {
|
| - FrameStateBeforeAndAfter states(this);
|
| + // Slow path, do a runtime load lookup.
|
| + set_environment(slow_environment);
|
| + {
|
| + FrameStateBeforeAndAfter states(this);
|
|
|
| - Node* name =
|
| - jsgraph()->Constant(bytecode_iterator().GetConstantForIndexOperand(0));
|
| + Node* name = jsgraph()->Constant(
|
| + bytecode_iterator().GetConstantForIndexOperand(0));
|
|
|
| - const Operator* op =
|
| - javascript()->CallRuntime(typeof_mode == TypeofMode::NOT_INSIDE_TYPEOF
|
| - ? Runtime::kLoadLookupSlot
|
| - : Runtime::kLoadLookupSlotInsideTypeof);
|
| - Node* value = NewNode(op, name);
|
| - environment()->BindAccumulator(value, &states);
|
| - }
|
| + const Operator* op =
|
| + javascript()->CallRuntime(typeof_mode == TypeofMode::NOT_INSIDE_TYPEOF
|
| + ? Runtime::kLoadLookupSlot
|
| + : Runtime::kLoadLookupSlotInsideTypeof);
|
| + Node* value = NewNode(op, name);
|
| + environment()->BindAccumulator(value, &states);
|
| + }
|
|
|
| - fast_environment->Merge(environment());
|
| - set_environment(fast_environment);
|
| + fast_environment->Merge(environment());
|
| + set_environment(fast_environment);
|
| + }
|
| }
|
|
|
| void BytecodeGraphBuilder::VisitLdaLookupGlobalSlot() {
|
|
|