Skip to content

Commit 649ab06

Browse files
GeorgNeisCommit Bot
authored andcommitted
[compiler] Don't assume a HeapConstant context input is a Context.
In a generator containing loops, there are always certain control flow paths that are impossible, due to the way we represent generators at the bytecode level. Unfortunately, the graph builder can't tell that these paths are impossible. In combination with dead code, it can then happen that we build a subgraph (for unreachable code) whose incoming context is the undefined oddball. JSContextSpecialization did not expect that. Bug: chromium:794822 Change-Id: I259be5ae6c5f5adc8fca19c64bf71285ee922b7a Reviewed-on: https://chromium-review.googlesource.com/828954 Reviewed-by: Benedikt Meurer <[email protected]> Commit-Queue: Georg Neis <[email protected]> Cr-Commit-Position: refs/heads/master@{#50129}
1 parent 4a7eec5 commit 649ab06

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

src/compiler/js-context-specialization.cc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,11 @@ bool IsContextParameter(Node* node) {
102102
MaybeHandle<Context> GetSpecializationContext(Node* node, size_t* distance,
103103
Maybe<OuterContext> maybe_outer) {
104104
switch (node->opcode()) {
105-
case IrOpcode::kHeapConstant:
106-
return Handle<Context>::cast(OpParameter<Handle<HeapObject>>(node));
105+
case IrOpcode::kHeapConstant: {
106+
Handle<Object> object = OpParameter<Handle<HeapObject>>(node);
107+
if (object->IsContext()) return Handle<Context>::cast(object);
108+
break;
109+
}
107110
case IrOpcode::kParameter: {
108111
OuterContext outer;
109112
if (maybe_outer.To(&outer) && IsContextParameter(node) &&
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright 2017 the V8 project authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
// Flags: --allow-natives-syntax
6+
7+
function* opt(arg = () => arg) {
8+
let tmp = opt.x; // LdaNamedProperty
9+
for (;;) {
10+
arg;
11+
yield;
12+
function inner() { tmp }
13+
break;
14+
}
15+
}
16+
17+
opt();
18+
%OptimizeFunctionOnNextCall(opt);
19+
opt();

0 commit comments

Comments
 (0)