Index: src/compiler/typer.cc |
diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc |
index 4b3a8830a0fff9cbed6694b9588742225d262814..0694c9cba2f07f488d5163a79733dcbe6a279f1a 100644 |
--- a/src/compiler/typer.cc |
+++ b/src/compiler/typer.cc |
@@ -316,14 +316,7 @@ class Typer::Visitor : public Reducer { |
return BoundsOrNone(operand_node); |
} |
- Bounds ContextOperand(Node* node) { |
- Bounds result = BoundsOrNone(NodeProperties::GetContextInput(node)); |
- DCHECK(result.upper->Maybe(Type::Internal())); |
- // TODO(rossberg): More precisely, instead of the above assertion, we should |
- // back-propagate the constraint that it has to be a subtype of Internal. |
- return result; |
- } |
- |
+ Bounds WrapContextBoundsForInput(Node* node); |
Type* Weaken(Type* current_type, Type* previous_type); |
Zone* zone() { return typer_->zone(); } |
@@ -1381,40 +1374,45 @@ Bounds Typer::Visitor::TypeJSStoreContext(Node* node) { |
} |
+Bounds Typer::Visitor::WrapContextBoundsForInput(Node* node) { |
+ Bounds outer = BoundsOrNone(NodeProperties::GetContextInput(node)); |
+ if (outer.upper->Is(Type::None())) { |
+ return Bounds(Type::None()); |
+ } else { |
+ DCHECK(outer.upper->Maybe(Type::Internal())); |
+ return Bounds(Type::Context(outer.upper, zone())); |
+ } |
+} |
+ |
+ |
Bounds Typer::Visitor::TypeJSCreateFunctionContext(Node* node) { |
- Bounds outer = ContextOperand(node); |
- return Bounds(Type::Context(outer.upper, zone())); |
+ return WrapContextBoundsForInput(node); |
} |
Bounds Typer::Visitor::TypeJSCreateCatchContext(Node* node) { |
- Bounds outer = ContextOperand(node); |
- return Bounds(Type::Context(outer.upper, zone())); |
+ return WrapContextBoundsForInput(node); |
} |
Bounds Typer::Visitor::TypeJSCreateWithContext(Node* node) { |
- Bounds outer = ContextOperand(node); |
- return Bounds(Type::Context(outer.upper, zone())); |
+ return WrapContextBoundsForInput(node); |
} |
Bounds Typer::Visitor::TypeJSCreateBlockContext(Node* node) { |
- Bounds outer = ContextOperand(node); |
- return Bounds(Type::Context(outer.upper, zone())); |
+ return WrapContextBoundsForInput(node); |
} |
Bounds Typer::Visitor::TypeJSCreateModuleContext(Node* node) { |
// TODO(rossberg): this is probably incorrect |
- Bounds outer = ContextOperand(node); |
- return Bounds(Type::Context(outer.upper, zone())); |
+ return WrapContextBoundsForInput(node); |
} |
Bounds Typer::Visitor::TypeJSCreateScriptContext(Node* node) { |
- Bounds outer = ContextOperand(node); |
- return Bounds(Type::Context(outer.upper, zone())); |
+ return WrapContextBoundsForInput(node); |
} |