Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: test/cctest/test-types.cc

Issue 251753005: Establish distributivity for type union & intersection (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Accurate representation glb & intersection; renaming Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/types-inl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution. 11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its 12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived 13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission. 14 // from this software without specific prior written permission.
15 // 15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 #include <vector> 28 #include <vector>
29 29
30 #define private public /* To test private methods :) */
Benedikt Meurer 2014/05/27 09:29:47 Urghs... how about friends?
rossberg1 2014/05/27 09:42:58 Because I don't want to pollute the code proper wi
31 #define protected public
32 #include "types.h"
33 #undef private
34 #undef protected
35
30 #include "cctest.h" 36 #include "cctest.h"
31 #include "types.h"
32 #include "utils/random-number-generator.h" 37 #include "utils/random-number-generator.h"
33 38
34 using namespace v8::internal; 39 using namespace v8::internal;
35 40
36 // Testing auxiliaries (breaking the Type abstraction). 41 // Testing auxiliaries (breaking the Type abstraction).
37 struct ZoneRep { 42 struct ZoneRep {
38 typedef void* Struct; 43 typedef void* Struct;
39 44
40 static bool IsStruct(Type* t, int tag) { 45 static bool IsStruct(Type* t, int tag) {
41 return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag; 46 return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag;
(...skipping 28 matching lines...) Expand all
70 }; 75 };
71 76
72 77
73 struct HeapRep { 78 struct HeapRep {
74 typedef FixedArray Struct; 79 typedef FixedArray Struct;
75 80
76 static bool IsStruct(Handle<HeapType> t, int tag) { 81 static bool IsStruct(Handle<HeapType> t, int tag) {
77 return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag; 82 return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag;
78 } 83 }
79 static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); } 84 static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); }
80 static bool IsClass(Handle<HeapType> t) { return t->IsMap(); } 85 static bool IsClass(Handle<HeapType> t) {
81 static bool IsConstant(Handle<HeapType> t) { return t->IsBox(); } 86 return t->IsMap() || IsStruct(t, 0);
87 }
88 static bool IsConstant(Handle<HeapType> t) { return IsStruct(t, 1); }
82 static bool IsArray(Handle<HeapType> t) { return IsStruct(t, 2); } 89 static bool IsArray(Handle<HeapType> t) { return IsStruct(t, 2); }
83 static bool IsFunction(Handle<HeapType> t) { return IsStruct(t, 3); } 90 static bool IsFunction(Handle<HeapType> t) { return IsStruct(t, 3); }
84 static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 4); } 91 static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 4); }
85 92
86 static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); } 93 static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); }
87 static int AsBitset(Handle<HeapType> t) { return Smi::cast(*t)->value(); } 94 static int AsBitset(Handle<HeapType> t) { return Smi::cast(*t)->value(); }
88 static Map* AsClass(Handle<HeapType> t) { return Map::cast(*t); } 95 static Map* AsClass(Handle<HeapType> t) {
89 static Object* AsConstant(Handle<HeapType> t) { 96 return t->IsMap() ? Map::cast(*t) : Map::cast(AsStruct(t)->get(2));
90 return Box::cast(*t)->value();
91 } 97 }
98 static Object* AsConstant(Handle<HeapType> t) { return AsStruct(t)->get(2); }
92 static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); } 99 static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); }
93 static int Length(Struct* structured) { return structured->length() - 1; } 100 static int Length(Struct* structured) { return structured->length() - 1; }
94 101
95 static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; } 102 static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; }
96 }; 103 };
97 104
98 105
99 template<class Type, class TypeHandle, class Region> 106 template<class Type, class TypeHandle, class Region>
100 class Types { 107 class Types {
101 public: 108 public:
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 152
146 FloatArray = Type::Array(Float, region); 153 FloatArray = Type::Array(Float, region);
147 StringArray = Type::Array(String, region); 154 StringArray = Type::Array(String, region);
148 AnyArray = Type::Array(Any, region); 155 AnyArray = Type::Array(Any, region);
149 156
150 SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region); 157 SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region);
151 NumberFunction1 = Type::Function(Number, Number, region); 158 NumberFunction1 = Type::Function(Number, Number, region);
152 NumberFunction2 = Type::Function(Number, Number, Number, region); 159 NumberFunction2 = Type::Function(Number, Number, Number, region);
153 MethodFunction = Type::Function(String, Object, 0, region); 160 MethodFunction = Type::Function(String, Object, 0, region);
154 161
155 for (int i = 0; i < 50; ++i) { 162 for (int i = 0; i < 500; ++i) {
156 types.push_back(Fuzz()); 163 types.push_back(Fuzz());
157 } 164 }
158 } 165 }
159 166
160 Handle<i::Map> object_map; 167 Handle<i::Map> object_map;
161 Handle<i::Map> array_map; 168 Handle<i::Map> array_map;
162 Handle<i::Map> uninitialized_map; 169 Handle<i::Map> uninitialized_map;
163 170
164 Handle<i::Smi> smi; 171 Handle<i::Smi> smi;
165 Handle<i::HeapNumber> signed32; 172 Handle<i::HeapNumber> signed32;
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 for (int i = 0; i < n; ++i) { 301 for (int i = 0; i < n; ++i) {
295 TypeHandle operand = Fuzz(depth - 1); 302 TypeHandle operand = Fuzz(depth - 1);
296 type = Type::Union(type, operand, region_); 303 type = Type::Union(type, operand, region_);
297 } 304 }
298 return type; 305 return type;
299 } 306 }
300 } 307 }
301 UNREACHABLE(); 308 UNREACHABLE();
302 } 309 }
303 310
311 Region* region() { return region_; }
312
304 private: 313 private:
305 Region* region_; 314 Region* region_;
306 RandomNumberGenerator rng_; 315 RandomNumberGenerator rng_;
307 }; 316 };
308 317
309 318
310 template<class Type, class TypeHandle, class Region, class Rep> 319 template<class Type, class TypeHandle, class Region, class Rep>
311 struct Tests : Rep { 320 struct Tests : Rep {
312 typedef Types<Type, TypeHandle, Region> TypesInstance; 321 typedef Types<Type, TypeHandle, Region> TypesInstance;
313 typedef typename TypesInstance::TypeVector::iterator TypeIterator; 322 typedef typename TypesInstance::TypeVector::iterator TypeIterator;
(...skipping 11 matching lines...) Expand all
325 zone(isolate), 334 zone(isolate),
326 T(Rep::ToRegion(&zone, isolate), isolate) { 335 T(Rep::ToRegion(&zone, isolate), isolate) {
327 } 336 }
328 337
329 bool Equal(TypeHandle type1, TypeHandle type2) { 338 bool Equal(TypeHandle type1, TypeHandle type2) {
330 return 339 return
331 type1->Is(type2) && type2->Is(type1) && 340 type1->Is(type2) && type2->Is(type1) &&
332 Rep::IsBitset(type1) == Rep::IsBitset(type2) && 341 Rep::IsBitset(type1) == Rep::IsBitset(type2) &&
333 Rep::IsClass(type1) == Rep::IsClass(type2) && 342 Rep::IsClass(type1) == Rep::IsClass(type2) &&
334 Rep::IsConstant(type1) == Rep::IsConstant(type2) && 343 Rep::IsConstant(type1) == Rep::IsConstant(type2) &&
344 Rep::IsArray(type1) == Rep::IsArray(type2) &&
345 Rep::IsFunction(type1) == Rep::IsFunction(type2) &&
335 Rep::IsUnion(type1) == Rep::IsUnion(type2) && 346 Rep::IsUnion(type1) == Rep::IsUnion(type2) &&
336 type1->NumClasses() == type2->NumClasses() && 347 type1->NumClasses() == type2->NumClasses() &&
337 type1->NumConstants() == type2->NumConstants() && 348 type1->NumConstants() == type2->NumConstants() &&
338 (!Rep::IsBitset(type1) || 349 (!Rep::IsBitset(type1) ||
339 Rep::AsBitset(type1) == Rep::AsBitset(type2)) && 350 Rep::AsBitset(type1) == Rep::AsBitset(type2)) &&
340 (!Rep::IsClass(type1) || 351 (!Rep::IsClass(type1) ||
341 Rep::AsClass(type1) == Rep::AsClass(type2)) && 352 Rep::AsClass(type1) == Rep::AsClass(type2)) &&
342 (!Rep::IsConstant(type1) || 353 (!Rep::IsConstant(type1) ||
343 Rep::AsConstant(type1) == Rep::AsConstant(type2)) && 354 Rep::AsConstant(type1) == Rep::AsConstant(type2)) &&
344 (!Rep::IsUnion(type1) || 355 // TODO(rossberg): Check details of arrays, functions, bounds.
356 (!Rep::IsUnion(type1) ||
345 Rep::Length(Rep::AsUnion(type1)) == Rep::Length(Rep::AsUnion(type2))); 357 Rep::Length(Rep::AsUnion(type1)) == Rep::Length(Rep::AsUnion(type2)));
346 } 358 }
347 359
348 void CheckEqual(TypeHandle type1, TypeHandle type2) { 360 void CheckEqual(TypeHandle type1, TypeHandle type2) {
349 CHECK(Equal(type1, type2)); 361 CHECK(Equal(type1, type2));
350 } 362 }
351 363
352 void CheckSub(TypeHandle type1, TypeHandle type2) { 364 void CheckSub(TypeHandle type1, TypeHandle type2) {
353 CHECK(type1->Is(type2)); 365 CHECK(type1->Is(type2));
354 CHECK(!type2->Is(type1)); 366 CHECK(!type2->Is(type1));
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 Handle<i::Object> value = *vt; 674 Handle<i::Object> value = *vt;
663 TypeHandle type = *it; 675 TypeHandle type = *it;
664 TypeHandle const_type = T.Constant(value); 676 TypeHandle const_type = T.Constant(value);
665 TypeHandle nowof_type = T.NowOf(value); 677 TypeHandle nowof_type = T.NowOf(value);
666 CHECK(!const_type->Is(type) || 678 CHECK(!const_type->Is(type) ||
667 (nowof_type->Is(type) || type->Maybe(const_type))); 679 (nowof_type->Is(type) || type->Maybe(const_type)));
668 } 680 }
669 } 681 }
670 } 682 }
671 683
684 void Bounds() {
685 // Ordering: (T->BitsetGlb())->Is(T->BitsetLub())
686 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
687 TypeHandle type = *it;
688 TypeHandle glb = Type::BitsetType::New(type->BitsetGlb(), T.region());
689 TypeHandle lub = Type::BitsetType::New(type->BitsetLub(), T.region());
690 CHECK(glb->Is(lub));
691 }
692
693 // Lower bound: (T->BitsetGlb())->Is(T)
694 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
695 TypeHandle type = *it;
696 TypeHandle glb = Type::BitsetType::New(type->BitsetGlb(), T.region());
697 CHECK(glb->Is(type));
698 }
699
700 // Upper bound: T->Is(T->BitsetLub())
701 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
702 TypeHandle type = *it;
703 TypeHandle lub = Type::BitsetType::New(type->BitsetLub(), T.region());
704 CHECK(type->Is(lub));
705 }
706
707 // Inherent bound: (T->BitsetLub())->Is(T->InherentBitsetLub())
708 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
709 TypeHandle type = *it;
710 TypeHandle lub = Type::BitsetType::New(type->BitsetLub(), T.region());
711 TypeHandle inherent =
712 Type::BitsetType::New(type->InherentBitsetLub(), T.region());
713 CHECK(lub->Is(inherent));
714 }
715 }
716
672 void Is() { 717 void Is() {
673 // Least Element (Bottom): None->Is(T) 718 // Least Element (Bottom): None->Is(T)
674 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 719 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
675 TypeHandle type = *it; 720 TypeHandle type = *it;
676 CHECK(T.None->Is(type)); 721 CHECK(T.None->Is(type));
677 } 722 }
678 723
679 // Greatest Element (Top): T->Is(Any) 724 // Greatest Element (Top): T->Is(Any)
680 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 725 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
681 TypeHandle type = *it; 726 TypeHandle type = *it;
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 CheckSub(T.Intersect(T.AnyArray, T.Function), T.Representation); 1573 CheckSub(T.Intersect(T.AnyArray, T.Function), T.Representation);
1529 1574
1530 // Bitset-function 1575 // Bitset-function
1531 CheckEqual(T.Intersect(T.MethodFunction, T.Object), T.MethodFunction); 1576 CheckEqual(T.Intersect(T.MethodFunction, T.Object), T.MethodFunction);
1532 CheckSub(T.Intersect(T.NumberFunction1, T.Array), T.Representation); 1577 CheckSub(T.Intersect(T.NumberFunction1, T.Array), T.Representation);
1533 1578
1534 // Bitset-union 1579 // Bitset-union
1535 CheckEqual( 1580 CheckEqual(
1536 T.Intersect(T.Object, T.Union(T.ObjectConstant1, T.ObjectClass)), 1581 T.Intersect(T.Object, T.Union(T.ObjectConstant1, T.ObjectClass)),
1537 T.Union(T.ObjectConstant1, T.ObjectClass)); 1582 T.Union(T.ObjectConstant1, T.ObjectClass));
1538 CheckEqual( 1583 CHECK(
1539 T.Intersect(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number), 1584 !T.Intersect(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number)
1540 T.None); 1585 ->IsInhabited());
1541 1586
1542 // Class-constant 1587 // Class-constant
1543 CheckEqual(T.Intersect(T.ObjectConstant1, T.ObjectClass), T.None); 1588 TypeHandle NoneTaggedPtr = T.Intersect(T.TaggedPtr, T.Representation);
1544 CheckEqual(T.Intersect(T.ArrayClass, T.ObjectConstant2), T.None); 1589 CheckEqual(T.Intersect(T.ObjectConstant1, T.ObjectClass), NoneTaggedPtr);
1590 CheckEqual(T.Intersect(T.ArrayClass, T.ObjectConstant2), NoneTaggedPtr);
1545 1591
1546 // Array-union 1592 // Array-union
1547 CheckEqual( 1593 CheckEqual(
1548 T.Intersect(T.FloatArray, T.Union(T.FloatArray, T.ArrayClass)), 1594 T.Intersect(T.FloatArray, T.Union(T.FloatArray, T.ArrayClass)),
1549 T.FloatArray); 1595 T.FloatArray);
1550 CheckEqual( 1596 CheckEqual(
1551 T.Intersect(T.AnyArray, T.Union(T.Object, T.SmiConstant)), 1597 T.Intersect(T.AnyArray, T.Union(T.Object, T.SmiConstant)),
1552 T.AnyArray); 1598 T.AnyArray);
1553 CheckEqual( 1599 CHECK(
1554 T.Intersect(T.Union(T.AnyArray, T.ArrayConstant), T.FloatArray), 1600 !T.Intersect(T.Union(T.AnyArray, T.ArrayConstant), T.FloatArray)
1555 T.None); 1601 ->IsInhabited());
1556 1602
1557 // Function-union 1603 // Function-union
1558 CheckEqual( 1604 CheckEqual(
1559 T.Intersect(T.MethodFunction, T.Union(T.String, T.MethodFunction)), 1605 T.Intersect(T.MethodFunction, T.Union(T.String, T.MethodFunction)),
1560 T.MethodFunction); 1606 T.MethodFunction);
1561 CheckEqual( 1607 CheckEqual(
1562 T.Intersect(T.NumberFunction1, T.Union(T.Object, T.SmiConstant)), 1608 T.Intersect(T.NumberFunction1, T.Union(T.Object, T.SmiConstant)),
1563 T.NumberFunction1); 1609 T.NumberFunction1);
1564 CheckEqual( 1610 CHECK(
1565 T.Intersect(T.Union(T.MethodFunction, T.Name), T.NumberFunction2), 1611 !T.Intersect(T.Union(T.MethodFunction, T.Name), T.NumberFunction2)
1566 T.None); 1612 ->IsInhabited());
1567 1613
1568 // Class-union 1614 // Class-union
1569 CheckEqual( 1615 CheckEqual(
1570 T.Intersect(T.ArrayClass, T.Union(T.ObjectConstant2, T.ArrayClass)), 1616 T.Intersect(T.ArrayClass, T.Union(T.ObjectConstant2, T.ArrayClass)),
1571 T.ArrayClass); 1617 T.ArrayClass);
1572 CheckEqual( 1618 CheckEqual(
1573 T.Intersect(T.ArrayClass, T.Union(T.Object, T.SmiConstant)), 1619 T.Intersect(T.ArrayClass, T.Union(T.Object, T.SmiConstant)),
1574 T.ArrayClass); 1620 T.ArrayClass);
1575 CheckEqual( 1621 CHECK(
1576 T.Intersect(T.Union(T.ObjectClass, T.ArrayConstant), T.ArrayClass), 1622 !T.Intersect(T.Union(T.ObjectClass, T.ArrayConstant), T.ArrayClass)
1577 T.None); 1623 ->IsInhabited());
1578 1624
1579 // Constant-union 1625 // Constant-union
1580 CheckEqual( 1626 CheckEqual(
1581 T.Intersect( 1627 T.Intersect(
1582 T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)), 1628 T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)),
1583 T.ObjectConstant1); 1629 T.ObjectConstant1);
1584 CheckEqual( 1630 CheckEqual(
1585 T.Intersect(T.SmiConstant, T.Union(T.Number, T.ObjectConstant2)), 1631 T.Intersect(T.SmiConstant, T.Union(T.Number, T.ObjectConstant2)),
1586 T.SmiConstant); 1632 T.SmiConstant);
1587 CheckEqual( 1633 CHECK(
1588 T.Intersect( 1634 !T.Intersect(
1589 T.Union(T.ArrayConstant, T.ObjectClass), T.ObjectConstant1), 1635 T.Union(T.ArrayConstant, T.ObjectClass), T.ObjectConstant1)
1590 T.None); 1636 ->IsInhabited());
1591 1637
1592 // Union-union 1638 // Union-union
1593 CheckEqual( 1639 CheckEqual(
1594 T.Intersect( 1640 T.Intersect(
1595 T.Union(T.Number, T.ArrayClass), 1641 T.Union(T.Number, T.ArrayClass),
1596 T.Union(T.SignedSmall, T.Array)), 1642 T.Union(T.SignedSmall, T.Array)),
1597 T.Union(T.SignedSmall, T.ArrayClass)); 1643 T.Union(T.SignedSmall, T.ArrayClass));
1598 CheckEqual( 1644 CheckEqual(
1599 T.Intersect( 1645 T.Intersect(
1600 T.Union(T.Number, T.ObjectClass), 1646 T.Union(T.Number, T.ObjectClass),
1601 T.Union(T.Signed32, T.Array)), 1647 T.Union(T.Signed32, T.Array)),
1602 T.Signed32); 1648 T.Signed32);
1603 CheckEqual( 1649 CheckEqual(
1604 T.Intersect( 1650 T.Intersect(
1605 T.Union(T.ObjectConstant2, T.ObjectConstant1), 1651 T.Union(T.ObjectConstant2, T.ObjectConstant1),
1606 T.Union(T.ObjectConstant1, T.ObjectConstant2)), 1652 T.Union(T.ObjectConstant1, T.ObjectConstant2)),
1607 T.Union(T.ObjectConstant2, T.ObjectConstant1)); 1653 T.Union(T.ObjectConstant2, T.ObjectConstant1));
1608 CheckEqual( 1654 CheckEqual(
1609 T.Intersect( 1655 T.Intersect(
1610 T.Union( 1656 T.Union(
1611 T.Union(T.ObjectConstant2, T.ObjectConstant1), T.ArrayClass), 1657 T.Union(T.ObjectConstant2, T.ObjectConstant1), T.ArrayClass),
1612 T.Union( 1658 T.Union(
1613 T.ObjectConstant1, 1659 T.ObjectConstant1,
1614 T.Union(T.ArrayConstant, T.ObjectConstant2))), 1660 T.Union(T.ArrayConstant, T.ObjectConstant2))),
1615 T.Union(T.ObjectConstant2, T.ObjectConstant1)); 1661 T.Union(T.ObjectConstant2, T.ObjectConstant1));
1616 } 1662 }
1617 1663
1664 void Distributivity() {
1665 // Distributivity:
1666 // Union(T1, Intersect(T2, T3)) = Intersect(Union(T1, T2), Union(T1, T3))
1667 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1668 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1669 for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1670 TypeHandle type1 = *it1;
1671 TypeHandle type2 = *it2;
1672 TypeHandle type3 = *it3;
1673 TypeHandle union12 = T.Union(type1, type2);
1674 TypeHandle union13 = T.Union(type1, type3);
1675 TypeHandle intersect23 = T.Intersect(type2, type3);
1676 TypeHandle union1_23 = T.Union(type1, intersect23);
1677 TypeHandle intersect12_13 = T.Intersect(union12, union13);
1678 CHECK(Equal(union1_23, intersect12_13));
1679 }
1680 }
1681 }
1682
1683 // Distributivity:
1684 // Intersect(T1, Union(T2, T3)) = Union(Intersect(T1, T2), Intersect(T1,T3))
1685 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1686 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1687 for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1688 TypeHandle type1 = *it1;
1689 TypeHandle type2 = *it2;
1690 TypeHandle type3 = *it3;
1691 TypeHandle intersect12 = T.Intersect(type1, type2);
1692 TypeHandle intersect13 = T.Intersect(type1, type3);
1693 TypeHandle union23 = T.Union(type2, type3);
1694 TypeHandle intersect1_23 = T.Intersect(type1, union23);
1695 TypeHandle union12_13 = T.Union(intersect12, intersect13);
1696 CHECK(Equal(intersect1_23, union12_13));
1697 }
1698 }
1699 }
1700 }
1701
1618 template<class Type2, class TypeHandle2, class Region2, class Rep2> 1702 template<class Type2, class TypeHandle2, class Region2, class Rep2>
1619 void Convert() { 1703 void Convert() {
1620 Types<Type2, TypeHandle2, Region2> T2( 1704 Types<Type2, TypeHandle2, Region2> T2(
1621 Rep2::ToRegion(&zone, isolate), isolate); 1705 Rep2::ToRegion(&zone, isolate), isolate);
1622 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1706 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1623 TypeHandle type1 = *it; 1707 TypeHandle type1 = *it;
1624 TypeHandle2 type2 = T2.template Convert<Type>(type1); 1708 TypeHandle2 type2 = T2.template Convert<Type>(type1);
1625 TypeHandle type3 = T.template Convert<Type2>(type2); 1709 TypeHandle type3 = T.template Convert<Type2>(type2);
1626 CheckEqual(type1, type3); 1710 CheckEqual(type1, type3);
1627 } 1711 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1674 } 1758 }
1675 1759
1676 1760
1677 TEST(NowOf) { 1761 TEST(NowOf) {
1678 CcTest::InitializeVM(); 1762 CcTest::InitializeVM();
1679 ZoneTests().NowOf(); 1763 ZoneTests().NowOf();
1680 HeapTests().NowOf(); 1764 HeapTests().NowOf();
1681 } 1765 }
1682 1766
1683 1767
1768 TEST(Bounds) {
1769 CcTest::InitializeVM();
1770 ZoneTests().Bounds();
1771 HeapTests().Bounds();
1772 }
1773
1774
1684 TEST(Is) { 1775 TEST(Is) {
1685 CcTest::InitializeVM(); 1776 CcTest::InitializeVM();
1686 ZoneTests().Is(); 1777 ZoneTests().Is();
1687 HeapTests().Is(); 1778 HeapTests().Is();
1688 } 1779 }
1689 1780
1690 1781
1691 TEST(NowIs) { 1782 TEST(NowIs) {
1692 CcTest::InitializeVM(); 1783 CcTest::InitializeVM();
1693 ZoneTests().NowIs(); 1784 ZoneTests().NowIs();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1737 } 1828 }
1738 1829
1739 1830
1740 TEST(Intersect2) { 1831 TEST(Intersect2) {
1741 CcTest::InitializeVM(); 1832 CcTest::InitializeVM();
1742 ZoneTests().Intersect2(); 1833 ZoneTests().Intersect2();
1743 HeapTests().Intersect2(); 1834 HeapTests().Intersect2();
1744 } 1835 }
1745 1836
1746 1837
1838 TEST(Distributivity) {
1839 CcTest::InitializeVM();
1840 ZoneTests().Distributivity();
1841 HeapTests().Distributivity();
1842 }
1843
1844
1747 TEST(Convert) { 1845 TEST(Convert) {
1748 CcTest::InitializeVM(); 1846 CcTest::InitializeVM();
1749 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); 1847 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>();
1750 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); 1848 HeapTests().Convert<Type, Type*, Zone, ZoneRep>();
1751 } 1849 }
OLDNEW
« no previous file with comments | « src/types-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698