OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <vector> | 5 #include <vector> |
6 | 6 |
7 #include "src/hydrogen-types.h" | 7 #include "src/hydrogen-types.h" |
8 #include "src/isolate-inl.h" | 8 #include "src/isolate-inl.h" |
9 #include "src/types.h" | 9 #include "src/types.h" |
10 #include "test/cctest/cctest.h" | 10 #include "test/cctest/cctest.h" |
11 | 11 |
12 using namespace v8::internal; | 12 using namespace v8::internal; |
13 | 13 |
14 // Testing auxiliaries (breaking the Type abstraction). | 14 // Testing auxiliaries (breaking the Type abstraction). |
15 typedef uintptr_t bitset; | |
16 | |
17 struct ZoneRep { | 15 struct ZoneRep { |
18 typedef void* Struct; | 16 typedef void* Struct; |
19 | 17 |
20 static bool IsStruct(Type* t, int tag) { | 18 static bool IsStruct(Type* t, int tag) { |
21 return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag; | 19 return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag; |
22 } | 20 } |
23 static bool IsBitset(Type* t) { return reinterpret_cast<bitset>(t) & 1; } | 21 static bool IsBitset(Type* t) { return reinterpret_cast<intptr_t>(t) & 1; } |
24 static bool IsUnion(Type* t) { return IsStruct(t, 6); } | 22 static bool IsUnion(Type* t) { return IsStruct(t, 6); } |
25 | 23 |
26 static Struct* AsStruct(Type* t) { | 24 static Struct* AsStruct(Type* t) { |
27 return reinterpret_cast<Struct*>(t); | 25 return reinterpret_cast<Struct*>(t); |
28 } | 26 } |
29 static bitset AsBitset(Type* t) { | 27 static int AsBitset(Type* t) { |
30 return reinterpret_cast<bitset>(t) ^ 1u; | 28 return static_cast<int>(reinterpret_cast<intptr_t>(t) >> 1); |
31 } | 29 } |
32 static Struct* AsUnion(Type* t) { | 30 static Struct* AsUnion(Type* t) { |
33 return AsStruct(t); | 31 return AsStruct(t); |
34 } | 32 } |
35 static int Length(Struct* structured) { | 33 static int Length(Struct* structured) { |
36 return static_cast<int>(reinterpret_cast<intptr_t>(structured[1])); | 34 return static_cast<int>(reinterpret_cast<intptr_t>(structured[1])); |
37 } | 35 } |
38 | 36 |
39 static Zone* ToRegion(Zone* zone, Isolate* isolate) { return zone; } | 37 static Zone* ToRegion(Zone* zone, Isolate* isolate) { return zone; } |
40 | 38 |
41 struct BitsetType : Type::BitsetType { | 39 struct BitsetType : Type::BitsetType { |
42 using Type::BitsetType::New; | 40 using Type::BitsetType::New; |
43 using Type::BitsetType::Glb; | 41 using Type::BitsetType::Glb; |
44 using Type::BitsetType::Lub; | 42 using Type::BitsetType::Lub; |
45 using Type::BitsetType::InherentLub; | 43 using Type::BitsetType::InherentLub; |
46 }; | 44 }; |
47 }; | 45 }; |
48 | 46 |
49 | 47 |
50 struct HeapRep { | 48 struct HeapRep { |
51 typedef FixedArray Struct; | 49 typedef FixedArray Struct; |
52 | 50 |
53 static bool IsStruct(Handle<HeapType> t, int tag) { | 51 static bool IsStruct(Handle<HeapType> t, int tag) { |
54 return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag; | 52 return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag; |
55 } | 53 } |
56 static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); } | 54 static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); } |
57 static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 6); } | 55 static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 6); } |
58 | 56 |
59 static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); } | 57 static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); } |
60 static bitset AsBitset(Handle<HeapType> t) { | 58 static int AsBitset(Handle<HeapType> t) { return Smi::cast(*t)->value(); } |
61 return reinterpret_cast<bitset>(*t); | |
62 } | |
63 static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); } | 59 static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); } |
64 static int Length(Struct* structured) { return structured->length() - 1; } | 60 static int Length(Struct* structured) { return structured->length() - 1; } |
65 | 61 |
66 static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; } | 62 static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; } |
67 | 63 |
68 struct BitsetType : HeapType::BitsetType { | 64 struct BitsetType : HeapType::BitsetType { |
69 using HeapType::BitsetType::New; | 65 using HeapType::BitsetType::New; |
70 using HeapType::BitsetType::Glb; | 66 using HeapType::BitsetType::Glb; |
71 using HeapType::BitsetType::Lub; | 67 using HeapType::BitsetType::Lub; |
72 using HeapType::BitsetType::InherentLub; | 68 using HeapType::BitsetType::InherentLub; |
73 static bitset Glb(Handle<HeapType> type) { return Glb(*type); } | 69 static int Glb(Handle<HeapType> type) { return Glb(*type); } |
74 static bitset Lub(Handle<HeapType> type) { return Lub(*type); } | 70 static int Lub(Handle<HeapType> type) { return Lub(*type); } |
75 static bitset InherentLub(Handle<HeapType> type) { | 71 static int InherentLub(Handle<HeapType> type) { return InherentLub(*type); } |
76 return InherentLub(*type); | |
77 } | |
78 }; | 72 }; |
79 }; | 73 }; |
80 | 74 |
81 | 75 |
82 template<class Type, class TypeHandle, class Region> | 76 template<class Type, class TypeHandle, class Region> |
83 class Types { | 77 class Types { |
84 public: | 78 public: |
85 Types(Region* region, Isolate* isolate) | 79 Types(Region* region, Isolate* isolate) |
86 : region_(region), rng_(isolate->random_number_generator()) { | 80 : region_(region), rng_(isolate->random_number_generator()) { |
87 #define DECLARE_TYPE(name, value) \ | 81 #define DECLARE_TYPE(name, value) \ |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 } | 358 } |
365 | 359 |
366 void CheckEqual(TypeHandle type1, TypeHandle type2) { | 360 void CheckEqual(TypeHandle type1, TypeHandle type2) { |
367 CHECK(Equal(type1, type2)); | 361 CHECK(Equal(type1, type2)); |
368 } | 362 } |
369 | 363 |
370 void CheckSub(TypeHandle type1, TypeHandle type2) { | 364 void CheckSub(TypeHandle type1, TypeHandle type2) { |
371 CHECK(type1->Is(type2)); | 365 CHECK(type1->Is(type2)); |
372 CHECK(!type2->Is(type1)); | 366 CHECK(!type2->Is(type1)); |
373 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { | 367 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { |
374 CHECK(Rep::AsBitset(type1) != Rep::AsBitset(type2)); | 368 CHECK_NE(Rep::AsBitset(type1), Rep::AsBitset(type2)); |
375 } | 369 } |
376 } | 370 } |
377 | 371 |
378 void CheckUnordered(TypeHandle type1, TypeHandle type2) { | 372 void CheckUnordered(TypeHandle type1, TypeHandle type2) { |
379 CHECK(!type1->Is(type2)); | 373 CHECK(!type1->Is(type2)); |
380 CHECK(!type2->Is(type1)); | 374 CHECK(!type2->Is(type1)); |
381 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { | 375 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { |
382 CHECK(Rep::AsBitset(type1) != Rep::AsBitset(type2)); | 376 CHECK_NE(Rep::AsBitset(type1), Rep::AsBitset(type2)); |
383 } | 377 } |
384 } | 378 } |
385 | 379 |
386 void CheckOverlap(TypeHandle type1, TypeHandle type2, TypeHandle mask) { | 380 void CheckOverlap(TypeHandle type1, TypeHandle type2, TypeHandle mask) { |
387 CHECK(type1->Maybe(type2)); | 381 CHECK(type1->Maybe(type2)); |
388 CHECK(type2->Maybe(type1)); | 382 CHECK(type2->Maybe(type1)); |
389 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { | 383 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { |
390 CHECK(0 != | 384 CHECK_NE(0, |
391 (Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask))); | 385 Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask)); |
392 } | 386 } |
393 } | 387 } |
394 | 388 |
395 void CheckDisjoint(TypeHandle type1, TypeHandle type2, TypeHandle mask) { | 389 void CheckDisjoint(TypeHandle type1, TypeHandle type2, TypeHandle mask) { |
396 CHECK(!type1->Is(type2)); | 390 CHECK(!type1->Is(type2)); |
397 CHECK(!type2->Is(type1)); | 391 CHECK(!type2->Is(type1)); |
398 CHECK(!type1->Maybe(type2)); | 392 CHECK(!type1->Maybe(type2)); |
399 CHECK(!type2->Maybe(type1)); | 393 CHECK(!type2->Maybe(type1)); |
400 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { | 394 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { |
401 CHECK(0 == | 395 CHECK_EQ(0, |
402 (Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask))); | 396 Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask)); |
403 } | 397 } |
404 } | 398 } |
405 | 399 |
406 void Bitset() { | 400 void Bitset() { |
407 // None and Any are bitsets. | 401 // None and Any are bitsets. |
408 CHECK(this->IsBitset(T.None)); | 402 CHECK(this->IsBitset(T.None)); |
409 CHECK(this->IsBitset(T.Any)); | 403 CHECK(this->IsBitset(T.Any)); |
410 | 404 |
411 CHECK(bitset(0) == this->AsBitset(T.None)); | 405 CHECK_EQ(0, this->AsBitset(T.None)); |
412 printf("[BitSet] value=%p enum=%p bitset=%p any=%p this=%p any=%p\n", | 406 CHECK_EQ(-1, this->AsBitset(T.Any)); |
413 reinterpret_cast<void*>(bitset(0xfffffffeu)), | |
414 reinterpret_cast<void*>(bitset(HeapType::BitsetType::kAny)), | |
415 reinterpret_cast<void*>( | |
416 HeapTypeConfig::from_bitset(HeapType::BitsetType::kAny)), | |
417 reinterpret_cast<void*>(HeapType::Any()), | |
418 reinterpret_cast<void*>(this->AsBitset(T.Any)), | |
419 reinterpret_cast<void*>(*T.Any)); | |
420 CHECK(bitset(0xfffffffeu) == this->AsBitset(T.Any)); | |
421 | 407 |
422 // Union(T1, T2) is bitset for bitsets T1,T2 | 408 // Union(T1, T2) is bitset for bitsets T1,T2 |
423 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { | 409 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
424 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { | 410 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
425 TypeHandle type1 = *it1; | 411 TypeHandle type1 = *it1; |
426 TypeHandle type2 = *it2; | 412 TypeHandle type2 = *it2; |
427 TypeHandle union12 = T.Union(type1, type2); | 413 TypeHandle union12 = T.Union(type1, type2); |
428 CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) || | 414 CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) || |
429 this->IsBitset(union12)); | 415 this->IsBitset(union12)); |
430 } | 416 } |
(...skipping 21 matching lines...) Expand all Loading... |
452 } | 438 } |
453 } | 439 } |
454 | 440 |
455 // Union(T1, T2) is bitwise disjunction for bitsets T1,T2 | 441 // Union(T1, T2) is bitwise disjunction for bitsets T1,T2 |
456 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { | 442 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
457 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { | 443 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
458 TypeHandle type1 = *it1; | 444 TypeHandle type1 = *it1; |
459 TypeHandle type2 = *it2; | 445 TypeHandle type2 = *it2; |
460 TypeHandle union12 = T.Union(type1, type2); | 446 TypeHandle union12 = T.Union(type1, type2); |
461 if (this->IsBitset(type1) && this->IsBitset(type2)) { | 447 if (this->IsBitset(type1) && this->IsBitset(type2)) { |
462 CHECK( | 448 CHECK_EQ( |
463 (this->AsBitset(type1) | this->AsBitset(type2)) == | 449 this->AsBitset(type1) | this->AsBitset(type2), |
464 this->AsBitset(union12)); | 450 this->AsBitset(union12)); |
465 } | 451 } |
466 } | 452 } |
467 } | 453 } |
468 | 454 |
469 // Intersect(T1, T2) is bitwise conjunction for bitsets T1,T2 | 455 // Intersect(T1, T2) is bitwise conjunction for bitsets T1,T2 |
470 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { | 456 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
471 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { | 457 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
472 TypeHandle type1 = *it1; | 458 TypeHandle type1 = *it1; |
473 TypeHandle type2 = *it2; | 459 TypeHandle type2 = *it2; |
474 TypeHandle intersect12 = T.Intersect(type1, type2); | 460 TypeHandle intersect12 = T.Intersect(type1, type2); |
475 if (this->IsBitset(type1) && this->IsBitset(type2)) { | 461 if (this->IsBitset(type1) && this->IsBitset(type2)) { |
476 CHECK( | 462 CHECK_EQ( |
477 (this->AsBitset(type1) & this->AsBitset(type2)) == | 463 this->AsBitset(type1) & this->AsBitset(type2), |
478 this->AsBitset(intersect12)); | 464 this->AsBitset(intersect12)); |
479 } | 465 } |
480 } | 466 } |
481 } | 467 } |
482 } | 468 } |
483 | 469 |
484 void Class() { | 470 void Class() { |
485 // Constructor | 471 // Constructor |
486 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { | 472 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
487 Handle<i::Map> map = *mt; | 473 Handle<i::Map> map = *mt; |
(...skipping 1336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1824 } | 1810 } |
1825 } | 1811 } |
1826 }; | 1812 }; |
1827 | 1813 |
1828 typedef Tests<Type, Type*, Zone, ZoneRep> ZoneTests; | 1814 typedef Tests<Type, Type*, Zone, ZoneRep> ZoneTests; |
1829 typedef Tests<HeapType, Handle<HeapType>, Isolate, HeapRep> HeapTests; | 1815 typedef Tests<HeapType, Handle<HeapType>, Isolate, HeapRep> HeapTests; |
1830 | 1816 |
1831 | 1817 |
1832 TEST(BitsetType) { | 1818 TEST(BitsetType) { |
1833 CcTest::InitializeVM(); | 1819 CcTest::InitializeVM(); |
1834 // ZoneTests().Bitset(); | 1820 ZoneTests().Bitset(); |
1835 HeapTests().Bitset(); | 1821 HeapTests().Bitset(); |
1836 } | 1822 } |
1837 | 1823 |
1838 | 1824 |
1839 TEST(ClassType) { | 1825 TEST(ClassType) { |
1840 CcTest::InitializeVM(); | 1826 CcTest::InitializeVM(); |
1841 ZoneTests().Class(); | 1827 ZoneTests().Class(); |
1842 HeapTests().Class(); | 1828 HeapTests().Class(); |
1843 } | 1829 } |
1844 | 1830 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1976 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); | 1962 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); |
1977 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); | 1963 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); |
1978 } | 1964 } |
1979 | 1965 |
1980 | 1966 |
1981 TEST(HTypeFromType) { | 1967 TEST(HTypeFromType) { |
1982 CcTest::InitializeVM(); | 1968 CcTest::InitializeVM(); |
1983 ZoneTests().HTypeFromType(); | 1969 ZoneTests().HTypeFromType(); |
1984 HeapTests().HTypeFromType(); | 1970 HeapTests().HTypeFromType(); |
1985 } | 1971 } |
OLD | NEW |