Chromium Code Reviews| Index: src/compiler/typer.cc |
| diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc |
| index e33b7764567881f149e760262b26a9a58f2b1f87..3ba918d6e54ba5d45c049778b411e3a7e2482f81 100644 |
| --- a/src/compiler/typer.cc |
| +++ b/src/compiler/typer.cc |
| @@ -295,6 +295,7 @@ class Typer::Visitor : public Reducer { |
| static Type* ReferenceEqualTyper(Type*, Type*, Typer*); |
| static Type* StringFromCharCodeTyper(Type*, Typer*); |
| + static Type* StringFromCodePointTyper(Type*, Typer*); |
| Reduction UpdateType(Node* node, Type* current) { |
| if (NodeProperties::IsTyped(node)) { |
| @@ -1365,6 +1366,10 @@ Type* Typer::Visitor::JSCallFunctionTyper(Type* fun, Typer* t) { |
| case kStringToLowerCase: |
| case kStringToUpperCase: |
| return Type::String(); |
| + |
| + case kStringIteratorPrototypeNext: |
| + return Type::DetectableReceiver(); |
|
Benedikt Meurer
2016/10/01 17:41:03
Awesome, I was just about to point this out. Howev
|
| + |
| // Array functions. |
| case kArrayIndexOf: |
| case kArrayLastIndexOf: |
| @@ -1551,6 +1556,19 @@ Type* Typer::Visitor::StringFromCharCodeTyper(Type* type, Typer* t) { |
| return Type::String(); |
| } |
| +Type* Typer::Visitor::StringFromCodePointTyper(Type* type, Typer* t) { |
| + type = NumberToUint32(ToNumber(type, t), t); |
| + Factory* f = t->isolate()->factory(); |
| + double min = type->Min(); |
| + double max = type->Max(); |
| + if (min == max) { |
| + uint32_t code = static_cast<uint32_t>(min) & String::kMaxUtf16CodeUnitU; |
| + Handle<String> string = f->LookupSingleCharacterStringFromCode(code); |
| + return Type::Constant(string, t->zone()); |
| + } |
| + return Type::String(); |
| +} |
| + |
| Type* Typer::Visitor::TypeStringCharCodeAt(Node* node) { |
| // TODO(bmeurer): We could do better here based on inputs. |
| return Type::Range(0, kMaxUInt16, zone()); |
| @@ -1560,6 +1578,10 @@ Type* Typer::Visitor::TypeStringFromCharCode(Node* node) { |
| return TypeUnaryOp(node, StringFromCharCodeTyper); |
| } |
| +Type* Typer::Visitor::TypeStringFromCodePoint(Node* node) { |
| + return TypeUnaryOp(node, StringFromCodePointTyper); |
| +} |
| + |
| Type* Typer::Visitor::TypeCheckBounds(Node* node) { |
| Type* index = Operand(node, 0); |
| Type* length = Operand(node, 1); |