Reviewers: rossberg,

Description:
Minor clarifications and simplifications as well as additional checks.

[email protected]
BUG=

Please review this at https://codereview.chromium.org/417553003/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+29, -28 lines):
  M src/types.h
  M src/types.cc


Index: src/types.cc
diff --git a/src/types.cc b/src/types.cc
index db638ed141d604e95ffe7ab9f9099aac0ba34a2d..327eba0679bc9cb9efa5444a839ef02b8b8082e3 100644
--- a/src/types.cc
+++ b/src/types.cc
@@ -262,7 +262,7 @@ bool TypeImpl<Config>::SlowIs(TypeImpl* that) {
if (this->IsBitset() && SEMANTIC(this->AsBitset()) == BitsetType::kNone) { // Bitsets only have non-bitset supertypes along the representation axis.
     int that_bitset = that->BitsetGlb();
-    return (this->AsBitset() | that_bitset) == that_bitset;
+    return (BitsetType::Is(this->AsBitset(), that_bitset));
   }

   if (that->IsClass()) {
@@ -313,16 +313,12 @@ bool TypeImpl<Config>::SlowIs(TypeImpl* that) {

   // T <= (T1 \/ ... \/ Tn)  <=>  (T <= T1) \/ ... \/ (T <= Tn)
   // (iff T is not a union)
-  ASSERT(!this->IsUnion());
-  if (that->IsUnion()) {
-    UnionHandle unioned = handle(that->AsUnion());
-    for (int i = 0; i < unioned->Length(); ++i) {
-      if (this->Is(unioned->Get(i))) return true;
- if (this->IsBitset()) break; // Fast fail, only first field is a bitset.
-    }
-    return false;
+  ASSERT(!this->IsUnion() && that->IsUnion());
+  UnionHandle unioned = handle(that->AsUnion());
+  for (int i = 0; i < unioned->Length(); ++i) {
+    if (this->Is(unioned->Get(i))) return true;
+ if (this->IsBitset()) break; // Fast fail, only first field is a bitset.
   }
-
   return false;
 }

@@ -382,11 +378,8 @@ bool TypeImpl<Config>::Maybe(TypeImpl* that) {
   }

   ASSERT(!this->IsUnion() && !that->IsUnion());
-  if (this->IsBitset()) {
-    return BitsetType::IsInhabited(this->AsBitset() & that->BitsetLub());
-  }
-  if (that->IsBitset()) {
-    return BitsetType::IsInhabited(this->BitsetLub() & that->AsBitset());
+  if (this->IsBitset() || that->IsBitset()) {
+    return BitsetType::IsInhabited(this->BitsetLub() & that->BitsetLub());
   }
   if (this->IsClass()) {
     return that->IsClass()
@@ -441,7 +434,7 @@ bool TypeImpl<Config>::UnionType::Wellformed() {
 // Union and intersection

 template<class Config>
-typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Narrow(
+typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Rebound(
     int bitset, Region* region) {
   TypeHandle bound = BitsetType::New(bitset, region);
   if (this->IsClass()) {
@@ -555,7 +548,7 @@ int TypeImpl<Config>::ExtendUnion(
         new_bound |= type_i_bound;
         if (new_bound == type_i_bound) return size;
       }
-      if (new_bound != old_bound) type = type->Narrow(new_bound, region);
+      if (new_bound != old_bound) type = type->Rebound(new_bound, region);
       result->Set(i, type);
     }
   }
@@ -570,7 +563,7 @@ int TypeImpl<Config>::NormalizeUnion(UnionHandle result, int size, int bitset) { if (bitset != BitsetType::kNone && SEMANTIC(bitset) == BitsetType::kNone) {
     for (int i = 1; i < size; ++i) {
       int glb = result->Get(i)->BitsetGlb();
-      if ((bitset | glb) == glb) {
+      if (BitsetType::Is(bitset, glb)) {
         for (int j = 1; j < size; ++j) {
           result->Set(j - 1, result->Get(j));
         }
Index: src/types.h
diff --git a/src/types.h b/src/types.h
index d316fa19aa4322d782ac298924a2ba96dabd7398..8d9678cf48ca0c9dd75565e5605a7af73f145be0 100644
--- a/src/types.h
+++ b/src/types.h
@@ -68,11 +68,12 @@ namespace internal {
 //   None <= R
 //   R <= Any
 //
-//   UntaggedInt <= UntaggedInt8 \/ UntaggedInt16 \/ UntaggedInt32)
-//   UntaggedFloat <= UntaggedFloat32 \/ UntaggedFloat64
-//   UntaggedNumber <= UntaggedInt \/ UntaggedFloat
-//   Untagged <= UntaggedNumber \/ UntaggedPtr
-//   Tagged <= TaggedInt \/ TaggedPtr
+//   UntaggedInt = UntaggedInt1 \/ UntaggedInt8 \/
+//                 UntaggedInt16 \/ UntaggedInt32
+//   UntaggedFloat = UntaggedFloat32 \/ UntaggedFloat64
+//   UntaggedNumber = UntaggedInt \/ UntaggedFloat
+//   Untagged = UntaggedNumber \/ UntaggedPtr
+//   Tagged = TaggedInt \/ TaggedPtr
 //
 // Subtyping relates the two dimensions, for example:
 //
@@ -464,7 +465,7 @@ class TypeImpl : public Config::Base {

   bool SlowIs(TypeImpl* that);

-  TypeHandle Narrow(int bitset, Region* region);
+  TypeHandle Rebound(int bitset, Region* region);
   int BoundBy(TypeImpl* that);
   int IndexInUnion(int bound, UnionHandle unioned, int current_size);
   static int ExtendUnion(
@@ -502,6 +503,10 @@ class TypeImpl<Config>::BitsetType : public TypeImpl<Config> {
     return (bitset & kRepresentation) && (bitset & kSemantic);
   }

+  static bool Is(int bitset1, int bitset2) {
+    return (bitset1 | bitset2) == bitset2;
+  }
+
   static int Glb(TypeImpl* type);  // greatest lower bound that's a bitset
   static int Lub(TypeImpl* type);  // least upper bound that's a bitset
   static int Lub(i::Object* value);
@@ -612,6 +617,7 @@ class TypeImpl<Config>::ClassType : public StructuralType {

   static ClassHandle New(
       i::Handle<i::Map> map, TypeHandle bound, Region* region) {
+    ASSERT(BitsetType::Is(bound->AsBitset(), BitsetType::Lub(*map)));
     ClassHandle type = Config::template cast<ClassType>(
         StructuralType::New(StructuralType::kClassTag, 2, region));
     type->Set(0, bound);
@@ -648,6 +654,7 @@ class TypeImpl<Config>::ConstantType : public StructuralType {

   static ConstantHandle New(
       i::Handle<i::Object> value, TypeHandle bound, Region* region) {
+    ASSERT(BitsetType::Is(bound->AsBitset(), BitsetType::Lub(*value)));
     ConstantHandle type = Config::template cast<ConstantType>(
         StructuralType::New(StructuralType::kConstantTag, 2, region));
     type->Set(0, bound);
@@ -679,8 +686,7 @@ class TypeImpl<Config>::RangeType : public StructuralType {

   static RangeHandle New(
       double min, double max, TypeHandle bound, Region* region) {
-    ASSERT(SEMANTIC(bound->AsBitset() | BitsetType::kNumber)
-           == SEMANTIC(BitsetType::kNumber));
+    ASSERT(BitsetType::Is(bound->AsBitset(), BitsetType::kNumber));
     ASSERT(!std::isnan(min) && !std::isnan(max) && min <= max);
     RangeHandle type = Config::template cast<RangeType>(
         StructuralType::New(StructuralType::kRangeTag, 3, region));
@@ -715,6 +721,8 @@ class TypeImpl<Config>::ContextType : public StructuralType {
   TypeHandle Outer() { return this->Get(1); }

static ContextHandle New(TypeHandle outer, TypeHandle bound, Region* region) {
+    ASSERT(BitsetType::Is(
+ bound->AsBitset(), BitsetType::kInternal & BitsetType::kTaggedPtr));
     ContextHandle type = Config::template cast<ContextType>(
         StructuralType::New(StructuralType::kContextTag, 2, region));
     type->Set(0, bound);
@@ -745,7 +753,7 @@ class TypeImpl<Config>::ArrayType : public StructuralType {
   TypeHandle Element() { return this->Get(1); }

static ArrayHandle New(TypeHandle element, TypeHandle bound, Region* region) {
-    ASSERT(SEMANTIC(bound->AsBitset()) == SEMANTIC(BitsetType::kArray));
+    ASSERT(BitsetType::Is(bound->AsBitset(), BitsetType::kArray));
     ArrayHandle type = Config::template cast<ArrayType>(
         StructuralType::New(StructuralType::kArrayTag, 2, region));
     type->Set(0, bound);
@@ -782,7 +790,7 @@ class TypeImpl<Config>::FunctionType : public StructuralType {
   static FunctionHandle New(
       TypeHandle result, TypeHandle receiver, TypeHandle bound,
       int arity, Region* region) {
-    ASSERT(SEMANTIC(bound->AsBitset()) == SEMANTIC(BitsetType::kFunction));
+    ASSERT(BitsetType::Is(bound->AsBitset(), BitsetType::kFunction));
     FunctionHandle type = Config::template cast<FunctionType>(
StructuralType::New(StructuralType::kFunctionTag, 3 + arity, region));
     type->Set(0, bound);


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to