From 1ed16c587e3187bad0405abad2403d6a2a8cbac3 Mon Sep 17 00:00:00 2001 From: Benedikt Meurer Date: Mon, 22 Dec 2014 08:21:30 +0100 Subject: [PATCH] [turbofan] Improve typing of ToBoolean. According to ES6 draft, revision 29 (2014-12-06), section 7.1.2, ToBoolean yields true for true, detectable receivers (the ES6 Object type), symbols and numbers except -0, +0 and NaN. R=hpayer@chromium.org Review URL: https://codereview.chromium.org/807663006 Cr-Commit-Position: refs/heads/master@{#25915} --- src/compiler/typer.cc | 7 +++++-- src/compiler/typer.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc index 58e6c37..b33ee0c 100644 --- a/src/compiler/typer.cc +++ b/src/compiler/typer.cc @@ -187,6 +187,9 @@ Typer::Typer(Graph* graph, MaybeHandle context) Type::Union(Type::Union(singleton_false, zeroish, zone), undefined_or_null, zone), zone); + truish = Type::Union( + singleton_true, + Type::Union(Type::DetectableReceiver(), Type::Symbol(), zone), zone); integer = Type::Range(minusinfinity, infinity, zone); weakint = Type::Union(integer, nan_or_minuszero, zone); @@ -513,8 +516,8 @@ Type* Typer::Visitor::ToPrimitive(Type* type, Typer* t) { Type* Typer::Visitor::ToBoolean(Type* type, Typer* t) { if (type->Is(Type::Boolean())) return type; if (type->Is(t->falsish)) return t->singleton_false; - if (type->Is(Type::DetectableReceiver())) return t->singleton_true; - if (type->Is(Type::OrderedNumber()) && (type->Max() < 0 || 0 < type->Min())) { + if (type->Is(t->truish)) return t->singleton_true; + if (type->Is(Type::PlainNumber()) && (type->Max() < 0 || 0 < type->Min())) { return t->singleton_true; // Ruled out nan, -0 and +0. } return Type::Boolean(); diff --git a/src/compiler/typer.h b/src/compiler/typer.h index 45d3a32..b65a9a5 100644 --- a/src/compiler/typer.h +++ b/src/compiler/typer.h @@ -54,6 +54,7 @@ class Typer { Type* signed32ish; Type* unsigned32ish; Type* falsish; + Type* truish; Type* integer; Type* weakint; Type* number_fun0_; -- 2.7.4