1dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 26b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 36b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org// found in the LICENSE file. 4dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 5202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org#include <vector> 65b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-types.h" 86b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org#include "src/isolate-inl.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/types.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h" 11dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 12dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgusing namespace v8::internal; 13dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 14c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org// Testing auxiliaries (breaking the Type abstraction). 15d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.orgtypedef uint32_t bitset; 16d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org 17c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgstruct ZoneRep { 18c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org typedef void* Struct; 19c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 20c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static bool IsStruct(Type* t, int tag) { 21c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag; 22c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 23d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org static bool IsBitset(Type* t) { return reinterpret_cast<uintptr_t>(t) & 1; } 247c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org static bool IsUnion(Type* t) { return IsStruct(t, 6); } 25c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 26c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Struct* AsStruct(Type* t) { 27c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return reinterpret_cast<Struct*>(t); 28c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 29d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org static bitset AsBitset(Type* t) { 30d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org return static_cast<bitset>(reinterpret_cast<uintptr_t>(t) ^ 1u); 31c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 32c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Struct* AsUnion(Type* t) { 33c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return AsStruct(t); 34c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 35c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static int Length(Struct* structured) { 36c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return static_cast<int>(reinterpret_cast<intptr_t>(structured[1])); 37c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 38c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 39c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Zone* ToRegion(Zone* zone, Isolate* isolate) { return zone; } 40d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 41d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org struct BitsetType : Type::BitsetType { 42d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using Type::BitsetType::New; 43d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using Type::BitsetType::Glb; 44d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using Type::BitsetType::Lub; 45b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org using Type::BitsetType::IsInhabited; 46d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org }; 47c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org}; 48c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 49c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 50c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgstruct HeapRep { 51c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org typedef FixedArray Struct; 52c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 53c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static bool IsStruct(Handle<HeapType> t, int tag) { 54c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag; 55c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 56c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); } 577c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 6); } 58c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 59c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); } 60d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org static bitset AsBitset(Handle<HeapType> t) { 61d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org return static_cast<bitset>(reinterpret_cast<uintptr_t>(*t)); 62d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org } 63c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); } 64c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static int Length(Struct* structured) { return structured->length() - 1; } 65c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 66c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; } 67d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 68d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org struct BitsetType : HeapType::BitsetType { 69d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using HeapType::BitsetType::New; 70d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using HeapType::BitsetType::Glb; 71d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using HeapType::BitsetType::Lub; 72b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org using HeapType::BitsetType::IsInhabited; 73d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org static bitset Glb(Handle<HeapType> type) { return Glb(*type); } 74d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org static bitset Lub(Handle<HeapType> type) { return Lub(*type); } 75d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org }; 76c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org}; 77c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 78c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtemplate<class Type, class TypeHandle, class Region> 806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgclass Types { 816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org public: 826b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org Types(Region* region, Isolate* isolate) 836b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org : region_(region), rng_(isolate->random_number_generator()) { 84202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org #define DECLARE_TYPE(name, value) \ 85202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org name = Type::name(region); \ 86202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org types.push_back(name); 87b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PROPER_BITSET_TYPE_LIST(DECLARE_TYPE) 88202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org #undef DECLARE_TYPE 89202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 90b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org object_map = isolate->factory()->NewMap( 91b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org JS_OBJECT_TYPE, JSObject::kHeaderSize); 92b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org array_map = isolate->factory()->NewMap( 93b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org JS_ARRAY_TYPE, JSArray::kSize); 94b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org number_map = isolate->factory()->NewMap( 95b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org HEAP_NUMBER_TYPE, HeapNumber::kSize); 96202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org uninitialized_map = isolate->factory()->uninitialized_map(); 97202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ObjectClass = Type::Class(object_map, region); 98202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ArrayClass = Type::Class(array_map, region); 99b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org NumberClass = Type::Class(number_map, region); 100202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org UninitializedClass = Type::Class(uninitialized_map, region); 101202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 102202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org maps.push_back(object_map); 103202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org maps.push_back(array_map); 104202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org maps.push_back(uninitialized_map); 105202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapVector::iterator it = maps.begin(); it != maps.end(); ++it) { 106202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org types.push_back(Type::Class(*it, region)); 107202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 108202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org smi = handle(Smi::FromInt(666), isolate); 1106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org signed32 = isolate->factory()->NewHeapNumber(0x40000000); 1116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org object1 = isolate->factory()->NewJSObjectFromMap(object_map); 1126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org object2 = isolate->factory()->NewJSObjectFromMap(object_map); 1136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org array = isolate->factory()->NewJSArray(20); 114202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org uninitialized = isolate->factory()->uninitialized_value(); 1156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org SmiConstant = Type::Constant(smi, region); 1166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Signed32Constant = Type::Constant(signed32, region); 1176d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ObjectConstant1 = Type::Constant(object1, region); 1186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ObjectConstant2 = Type::Constant(object2, region); 119202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ArrayConstant = Type::Constant(array, region); 120202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org UninitializedConstant = Type::Constant(uninitialized, region); 121202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 122202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(smi); 123202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(signed32); 124202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(object1); 125202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(object2); 126202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(array); 127202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(uninitialized); 128202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueVector::iterator it = values.begin(); it != values.end(); ++it) { 129202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org types.push_back(Type::Constant(*it, region)); 1305b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 1315b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 132b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org integers.push_back(isolate->factory()->NewNumber(-V8_INFINITY)); 133b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org integers.push_back(isolate->factory()->NewNumber(+V8_INFINITY)); 134b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org integers.push_back(isolate->factory()->NewNumber(-rng_->NextInt(10))); 135b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org integers.push_back(isolate->factory()->NewNumber(+rng_->NextInt(10))); 1367c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org for (int i = 0; i < 10; ++i) { 137b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org double x = rng_->NextInt(); 138b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org integers.push_back(isolate->factory()->NewNumber(x)); 139b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org x *= rng_->NextInt(); 140b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (!IsMinusZero(x)) integers.push_back(isolate->factory()->NewNumber(x)); 1417c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org } 1427c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 1437e6132b924829c353864933f29124419916db550machenbach@chromium.org NumberArray = Type::Array(Number, region); 1449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org StringArray = Type::Array(String, region); 1459fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org AnyArray = Type::Array(Any, region); 1469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 1479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region); 1489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org NumberFunction1 = Type::Function(Number, Number, region); 1499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org NumberFunction2 = Type::Function(Number, Number, Number, region); 1509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org MethodFunction = Type::Function(String, Object, 0, region); 1519fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 1528640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org for (int i = 0; i < 30; ++i) { 153c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org types.push_back(Fuzz()); 154202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 1566d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Map> object_map; 1589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Map> array_map; 159b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Handle<i::Map> number_map; 1609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Map> uninitialized_map; 1619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 1629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Smi> smi; 1639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::HeapNumber> signed32; 1649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::JSObject> object1; 1659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::JSObject> object2; 1669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::JSArray> array; 1679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Oddball> uninitialized; 1689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 169202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org #define DECLARE_TYPE(name, value) TypeHandle name; 170202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org BITSET_TYPE_LIST(DECLARE_TYPE) 171202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org #undef DECLARE_TYPE 1726d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle ObjectClass; 1746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle ArrayClass; 175b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle NumberClass; 176202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle UninitializedClass; 1776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle SmiConstant; 1796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle Signed32Constant; 1806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle ObjectConstant1; 1816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle ObjectConstant2; 182202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle ArrayConstant; 183202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle UninitializedConstant; 1846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1857e6132b924829c353864933f29124419916db550machenbach@chromium.org TypeHandle NumberArray; 1869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle StringArray; 1879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle AnyArray; 1886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle SignedFunction1; 1909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle NumberFunction1; 1919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle NumberFunction2; 1929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle MethodFunction; 1936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 194202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef std::vector<TypeHandle> TypeVector; 195202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef std::vector<Handle<i::Map> > MapVector; 196202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef std::vector<Handle<i::Object> > ValueVector; 1977c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 198202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeVector types; 199202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org MapVector maps; 200202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ValueVector values; 201b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ValueVector integers; // "Integer" values used for range limits. 2028640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org 203202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle Of(Handle<i::Object> value) { 204202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org return Type::Of(value, region_); 205202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 206202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 207202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle NowOf(Handle<i::Object> value) { 208202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org return Type::NowOf(value, region_); 209202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 2105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 211b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle Class(Handle<i::Map> map) { 212b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return Type::Class(map, region_); 213b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 214b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 215202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle Constant(Handle<i::Object> value) { 216202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org return Type::Constant(value, region_); 2175b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 2185b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 219b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle Range(Handle<i::Object> min, Handle<i::Object> max) { 2207c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org return Type::Range(min, max, region_); 2217c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org } 2227c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 223b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle Context(TypeHandle outer) { 224b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return Type::Context(outer, region_); 2255b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 2265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 2279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Array1(TypeHandle element) { 2289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return Type::Array(element, region_); 2299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Function0(TypeHandle result, TypeHandle receiver) { 2329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return Type::Function(result, receiver, 0, region_); 2339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Function1(TypeHandle result, TypeHandle receiver, TypeHandle arg) { 2369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type = Type::Function(result, receiver, 1, region_); 2379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org type->AsFunction()->InitParameter(0, arg); 2389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return type; 2399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Function2(TypeHandle result, TypeHandle arg1, TypeHandle arg2) { 2429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return Type::Function(result, arg1, arg2, region_); 2439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle Union(TypeHandle t1, TypeHandle t2) { 2466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org return Type::Union(t1, t2, region_); 2476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 2486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle Intersect(TypeHandle t1, TypeHandle t2) { 2496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org return Type::Intersect(t1, t2, region_); 2506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 2516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 252af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org template<class Type2, class TypeHandle2> 253af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org TypeHandle Convert(TypeHandle2 t) { 254af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org return Type::template Convert<Type2>(t, region_); 255af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org } 256af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 2579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Random() { 2586b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org return types[rng_->NextInt(static_cast<int>(types.size()))]; 2599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 261b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle Fuzz(int depth = 4) { 2626b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org switch (rng_->NextInt(depth == 0 ? 3 : 20)) { 263c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org case 0: { // bitset 264c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int n = 0 265c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org #define COUNT_BITSET_TYPES(type, value) + 1 266b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PROPER_BITSET_TYPE_LIST(COUNT_BITSET_TYPES) 267c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org #undef COUNT_BITSET_TYPES 268c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org ; 2696b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org int i = rng_->NextInt(n); 270c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org #define PICK_BITSET_TYPE(type, value) \ 271c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (i-- == 0) return Type::type(region_); 272b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org PROPER_BITSET_TYPE_LIST(PICK_BITSET_TYPE) 273c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org #undef PICK_BITSET_TYPE 274c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org UNREACHABLE(); 275c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 276c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org case 1: { // class 2776b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org int i = rng_->NextInt(static_cast<int>(maps.size())); 278c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return Type::Class(maps[i], region_); 279c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 280c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org case 2: { // constant 2816b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org int i = rng_->NextInt(static_cast<int>(values.size())); 282c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return Type::Constant(values[i], region_); 283c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 284b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org case 3: { // range 285b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org int i = rng_->NextInt(static_cast<int>(integers.size())); 286b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org int j = rng_->NextInt(static_cast<int>(integers.size())); 287b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> min = integers[i]; 288b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> max = integers[j]; 289b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (min->Number() > max->Number()) std::swap(min, max); 290b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org return Type::Range(min, max, region_); 291b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 292b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org case 4: { // context 2936b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org int depth = rng_->NextInt(3); 2947e6132b924829c353864933f29124419916db550machenbach@chromium.org TypeHandle type = Type::Internal(region_); 2957e6132b924829c353864933f29124419916db550machenbach@chromium.org for (int i = 0; i < depth; ++i) type = Type::Context(type, region_); 2967e6132b924829c353864933f29124419916db550machenbach@chromium.org return type; 2977e6132b924829c353864933f29124419916db550machenbach@chromium.org } 298b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org case 5: { // array 2998496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle element = Fuzz(depth / 2); 3008496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org return Type::Array(element, region_); 3018496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org } 302b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org case 6: 303b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org case 7: { // function 3048496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle result = Fuzz(depth / 2); 3058496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle receiver = Fuzz(depth / 2); 3066b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org int arity = rng_->NextInt(3); 3078496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle type = Type::Function(result, receiver, arity, region_); 3089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < type->AsFunction()->Arity(); ++i) { 3099d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org TypeHandle parameter = Fuzz(depth / 2); 3108496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org type->AsFunction()->InitParameter(i, parameter); 3119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 3129d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org return type; 3139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 314c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org default: { // union 3156b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org int n = rng_->NextInt(10); 316c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = None; 317c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (int i = 0; i < n; ++i) { 3188496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle operand = Fuzz(depth - 1); 3198496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org type = Type::Union(type, operand, region_); 320c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 321c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return type; 322c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 323c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 324c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org UNREACHABLE(); 3256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 3266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 327d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Region* region() { return region_; } 328d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 329c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org private: 330c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Region* region_; 3316b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org v8::base::RandomNumberGenerator* rng_; 3326d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org}; 3331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 334e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 3356d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtemplate<class Type, class TypeHandle, class Region, class Rep> 3366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgstruct Tests : Rep { 337202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef Types<Type, TypeHandle, Region> TypesInstance; 338202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef typename TypesInstance::TypeVector::iterator TypeIterator; 339202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef typename TypesInstance::MapVector::iterator MapIterator; 340202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef typename TypesInstance::ValueVector::iterator ValueIterator; 341202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 3426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Isolate* isolate; 3436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HandleScope scope; 3446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Zone zone; 345202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypesInstance T; 3466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 3476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Tests() : 3486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org isolate(CcTest::i_isolate()), 3496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org scope(isolate), 3506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org zone(isolate), 3516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T(Rep::ToRegion(&zone, isolate), isolate) { 3521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 354c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org bool Equal(TypeHandle type1, TypeHandle type2) { 355c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return 3563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org type1->Equals(type2) && 357b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org this->IsBitset(type1) == this->IsBitset(type2) && 358b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org this->IsUnion(type1) == this->IsUnion(type2) && 359c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org type1->NumClasses() == type2->NumClasses() && 360c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org type1->NumConstants() == type2->NumConstants() && 361b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (!this->IsBitset(type1) || 362b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org this->AsBitset(type1) == this->AsBitset(type2)) && 363b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (!this->IsUnion(type1) || 364b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org this->Length(this->AsUnion(type1)) == 365b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org this->Length(this->AsUnion(type2))); 366c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 367c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 3684452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org void CheckEqual(TypeHandle type1, TypeHandle type2) { 369c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(Equal(type1, type2)); 3706d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 371e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 3724452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org void CheckSub(TypeHandle type1, TypeHandle type2) { 3736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(type1->Is(type2)); 3746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type2->Is(type1)); 375b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (this->IsBitset(type1) && this->IsBitset(type2)) { 376b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(this->AsBitset(type1) != this->AsBitset(type2)); 3776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 3781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 3804452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org void CheckUnordered(TypeHandle type1, TypeHandle type2) { 3816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type1->Is(type2)); 3826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type2->Is(type1)); 383b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (this->IsBitset(type1) && this->IsBitset(type2)) { 384b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(this->AsBitset(type1) != this->AsBitset(type2)); 3856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 3866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 387e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 388b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void CheckOverlap(TypeHandle type1, TypeHandle type2) { 3896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(type1->Maybe(type2)); 3906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(type2->Maybe(type1)); 3911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 393b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void CheckDisjoint(TypeHandle type1, TypeHandle type2) { 3946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type1->Is(type2)); 3956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type2->Is(type1)); 3966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type1->Maybe(type2)); 3976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type2->Maybe(type1)); 398b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 399b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 400b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void IsSomeType() { 401b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 402b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle t = *it; 403b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(1 == 404b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org this->IsBitset(t) + t->IsClass() + t->IsConstant() + t->IsRange() + 405b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org this->IsUnion(t) + t->IsArray() + t->IsFunction() + t->IsContext()); 4066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 4076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 4081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Bitset() { 410202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // None and Any are bitsets. 411bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org CHECK(this->IsBitset(T.None)); 412bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org CHECK(this->IsBitset(T.Any)); 413bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org 414d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org CHECK(bitset(0) == this->AsBitset(T.None)); 415d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org CHECK(bitset(0xfffffffeu) == this->AsBitset(T.Any)); 416202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 417c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Union(T1, T2) is bitset for bitsets T1,T2 418202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 419202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 420202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 421202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 422c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 423202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) || 424c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->IsBitset(union12)); 425202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 426202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 427202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 428c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Intersect(T1, T2) is bitset for bitsets T1,T2 429202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 430202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 431202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 432202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 433c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 434c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) || 435c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->IsBitset(intersect12)); 436c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 437c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 438c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 439c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Union(T1, T2) is bitset if T2 is bitset and T1->Is(T2) 440c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 441c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 442c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 443c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 444c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 445202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!(this->IsBitset(type2) && type1->Is(type2)) || 446c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->IsBitset(union12)); 447202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 448202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 449202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 450c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Union(T1, T2) is bitwise disjunction for bitsets T1,T2 451202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 452202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 453202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 454202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 455c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 456202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org if (this->IsBitset(type1) && this->IsBitset(type2)) { 457d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org CHECK( 458d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org (this->AsBitset(type1) | this->AsBitset(type2)) == 459c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->AsBitset(union12)); 460202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 461202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 462202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 463202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 464b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Intersect(T1, T2) is bitwise conjunction for bitsets T1,T2 (modulo None) 465202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 466202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 467202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 468202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 469c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 470202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org if (this->IsBitset(type1) && this->IsBitset(type2)) { 471b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org bitset bits = this->AsBitset(type1) & this->AsBitset(type2); 472d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org CHECK( 473b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (Rep::BitsetType::IsInhabited(bits) ? bits : 0) == 474c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->AsBitset(intersect12)); 475202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 476202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 477202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 478dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 479dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 4806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Class() { 481202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constructor 482202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 483202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 484c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = T.Class(map); 4853e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org CHECK(type->IsClass()); 486202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 487dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 488202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Map attribute 489202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 490202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 491c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = T.Class(map); 4929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(*map == *type->AsClass()->Map()); 493202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 494202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 495c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Functionality & Injectivity: Class(M1) = Class(M2) iff M1 = M2 496202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { 497202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { 498202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map1 = *mt1; 499202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map2 = *mt2; 500c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = T.Class(map1); 501c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = T.Class(map2); 502c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(Equal(type1, type2) == (*map1 == *map2)); 503202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 504202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 5056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 506dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 5076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Constant() { 508202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constructor 509202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 510202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 511c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = T.Constant(value); 5123e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org CHECK(type->IsConstant()); 513202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 514202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 515202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Value attribute 516202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 517202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 518c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = T.Constant(value); 5199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(*value == *type->AsConstant()->Value()); 520202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 521202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 5229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Functionality & Injectivity: Constant(V1) = Constant(V2) iff V1 = V2 523202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { 524202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { 525c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value1 = *vt1; 526c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value2 = *vt2; 527c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = T.Constant(value1); 528c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = T.Constant(value2); 529c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(Equal(type1, type2) == (*value1 == *value2)); 530202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 531202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 5327e6132b924829c353864933f29124419916db550machenbach@chromium.org 5337e6132b924829c353864933f29124419916db550machenbach@chromium.org // Typing of numbers 5347e6132b924829c353864933f29124419916db550machenbach@chromium.org Factory* fac = isolate->factory(); 5357e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0))->Is(T.UnsignedSmall)); 5367e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(1))->Is(T.UnsignedSmall)); 5377e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x3fffffff))->Is(T.UnsignedSmall)); 5387e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-1))->Is(T.OtherSignedSmall)); 5397e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x3fffffff))->Is(T.OtherSignedSmall)); 5407e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x40000000))->Is(T.OtherSignedSmall)); 5417e6132b924829c353864933f29124419916db550machenbach@chromium.org if (SmiValuesAre31Bits()) { 5427e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31)); 5437e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31)); 5447e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32)); 5457e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32)); 5467e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32)); 5477e6132b924829c353864933f29124419916db550machenbach@chromium.org } else { 5487e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(SmiValuesAre32Bits()); 5497e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.UnsignedSmall)); 5507e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.UnsignedSmall)); 5517e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31)); 5527e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31)); 5537e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSignedSmall)); 5547e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSignedSmall)); 5557e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSignedSmall)); 5567e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32)); 5577e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32)); 5587e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32)); 5597e6132b924829c353864933f29124419916db550machenbach@chromium.org } 5607e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x80000000u))->Is(T.OtherUnsigned32)); 5617e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0xffffffffu))->Is(T.OtherUnsigned32)); 5627e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0xffffffffu+1.0))->Is(T.OtherNumber)); 5637e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff-2.0))->Is(T.OtherNumber)); 5647e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0.1))->Is(T.OtherNumber)); 5657e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-10.1))->Is(T.OtherNumber)); 5667e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(10e60))->Is(T.OtherNumber)); 5677e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-1.0*0.0))->Is(T.MinusZero)); 5685de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org CHECK(T.Constant(fac->NewNumber(v8::base::OS::nan_value()))->Is(T.NaN)); 5697e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(V8_INFINITY))->Is(T.OtherNumber)); 5707e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-V8_INFINITY))->Is(T.OtherNumber)); 571202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 572202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 5737c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org void Range() { 5747c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org // Constructor 575b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator i = T.integers.begin(); i != T.integers.end(); ++i) { 576b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator j = T.integers.begin(); j != T.integers.end(); ++j) { 577b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> min = *i; 578b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> max = *j; 579b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (min->Number() > max->Number()) std::swap(min, max); 5807c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org TypeHandle type = T.Range(min, max); 5813e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org CHECK(type->IsRange()); 5827c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org } 5837c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org } 5847c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 5857c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org // Range attributes 586b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator i = T.integers.begin(); i != T.integers.end(); ++i) { 587b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator j = T.integers.begin(); j != T.integers.end(); ++j) { 588b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> min = *i; 589b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> max = *j; 590b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (min->Number() > max->Number()) std::swap(min, max); 5917c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org TypeHandle type = T.Range(min, max); 592b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(*min == *type->AsRange()->Min()); 593b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(*max == *type->AsRange()->Max()); 594b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 595b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 596b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 597b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Functionality & Injectivity: 598b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Range(min1, max1) = Range(min2, max2) <=> min1 = min2 /\ max1 = max2 599b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator i1 = T.integers.begin(); 600b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i1 != T.integers.end(); ++i1) { 601b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator j1 = T.integers.begin(); 602b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org j1 != T.integers.end(); ++j1) { 603b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator i2 = T.integers.begin(); 604b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i2 != T.integers.end(); ++i2) { 605b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator j2 = T.integers.begin(); 606b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org j2 != T.integers.end(); ++j2) { 607b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> min1 = *i1; 608b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> max1 = *j1; 609b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> min2 = *i2; 610b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> max2 = *j2; 611b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (min1->Number() > max1->Number()) std::swap(min1, max1); 612b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (min2->Number() > max2->Number()) std::swap(min2, max2); 613b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = T.Range(min1, max1); 614b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = T.Range(min2, max2); 615b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(Equal(type1, type2) == (*min1 == *min2 && *max1 == *max2)); 616b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 617b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 618b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 619b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 6207c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org } 6217c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 6229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void Array() { 6239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Constructor 6249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6259fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type = T.Random(); 6269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle array = T.Array1(type); 6273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org CHECK(array->IsArray()); 6289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Attributes 6319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type = T.Random(); 6339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle array = T.Array1(type); 6349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type, array->AsArray()->Element()); 6359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Functionality & Injectivity: Array(T1) = Array(T2) iff T1 = T2 6389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int j = 0; j < 20; ++j) { 6409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type1 = T.Random(); 6419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type2 = T.Random(); 6429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle array1 = T.Array1(type1); 6439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle array2 = T.Array1(type2); 6449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(array1, array2) == Equal(type1, type2)); 6459fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void Function() { 6509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Constructors 6519fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int j = 0; j < 20; ++j) { 6539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int k = 0; k < 20; ++k) { 6549fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type1 = T.Random(); 6559fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type2 = T.Random(); 6569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type3 = T.Random(); 6579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function0 = T.Function0(type1, type2); 6589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function1 = T.Function1(type1, type2, type3); 6599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function2 = T.Function2(type1, type2, type3); 6609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(function0->IsFunction()); 6619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(function1->IsFunction()); 6629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(function2->IsFunction()); 6639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Attributes 6689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int j = 0; j < 20; ++j) { 6709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int k = 0; k < 20; ++k) { 6719fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type1 = T.Random(); 6729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type2 = T.Random(); 6739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type3 = T.Random(); 6749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function0 = T.Function0(type1, type2); 6759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function1 = T.Function1(type1, type2, type3); 6769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function2 = T.Function2(type1, type2, type3); 6779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK_EQ(0, function0->AsFunction()->Arity()); 6789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK_EQ(1, function1->AsFunction()->Arity()); 6799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK_EQ(2, function2->AsFunction()->Arity()); 6809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type1, function0->AsFunction()->Result()); 6819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type1, function1->AsFunction()->Result()); 6829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type1, function2->AsFunction()->Result()); 6839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type2, function0->AsFunction()->Receiver()); 6849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type2, function1->AsFunction()->Receiver()); 6859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(T.Any, function2->AsFunction()->Receiver()); 6869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type3, function1->AsFunction()->Parameter(0)); 6879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type2, function2->AsFunction()->Parameter(0)); 6889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type3, function2->AsFunction()->Parameter(1)); 6899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Functionality & Injectivity: Function(Ts1) = Function(Ts2) iff Ts1 = Ts2 6949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int j = 0; j < 20; ++j) { 6969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int k = 0; k < 20; ++k) { 6979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type1 = T.Random(); 6989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type2 = T.Random(); 6999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type3 = T.Random(); 7009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function01 = T.Function0(type1, type2); 7019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function02 = T.Function0(type1, type3); 7029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function03 = T.Function0(type3, type2); 7039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function11 = T.Function1(type1, type2, type2); 7049fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function12 = T.Function1(type1, type2, type3); 7059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function21 = T.Function2(type1, type2, type2); 7069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function22 = T.Function2(type1, type2, type3); 7079fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function23 = T.Function2(type1, type3, type2); 7089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function01, function02) == Equal(type2, type3)); 7099fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function01, function03) == Equal(type1, type3)); 7109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function11, function12) == Equal(type2, type3)); 7119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function21, function22) == Equal(type2, type3)); 7129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function21, function23) == Equal(type2, type3)); 7139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 7149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 7159fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 7169fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 7179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 718202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org void Of() { 719c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->Is(Of(V)) 720202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 721202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 722c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 723c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle of_type = T.Of(value); 724c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type->Is(of_type)); 725202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 726202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 727b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // If Of(V)->Is(T), then Constant(V)->Is(T) 728202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 729202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 730202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 731202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 732c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 733c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle of_type = T.Of(value); 734b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(!of_type->Is(type) || const_type->Is(type)); 735b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 736b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 737b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 738b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // If Constant(V)->Is(T), then Of(V)->Is(T) or T->Maybe(Constant(V)) 739b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 740b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 741b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Handle<i::Object> value = *vt; 742b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type = *it; 743b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 744b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle of_type = T.Of(value); 745b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(!const_type->Is(type) || 746b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org of_type->Is(type) || type->Maybe(const_type)); 747202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 748202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 749202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 750202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 751202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org void NowOf() { 752c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->NowIs(NowOf(V)) 753202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 754202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 755c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 756c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.NowOf(value); 757c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type->NowIs(nowof_type)); 758202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 759202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 760c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // NowOf(V)->Is(Of(V)) 761202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 762202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 763c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.NowOf(value); 764c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle of_type = T.Of(value); 765c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(nowof_type->Is(of_type)); 766202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 767202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 768b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // If NowOf(V)->NowIs(T), then Constant(V)->NowIs(T) 769b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 770b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 771b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Handle<i::Object> value = *vt; 772b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type = *it; 773b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 774b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle nowof_type = T.NowOf(value); 775b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(!nowof_type->NowIs(type) || const_type->NowIs(type)); 776b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 777b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 778b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 779b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // If Constant(V)->NowIs(T), 780b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // then NowOf(V)->NowIs(T) or T->Maybe(Constant(V)) 781202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 782202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 783202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 784202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 785c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 786c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.NowOf(value); 787b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(!const_type->NowIs(type) || 788b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org nowof_type->NowIs(type) || type->Maybe(const_type)); 789202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 790202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 791202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 792b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // If Constant(V)->Is(T), 793b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // then NowOf(V)->Is(T) or T->Maybe(Constant(V)) 794202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 795202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 796202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 797202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 798c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 799c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.NowOf(value); 800c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!const_type->Is(type) || 801b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org nowof_type->Is(type) || type->Maybe(const_type)); 802202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 803202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 8042efc3e46d2de48d8859520ee7fe035c02108509bmstarzinger@chromium.org } 8056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 806b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void BitsetGlb() { 807b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Lower: (T->BitsetGlb())->Is(T) 808d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 809d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type = *it; 810d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle glb = 811d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region()); 812b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(glb->Is(type)); 813d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 814d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 815b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Greatest: If T1->IsBitset() and T1->Is(T2), then T1->Is(T2->BitsetGlb()) 816b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 817b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 818b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = *it1; 819b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = *it2; 820b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle glb2 = 821b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Glb(type2), T.region()); 822b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(!this->IsBitset(type1) || !type1->Is(type2) || type1->Is(glb2)); 823b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 824b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 825b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 826b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Monotonicity: T1->Is(T2) implies (T1->BitsetGlb())->Is(T2->BitsetGlb()) 827b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 828b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 829b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = *it1; 830b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = *it2; 831b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle glb1 = 832b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Glb(type1), T.region()); 833b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle glb2 = 834b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Glb(type2), T.region()); 835b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(!type1->Is(type2) || glb1->Is(glb2)); 836b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 837d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 838b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 839d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 840b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void BitsetLub() { 841b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Upper: T->Is(T->BitsetLub()) 842d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 843d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type = *it; 844d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle lub = 845d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Lub(type), T.region()); 846d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(type->Is(lub)); 847d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 848d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 849b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Least: If T2->IsBitset() and T1->Is(T2), then (T1->BitsetLub())->Is(T2) 850b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 851b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 852b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = *it1; 853b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = *it2; 854b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle lub1 = 855b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Lub(type1), T.region()); 856b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(!this->IsBitset(type2) || !type1->Is(type2) || lub1->Is(type2)); 857b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 858b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 859b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 860b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Monotonicity: T1->Is(T2) implies (T1->BitsetLub())->Is(T2->BitsetLub()) 861b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 862b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 863b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = *it1; 864b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = *it2; 865b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle lub1 = 866b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Lub(type1), T.region()); 867b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle lub2 = 868b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Lub(type2), T.region()); 869b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(!type1->Is(type2) || lub1->Is(lub2)); 870b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 871d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 872d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 873d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 8746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Is() { 875c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Least Element (Bottom): None->Is(T) 8765b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 8775b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 878c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(T.None->Is(type)); 8795b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8805b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 881c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Greatest Element (Top): T->Is(Any) 8825b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 8835b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 884c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->Is(T.Any)); 8855b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8865b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 887c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Bottom Uniqueness: T->Is(None) implies T = None 8885b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 8895b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 890c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (type->Is(T.None)) CheckEqual(type, T.None); 8915b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8925b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 893c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Top Uniqueness: Any->Is(T) implies T = Any 8945b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 8955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 896c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (T.Any->Is(type)) CheckEqual(type, T.Any); 8975b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8985b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 899c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Reflexivity: T->Is(T) 9005b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 9015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 9025b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CHECK(type->Is(type)); 9035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 905c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Transitivity: T1->Is(T2) and T2->Is(T3) implies T1->Is(T3) 9065b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 9075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 9085b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 9095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 9105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 9115b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type3 = *it3; 912202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!(type1->Is(type2) && type2->Is(type3)) || type1->Is(type3)); 9135b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9145b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9155b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 917c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Antisymmetry: T1->Is(T2) and T2->Is(T1) iff T1 = T2 918c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 919c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 920c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 921c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 922c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK((type1->Is(type2) && type2->Is(type1)) == Equal(type1, type2)); 923c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 924c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 925c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 926b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Class(M1)->Is(Class(M2)) iff M1 = M2 927b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { 928b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { 929b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Handle<i::Map> map1 = *mt1; 930b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org Handle<i::Map> map2 = *mt2; 931b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle class_type1 = T.Class(map1); 932b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle class_type2 = T.Class(map2); 933b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(class_type1->Is(class_type2) == (*map1 == *map2)); 934b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 935b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 936b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 937202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constant(V1)->Is(Constant(V2)) iff V1 = V2 938202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { 939202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { 940c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value1 = *vt1; 941c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value2 = *vt2; 942c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type1 = T.Constant(value1); 943c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type2 = T.Constant(value2); 944c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type1->Is(const_type2) == (*value1 == *value2)); 945202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 946202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 947202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 948b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Range(min1, max1)->Is(Range(min2, max2)) iff 949b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // min1 >= min2 /\ max1 <= max2 950b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator i1 = T.integers.begin(); 951b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i1 != T.integers.end(); ++i1) { 952b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator j1 = T.integers.begin(); 953b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org j1 != T.integers.end(); ++j1) { 954b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator i2 = T.integers.begin(); 955b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i2 != T.integers.end(); ++i2) { 956b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (ValueIterator j2 = T.integers.begin(); 957b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org j2 != T.integers.end(); ++j2) { 958b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> min1 = *i1; 959b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> max1 = *j1; 960b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> min2 = *i2; 961b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org i::Handle<i::Object> max2 = *j2; 962b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (min1->Number() > max1->Number()) std::swap(min1, max1); 963b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org if (min2->Number() > max2->Number()) std::swap(min2, max2); 964b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = T.Range(min1, max1); 965b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = T.Range(min2, max2); 966b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(type1->Is(type2) == 967b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (min2->Number() <= min1->Number() && 968b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org max1->Number() <= max2->Number())); 969b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 970b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 971202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 972202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 973202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 974b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Context(T1)->Is(Context(T2)) iff T1 = T2 975b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 976b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 977b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle outer1 = *it1; 978b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle outer2 = *it2; 979b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = T.Context(outer1); 980b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = T.Context(outer2); 981b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(type1->Is(type2) == outer1->Equals(outer2)); 982202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 983202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 984202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 985b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Array(T1)->Is(Array(T2)) iff T1 = T2 986b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 987b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 988b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle element1 = *it1; 989b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle element2 = *it2; 990b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = T.Array1(element1); 991b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = T.Array1(element2); 992b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(type1->Is(type2) == element1->Equals(element2)); 993b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 994b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 995b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 996b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // Function0(S1, T1)->Is(Function0(S2, T2)) iff S1 = S2 and T1 = T2 997b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator i = T.types.begin(); i != T.types.end(); ++i) { 998b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator j = T.types.begin(); j != T.types.end(); ++j) { 999b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle result1 = *i; 1000b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle receiver1 = *j; 1001b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = T.Function0(result1, receiver1); 1002b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle result2 = T.Random(); 1003b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle receiver2 = T.Random(); 1004b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = T.Function0(result2, receiver2); 1005b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(type1->Is(type2) == 1006b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (result1->Equals(result2) && receiver1->Equals(receiver2))); 1007b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 1008b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 1009b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 1010b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // (In-)Compatibilities. 1011b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator i = T.types.begin(); i != T.types.end(); ++i) { 1012b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org for (TypeIterator j = T.types.begin(); j != T.types.end(); ++j) { 1013b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type1 = *i; 1014b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org TypeHandle type2 = *j; 1015b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(!type1->Is(type2) || this->IsBitset(type2) || 1016b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org this->IsUnion(type2) || this->IsUnion(type1) || 1017b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (type1->IsClass() && type2->IsClass()) || 1018b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (type1->IsConstant() && type2->IsConstant()) || 1019b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (type1->IsConstant() && type2->IsRange()) || 1020b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (type1->IsRange() && type2->IsRange()) || 1021b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (type1->IsContext() && type2->IsContext()) || 1022b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (type1->IsArray() && type2->IsArray()) || 1023b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org (type1->IsFunction() && type2->IsFunction()) || 1024b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org type1->Equals(T.None)); 1025202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1026202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 10276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1028202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Basic types 10296d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Boolean, T.Null); 10306d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Undefined, T.Null); 10316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Boolean, T.Undefined); 10326d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 10334452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub(T.SignedSmall, T.Number); 10346d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Signed32, T.Number); 10354452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub(T.SignedSmall, T.Signed32); 10367e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckUnordered(T.SignedSmall, T.MinusZero); 10377e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckUnordered(T.Signed32, T.Unsigned32); 10386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 10396d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.UniqueName, T.Name); 10406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.String, T.Name); 10416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.InternalizedString, T.String); 10426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.InternalizedString, T.UniqueName); 10436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.InternalizedString, T.Name); 10446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Symbol, T.UniqueName); 10456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Symbol, T.Name); 10466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.String, T.UniqueName); 10476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.String, T.Symbol); 10486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.InternalizedString, T.Symbol); 10496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 10506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Object, T.Receiver); 10516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Array, T.Object); 10526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Function, T.Object); 10536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Proxy, T.Receiver); 10546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Object, T.Proxy); 10556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Array, T.Function); 10566d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1057202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Structural types 10586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.ObjectClass, T.Object); 10596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.ArrayClass, T.Object); 10609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.ArrayClass, T.Array); 1061c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckSub(T.UninitializedClass, T.Internal); 10626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectClass, T.ArrayClass); 1063c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.UninitializedClass, T.Null); 1064c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.UninitializedClass, T.Undefined); 10656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 10664452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub(T.SmiConstant, T.SignedSmall); 10676d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.SmiConstant, T.Signed32); 10686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.SmiConstant, T.Number); 10696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.ObjectConstant1, T.Object); 10706d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.ObjectConstant2, T.Object); 1071202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckSub(T.ArrayConstant, T.Object); 1072202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckSub(T.ArrayConstant, T.Array); 1073c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckSub(T.UninitializedConstant, T.Internal); 10746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant1, T.ObjectConstant2); 1075202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckUnordered(T.ObjectConstant1, T.ArrayConstant); 1076c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.UninitializedConstant, T.Null); 1077c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.UninitializedConstant, T.Undefined); 10786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 10796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant1, T.ObjectClass); 10806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant2, T.ObjectClass); 10816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant1, T.ArrayClass); 10826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant2, T.ArrayClass); 1083202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckUnordered(T.ArrayConstant, T.ObjectClass); 10849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 10857e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckSub(T.NumberArray, T.Array); 10867e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckSub(T.NumberArray, T.Object); 10879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.StringArray, T.AnyArray); 10889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 10899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.MethodFunction, T.Function); 10909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.NumberFunction1, T.Object); 10919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.SignedFunction1, T.NumberFunction1); 10929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.NumberFunction1, T.NumberFunction2); 10931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 1094dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 10955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org void NowIs() { 1096c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Least Element (Bottom): None->NowIs(T) 10975b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 10985b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 1099c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(T.None->NowIs(type)); 11005b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1102c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Greatest Element (Top): T->NowIs(Any) 11035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 11045b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 1105c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->NowIs(T.Any)); 11065b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1108c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Bottom Uniqueness: T->NowIs(None) implies T = None 11095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 11105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 1111c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (type->NowIs(T.None)) CheckEqual(type, T.None); 11125b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11135b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1114c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Top Uniqueness: Any->NowIs(T) implies T = Any 11155b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 11165b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 1117c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (T.Any->NowIs(type)) CheckEqual(type, T.Any); 11185b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11195b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1120c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Reflexivity: T->NowIs(T) 11215b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 11225b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 11235b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CHECK(type->NowIs(type)); 11245b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11255b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1126c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Transitivity: T1->NowIs(T2) and T2->NowIs(T3) implies T1->NowIs(T3) 11275b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 11285b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 11295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 11305b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 11315b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 11325b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type3 = *it3; 1133c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->NowIs(type2) && type2->NowIs(type3)) || 11345b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org type1->NowIs(type3)); 11355b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11375b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11385b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1139c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Antisymmetry: T1->NowIs(T2) and T2->NowIs(T1) iff T1 = T2 1140c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1141c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1142c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1143c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1144c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK((type1->NowIs(type2) && type2->NowIs(type1)) == 1145c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Equal(type1, type2)); 1146c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1147c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1148c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1149c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T1->Is(T2) implies T1->NowIs(T2) 11505b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 11515b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 11525b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 11535b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 11545b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CHECK(!type1->Is(type2) || type1->NowIs(type2)); 11555b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11565b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11575b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1158202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constant(V1)->NowIs(Constant(V2)) iff V1 = V2 1159202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { 1160202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { 1161c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value1 = *vt1; 1162c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value2 = *vt2; 1163c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type1 = T.Constant(value1); 1164c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type2 = T.Constant(value2); 1165c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type1->NowIs(const_type2) == (*value1 == *value2)); 1166202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1167202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1168202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1169202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Class(M1)->NowIs(Class(M2)) iff M1 = M2 1170202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { 1171202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { 1172202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map1 = *mt1; 1173202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map2 = *mt2; 1174c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type1 = T.Class(map1); 1175c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type2 = T.Class(map2); 1176c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(class_type1->NowIs(class_type2) == (*map1 == *map2)); 1177202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1178202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1179202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1180202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constant(V)->NowIs(Class(M)) iff V has map M 1181202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 1182202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1183202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 1184202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1185c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1186c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 1187202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK((value->IsHeapObject() && 1188202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org i::HeapObject::cast(*value)->map() == *map) 1189c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org == const_type->NowIs(class_type)); 1190202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1191202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1192202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1193c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Class(M)->NowIs(Constant(V)) never 1194202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 1195202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1196202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 1197202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1198c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1199c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 1200c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!class_type->NowIs(const_type)); 1201202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1202202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 12035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 12045b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 12055b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org void Contains() { 1206c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T->Contains(V) iff Constant(V)->Is(T) 1207202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1208202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1209202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1210202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1211c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1212c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->Contains(value) == const_type->Is(type)); 1213202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1214202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1215202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1216202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1217202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org void NowContains() { 1218c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T->NowContains(V) iff Constant(V)->NowIs(T) 1219202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1220202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1221202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1222202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1223c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1224c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->NowContains(value) == const_type->NowIs(type)); 1225202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1226202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1227202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1228c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T->Contains(V) implies T->NowContains(V) 1229202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1230202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1231202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1232202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1233202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!type->Contains(value) || type->NowContains(value)); 12345b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 12355b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 12365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1237c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // NowOf(V)->Is(T) implies T->NowContains(V) 12385b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1239202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 12405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 1241202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1242c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.Of(value); 1243c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!nowof_type->NowIs(type) || type->NowContains(value)); 1244202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1245202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 12465b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 12475b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 12486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Maybe() { 1249202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // T->Maybe(Any) iff T inhabited 1250202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1251202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1252202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(type->Maybe(T.Any) == type->IsInhabited()); 1253202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1254202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1255202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // T->Maybe(None) never 1256202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1257202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1258202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!type->Maybe(T.None)); 1259202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1260202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1261c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Reflexivity upto Inhabitation: T->Maybe(T) iff T inhabited 1262c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1263c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1264c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->Maybe(type) == type->IsInhabited()); 1265c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1266c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1267c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Symmetry: T1->Maybe(T2) iff T2->Maybe(T1) 12685b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 12695b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 12705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 12715b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 12725b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CHECK(type1->Maybe(type2) == type2->Maybe(type1)); 12735b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 12745b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 12755b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1276c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T1->Maybe(T2) implies T1, T2 inhabited 12775b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 12785b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 12795b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 12805b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 1281202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!type1->Maybe(type2) || 1282202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org (type1->IsInhabited() && type2->IsInhabited())); 1283202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1284202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1285202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1286196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // T1->Maybe(T2) implies Intersect(T1, T2) inhabited 1287c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1288c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1289c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1290c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1291c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1292196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org CHECK(!type1->Maybe(type2) || intersect12->IsInhabited()); 1293c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1294c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1295c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1296c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T1->Is(T2) and T1 inhabited implies T1->Maybe(T2) 1297202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1298202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1299202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 1300202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 1301202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!(type1->Is(type2) && type1->IsInhabited()) || 1302202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org type1->Maybe(type2)); 1303202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1304202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1305202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1306202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constant(V1)->Maybe(Constant(V2)) iff V1 = V2 1307202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { 1308202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { 1309c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value1 = *vt1; 1310c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value2 = *vt2; 1311c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type1 = T.Constant(value1); 1312c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type2 = T.Constant(value2); 1313c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type1->Maybe(const_type2) == (*value1 == *value2)); 1314202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1315202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1316202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1317202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Class(M1)->Maybe(Class(M2)) iff M1 = M2 1318202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { 1319202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { 1320202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map1 = *mt1; 1321202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map2 = *mt2; 1322c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type1 = T.Class(map1); 1323c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type2 = T.Class(map2); 1324c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(class_type1->Maybe(class_type2) == (*map1 == *map2)); 13255b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 13265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 13275b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1328c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->Maybe(Class(M)) never 1329b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold! 1330b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1331202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 1332202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1333202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 1334202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1335c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1336c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 1337c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!const_type->Maybe(class_type)); 1338202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1339202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1340b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 13414452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 1342c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Class(M)->Maybe(Constant(V)) never 1343b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold! 1344b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1345202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 1346202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1347202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 1348202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1349c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1350c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 1351c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!class_type->Maybe(const_type)); 1352202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1353202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1354b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 1355202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1356202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Basic types 1357b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Boolean, T.Null); 1358b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Undefined, T.Null); 1359b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Boolean, T.Undefined); 1360b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.SignedSmall, T.Number); 1361b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.NaN, T.Number); 1362b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Signed32, T.NaN); 1363b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.UniqueName, T.Name); 1364b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.String, T.Name); 1365b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.InternalizedString, T.String); 1366b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.InternalizedString, T.UniqueName); 1367b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.InternalizedString, T.Name); 1368b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Symbol, T.UniqueName); 1369b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Symbol, T.Name); 1370b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.String, T.UniqueName); 1371b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.String, T.Symbol); 1372b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.InternalizedString, T.Symbol); 1373b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Object, T.Receiver); 1374b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Array, T.Object); 1375b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Function, T.Object); 1376b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Proxy, T.Receiver); 1377b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Object, T.Proxy); 1378b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Array, T.Function); 13794452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 1380202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Structural types 1381b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ObjectClass, T.Object); 1382b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ArrayClass, T.Object); 1383b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ObjectClass, T.ObjectClass); 1384b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ArrayClass, T.ArrayClass); 1385b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.ObjectClass, T.ArrayClass); 1386b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.SmiConstant, T.SignedSmall); 1387b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.SmiConstant, T.Signed32); 1388b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.SmiConstant, T.Number); 1389b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ObjectConstant1, T.Object); 1390b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ObjectConstant2, T.Object); 1391b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ArrayConstant, T.Object); 1392b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ArrayConstant, T.Array); 1393b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ObjectConstant1, T.ObjectConstant1); 1394b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.ObjectConstant1, T.ObjectConstant2); 1395b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.ObjectConstant1, T.ArrayConstant); 1396b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.ObjectConstant1, T.ArrayClass); 1397b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.ObjectConstant2, T.ArrayClass); 1398b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.ArrayConstant, T.ObjectClass); 1399b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.NumberArray, T.Array); 1400b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.NumberArray, T.AnyArray); 1401b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.NumberArray, T.StringArray); 1402b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.MethodFunction, T.Function); 1403b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.SignedFunction1, T.NumberFunction1); 1404b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.SignedFunction1, T.NumberFunction2); 1405b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.NumberFunction1, T.NumberFunction2); 1406b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.SignedFunction1, T.MethodFunction); 1407b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ObjectConstant1, T.ObjectClass); // !!! 1408b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.ObjectConstant2, T.ObjectClass); // !!! 1409b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.NumberClass, T.Intersect(T.Number, T.Untagged)); // !!! 14106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 14116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void Union1() { 1413c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Identity: Union(T, None) = T 1414c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1415c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1416c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union_type = T.Union(type, T.None); 1417c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union_type, type); 1418c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1419c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1420c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Domination: Union(T, Any) = Any 1421c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1422c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1423c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union_type = T.Union(type, T.Any); 1424c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union_type, T.Any); 1425c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1426c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1427c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Idempotence: Union(T, T) = T 1428c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1429c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1430c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union_type = T.Union(type, type); 1431c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union_type, type); 1432c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 14336d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1434c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Commutativity: Union(T1, T2) = Union(T2, T1) 1435c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1436c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1437c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1438c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1439c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1440c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union21 = T.Union(type2, type1); 1441c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union12, union21); 1442c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1443c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1444c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1445c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Associativity: Union(T1, Union(T2, T3)) = Union(Union(T1, T2), T3) 1446b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold! 1447b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1448c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1449c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1450c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1451c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1452c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1453c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1454c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1455c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union23 = T.Union(type2, type3); 1456c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union1_23 = T.Union(type1, union23); 1457c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12_3 = T.Union(union12, type3); 1458c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union1_23, union12_3); 1459c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1460c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1461c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1462b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 1463c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1464c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Meet: T1->Is(Union(T1, T2)) and T2->Is(Union(T1, T2)) 1465c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1466c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1467c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1468c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1469c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1470c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type1->Is(union12)); 1471c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type2->Is(union12)); 1472c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1473c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1474c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1475c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Upper Boundedness: T1->Is(T2) implies Union(T1, T2) = T2 1476c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1477c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1478c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1479c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1480c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1481c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (type1->Is(type2)) CheckEqual(union12, type2); 1482c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1483c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1484c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1485c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T2) implies Union(T1, T3)->Is(Union(T2, T3)) 1486b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold. 1487b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1488c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1489c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1490c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1491c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1492c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1493c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1494c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union13 = T.Union(type1, type3); 1495c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union23 = T.Union(type2, type3); 1496c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!type1->Is(type2) || union13->Is(union23)); 1497c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1498c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1499c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1500b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 1501b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 1502c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1503b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void Union2() { 1504c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T3) and T2->Is(T3) implies Union(T1, T2)->Is(T3) 1505b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold. TODO(neis): Could fix this by splitting 1506b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // OtherNumber into a negative and a positive part. 1507b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1508c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1509c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1510c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1511c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1512c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1513c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1514c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1515c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->Is(type3) && type2->Is(type3)) || union12->Is(type3)); 1516c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1517c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1518c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1519b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 1520b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 1521c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1522b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void Union3() { 1523c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T2) or T1->Is(T3) implies T1->Is(Union(T2, T3)) 1524c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1525c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1526c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1527c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1528c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1529c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1530c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union23 = T.Union(type2, type3); 1531c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->Is(type2) || type1->Is(type3)) || type1->Is(union23)); 1532c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1533c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1534c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1535b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org } 15366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1537b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void Union4() { 15386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Class-class 15396d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectClass, T.ArrayClass), T.Object); 15406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Union(T.ObjectClass, T.ArrayClass), T.Array); 1541b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Union(T.ObjectClass, T.ArrayClass), T.Array); 1542b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Union(T.ObjectClass, T.ArrayClass), T.Number); 15436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 15446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Constant-constant 15456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectConstant1, T.ObjectConstant2), T.Object); 1546c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array); 15476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered( 15486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ObjectConstant2), T.ObjectClass); 15494452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap( 1550b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array); 15514452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint( 1552b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayConstant), T.Number); 1553b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap( 1554b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayConstant), T.ObjectClass); // !!! 15556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 15569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Bitset-array 15579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(this->IsBitset(T.Union(T.AnyArray, T.Array))); 15587e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(this->IsUnion(T.Union(T.NumberArray, T.Number))); 15599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 15609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(T.Union(T.AnyArray, T.Array), T.Array); 15619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.Union(T.AnyArray, T.String), T.Array); 1562b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Union(T.NumberArray, T.String), T.Object); 1563b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Union(T.NumberArray, T.String), T.Number); 15649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 15659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Bitset-function 15669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(this->IsBitset(T.Union(T.MethodFunction, T.Function))); 15679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(this->IsUnion(T.Union(T.NumberFunction1, T.Number))); 15689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 15699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(T.Union(T.MethodFunction, T.Function), T.Function); 15709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.Union(T.NumberFunction1, T.String), T.Function); 1571b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Union(T.NumberFunction2, T.String), T.Object); 1572b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Union(T.NumberFunction1, T.String), T.Number); 15739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 15746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Bitset-class 15754452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub( 15764452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.ObjectClass, T.SignedSmall), T.Union(T.Object, T.Number)); 15776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectClass, T.Array), T.Object); 15786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Union(T.ObjectClass, T.String), T.Array); 1579b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Union(T.ObjectClass, T.String), T.Object); 1580b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Union(T.ObjectClass, T.String), T.Number); 15816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 15826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Bitset-constant 15836d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 15846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.Signed32), T.Union(T.Object, T.Number)); 15856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectConstant1, T.Array), T.Object); 15866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Union(T.ObjectConstant1, T.String), T.Array); 1587b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap(T.Union(T.ObjectConstant1, T.String), T.Object); 1588b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckDisjoint(T.Union(T.ObjectConstant1, T.String), T.Number); 15896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 15906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Class-constant 15916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectConstant1, T.ArrayClass), T.Object); 15926d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectClass, T.Union(T.ObjectConstant1, T.ArrayClass)); 15936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 15946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayClass), T.Union(T.Array, T.Object)); 1595202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayClass), T.ArrayConstant); 15964452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint( 1597b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayClass), T.ObjectConstant2); 1598b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckOverlap( 1599b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayClass), T.ObjectClass); // !!! 16006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 16016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Bitset-union 16026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 16037e6132b924829c353864933f29124419916db550machenbach@chromium.org T.NaN, 16046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number)); 16056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 16067e6132b924829c353864933f29124419916db550machenbach@chromium.org T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Signed32), 16076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.Union(T.Number, T.ArrayClass))); 16086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 16096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Class-union 16106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 16116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectClass, T.Union(T.ObjectConstant1, T.ObjectClass)), 16126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Object); 16136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Union(T.ArrayClass, T.ObjectConstant2), T.ArrayClass), 16156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ArrayClass, T.ObjectConstant2)); 16166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 16176d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Constant-union 16186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 16206d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)), 16216d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1)); 16226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16236d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 1624202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org T.Union(T.ArrayConstant, T.ObjectConstant2), T.ObjectConstant1), 16256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 1626202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org T.ObjectConstant2, T.Union(T.ArrayConstant, T.ObjectConstant1))); 16276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 16289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Array-union 16299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 16307e6132b924829c353864933f29124419916db550machenbach@chromium.org T.Union(T.AnyArray, T.Union(T.NumberArray, T.AnyArray)), 16317e6132b924829c353864933f29124419916db550machenbach@chromium.org T.Union(T.AnyArray, T.NumberArray)); 16327e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckSub(T.Union(T.AnyArray, T.NumberArray), T.Array); 16339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 16349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Function-union 16359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 16369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Union(T.NumberFunction1, T.NumberFunction2), 16379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Union(T.NumberFunction2, T.NumberFunction1)); 16389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.Union(T.SignedFunction1, T.MethodFunction), T.Function); 16399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 16406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Union-union 16416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 16436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1), 16446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ObjectConstant2)), 16456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1)); 16466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 16484452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.Number, T.ArrayClass), 16494452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.SignedSmall, T.Array)), 16506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Number, T.Array)); 16516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 16526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1653b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void Intersect() { 1654c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Identity: Intersect(T, Any) = T 1655c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1656c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1657c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect_type = T.Intersect(type, T.Any); 1658c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect_type, type); 1659c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 16606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1661c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Domination: Intersect(T, None) = None 1662c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1663c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1664c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect_type = T.Intersect(type, T.None); 1665c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect_type, T.None); 1666c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 16676d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1668c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Idempotence: Intersect(T, T) = T 1669c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1670c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1671c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect_type = T.Intersect(type, type); 1672c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect_type, type); 1673c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 16746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1675c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Commutativity: Intersect(T1, T2) = Intersect(T2, T1) 1676c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1677c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1678c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1679c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1680c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1681c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect21 = T.Intersect(type2, type1); 1682c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect12, intersect21); 1683c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1684c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 16856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1686c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Associativity: 1687c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Intersect(T1, Intersect(T2, T3)) = Intersect(Intersect(T1, T2), T3) 1688b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold. 1689b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1690c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1691c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1692c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1693c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1694c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1695c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1696c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1697c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect23 = T.Intersect(type2, type3); 1698c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect1_23 = T.Intersect(type1, intersect23); 1699c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12_3 = T.Intersect(intersect12, type3); 1700c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect1_23, intersect12_3); 1701c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1702c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1703c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1704b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 17056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1706c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Join: Intersect(T1, T2)->Is(T1) and Intersect(T1, T2)->Is(T2) 1707b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold. Not even the disjunction. 1708b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1709c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1710c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1711c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1712c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1713c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1714c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(intersect12->Is(type1)); 1715c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(intersect12->Is(type2)); 1716c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1717c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1718b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 17196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1720c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Lower Boundedness: T1->Is(T2) implies Intersect(T1, T2) = T1 1721c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1722c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1723c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1724c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1725c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1726c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (type1->Is(type2)) CheckEqual(intersect12, type1); 1727c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1728c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1729c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1730c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T2) implies Intersect(T1, T3)->Is(Intersect(T2, T3)) 1731b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold. 1732b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1733c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1734c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1735c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1736c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1737c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1738c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1739c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect13 = T.Intersect(type1, type3); 1740c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect23 = T.Intersect(type2, type3); 1741c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!type1->Is(type2) || intersect13->Is(intersect23)); 1742c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1743c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1744c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1745b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 17466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1747c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T3) or T2->Is(T3) implies Intersect(T1, T2)->Is(T3) 1748b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold. 1749b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1750c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1751c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1752c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1753c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1754c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1755c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1756c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1757c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->Is(type3) || type2->Is(type3)) || 1758c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org intersect12->Is(type3)); 1759c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1760c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1761c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1762b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 1763c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1764c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T2) and T1->Is(T3) implies T1->Is(Intersect(T2, T3)) 1765b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold. 1766b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1767c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1768c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1769c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1770c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1771c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1772c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1773c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect23 = T.Intersect(type2, type3); 1774c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->Is(type2) && type1->Is(type3)) || 1775c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org type1->Is(intersect23)); 1776c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1777c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1778c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1779b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 1780c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1781c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Bitset-class 17826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual(T.Intersect(T.ObjectClass, T.Object), T.ObjectClass); 1783b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckEqual(T.Intersect(T.ObjectClass, T.Array), T.None); 1784b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckEqual(T.Intersect(T.ObjectClass, T.Number), T.None); 17856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 17869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Bitset-array 17877e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckEqual(T.Intersect(T.NumberArray, T.Object), T.NumberArray); 1788b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckEqual(T.Intersect(T.AnyArray, T.Function), T.None); 17899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 17909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Bitset-function 17919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(T.Intersect(T.MethodFunction, T.Object), T.MethodFunction); 1792b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CheckEqual(T.Intersect(T.NumberFunction1, T.Array), T.None); 17936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 17946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Bitset-union 17956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 17966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect(T.Object, T.Union(T.ObjectConstant1, T.ObjectClass)), 17976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ObjectClass)); 1798d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1799d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org !T.Intersect(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number) 1800d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org ->IsInhabited()); 18016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 18029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Class-constant 1803b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CHECK(T.Intersect(T.ObjectConstant1, T.ObjectClass)->IsInhabited()); // !!! 1804d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(!T.Intersect(T.ArrayClass, T.ObjectConstant2)->IsInhabited()); 18059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 18069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Array-union 18079fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 18087e6132b924829c353864933f29124419916db550machenbach@chromium.org T.Intersect(T.NumberArray, T.Union(T.NumberArray, T.ArrayClass)), 18097e6132b924829c353864933f29124419916db550machenbach@chromium.org T.NumberArray); 18109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 18119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Intersect(T.AnyArray, T.Union(T.Object, T.SmiConstant)), 18129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.AnyArray); 1813d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1814d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org !T.Intersect(T.Union(T.AnyArray, T.ArrayConstant), T.NumberArray) 1815d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org ->IsInhabited()); 18169fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 18179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Function-union 18189fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 18199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Intersect(T.MethodFunction, T.Union(T.String, T.MethodFunction)), 18209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.MethodFunction); 18219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 18229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Intersect(T.NumberFunction1, T.Union(T.Object, T.SmiConstant)), 18239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.NumberFunction1); 1824d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1825d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org !T.Intersect(T.Union(T.MethodFunction, T.Name), T.NumberFunction2) 1826d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org ->IsInhabited()); 18279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 18286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Class-union 18296d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 18306d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect(T.ArrayClass, T.Union(T.ObjectConstant2, T.ArrayClass)), 18316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ArrayClass); 18326d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 18336d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect(T.ArrayClass, T.Union(T.Object, T.SmiConstant)), 18346d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ArrayClass); 1835d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1836b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Intersect(T.Union(T.ObjectClass, T.ArrayConstant), T.ArrayClass) 1837b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ->IsInhabited()); // !!! 18386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 18396d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Constant-union 18406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 18416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 18426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)), 18436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ObjectConstant1); 18446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 18456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect(T.SmiConstant, T.Union(T.Number, T.ObjectConstant2)), 18466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.SmiConstant); 1847d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1848b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Intersect( 1849d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org T.Union(T.ArrayConstant, T.ObjectClass), T.ObjectConstant1) 1850b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ->IsInhabited()); // !!! 18516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 18526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Union-union 18536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 18546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 18556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Number, T.ArrayClass), 18564452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.SignedSmall, T.Array)), 18574452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.SignedSmall, T.ArrayClass)); 18586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 18596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 18606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Number, T.ObjectClass), 18616d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Signed32, T.Array)), 18626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Signed32); 18636d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 18646d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 18656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1), 18666d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ObjectConstant2)), 18676d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1)); 18686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 18696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 18706d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 1871b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.ArrayClass, 1872b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1)), 18736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 18746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ObjectConstant1, 1875202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org T.Union(T.ArrayConstant, T.ObjectConstant2))), 1876b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Union( 1877b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.ArrayConstant, 1878b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1))); // !!! 18796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 1880af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 1881b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org void Distributivity() { 1882d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Union(T1, Intersect(T2, T3)) = Intersect(Union(T1, T2), Union(T1, T3)) 1883b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold. 1884b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1885d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1886d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1887d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1888d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type1 = *it1; 1889d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type2 = *it2; 1890d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type3 = *it3; 1891d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1892d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union13 = T.Union(type1, type3); 1893d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect23 = T.Intersect(type2, type3); 1894d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union1_23 = T.Union(type1, intersect23); 1895d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect12_13 = T.Intersect(union12, union13); 1896d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(Equal(union1_23, intersect12_13)); 1897d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1898d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1899d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1900b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 1901d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 1902d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Intersect(T1, Union(T2, T3)) = Union(Intersect(T1, T2), Intersect(T1,T3)) 1903b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org // This does NOT hold. 1904b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org /* 1905d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1906d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1907d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1908d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type1 = *it1; 1909d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type2 = *it2; 1910d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type3 = *it3; 1911d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1912d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect13 = T.Intersect(type1, type3); 1913d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union23 = T.Union(type2, type3); 1914d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect1_23 = T.Intersect(type1, union23); 1915d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union12_13 = T.Union(intersect12, intersect13); 1916d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(Equal(intersect1_23, union12_13)); 1917d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1918d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1919d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1920b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org */ 1921d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1922d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 1923af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org template<class Type2, class TypeHandle2, class Region2, class Rep2> 1924af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org void Convert() { 1925af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org Types<Type2, TypeHandle2, Region2> T2( 1926af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org Rep2::ToRegion(&zone, isolate), isolate); 1927202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1928c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it; 1929c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle2 type2 = T2.template Convert<Type>(type1); 1930c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = T.template Convert<Type2>(type2); 1931c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(type1, type3); 1932af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org } 1933af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org } 1934eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org 1935eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org void HTypeFromType() { 1936eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1937eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1938eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org TypeHandle type1 = *it1; 1939eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org TypeHandle type2 = *it2; 1940eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org HType htype1 = HType::FromType<Type>(type1); 1941eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org HType htype2 = HType::FromType<Type>(type2); 1942eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org CHECK(!type1->Is(type2) || htype1.IsSubtypeOf(htype2)); 1943eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 1944eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 1945eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 1946dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}; 1947dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 19486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtypedef Tests<Type, Type*, Zone, ZoneRep> ZoneTests; 19496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtypedef Tests<HeapType, Handle<HeapType>, Isolate, HeapRep> HeapTests; 19506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1951dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 1952b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(IsSomeType) { 1953b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CcTest::InitializeVM(); 1954b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ZoneTests().IsSomeType(); 1955b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org HeapTests().IsSomeType(); 1956b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org} 1957b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 1958b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 19599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(BitsetType) { 1960dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 19616d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Bitset(); 19626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Bitset(); 1963dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 1964dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 1965dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 19669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ClassType) { 1967dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 19686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Class(); 19696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Class(); 1970dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 1971dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 1972dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 19739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ConstantType) { 1974dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 19756d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Constant(); 19766d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Constant(); 1977dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 1978dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 1979dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 19807c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgTEST(RangeType) { 19817c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org CcTest::InitializeVM(); 19827c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org ZoneTests().Range(); 19837c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org HeapTests().Range(); 19847c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org} 19857c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 19867c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org 19879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ArrayType) { 19889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CcTest::InitializeVM(); 19899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Array(); 19909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Array(); 19919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org} 19929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 19939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 19949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(FunctionType) { 19959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CcTest::InitializeVM(); 19969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Function(); 19979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Function(); 19989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org} 19999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 20009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2001202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(Of) { 2002202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CcTest::InitializeVM(); 2003202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ZoneTests().Of(); 2004202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org HeapTests().Of(); 2005202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org} 2006202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 2007202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 2008202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(NowOf) { 2009202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CcTest::InitializeVM(); 2010202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ZoneTests().NowOf(); 2011202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org HeapTests().NowOf(); 2012202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org} 2013202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 2014202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 2015b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(BitsetGlb) { 2016d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CcTest::InitializeVM(); 2017b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ZoneTests().BitsetGlb(); 2018b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org HeapTests().BitsetGlb(); 2019b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org} 2020b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 2021b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 2022b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(BitsetLub) { 2023b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org CcTest::InitializeVM(); 2024b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ZoneTests().BitsetLub(); 2025b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org HeapTests().BitsetLub(); 2026d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org} 2027d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 2028d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 2029dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgTEST(Is) { 2030dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 20316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Is(); 20326d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Is(); 2033dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 2034dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 2035dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 20365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgTEST(NowIs) { 20375b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CcTest::InitializeVM(); 20385b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org ZoneTests().NowIs(); 20395b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org HeapTests().NowIs(); 20405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org} 20415b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 20425b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 20435b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgTEST(Contains) { 20445b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CcTest::InitializeVM(); 20455b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org ZoneTests().Contains(); 20465b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org HeapTests().Contains(); 20475b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org} 20485b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 20495b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 2050202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(NowContains) { 2051202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CcTest::InitializeVM(); 2052202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ZoneTests().NowContains(); 2053202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org HeapTests().NowContains(); 2054202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org} 2055202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 2056202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 2057dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgTEST(Maybe) { 2058dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 20596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Maybe(); 20606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Maybe(); 2061dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 2062dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 2063dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 20649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Union1) { 20659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CcTest::InitializeVM(); 20669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Union1(); 20679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Union1(); 20689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org} 20699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 20709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2071b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org/* 20729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Union2) { 20739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CcTest::InitializeVM(); 20749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Union2(); 20759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Union2(); 20769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org} 2077b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org*/ 20789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 20799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2080b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(Union3) { 2081dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 2082b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ZoneTests().Union3(); 2083b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org HeapTests().Union3(); 2084dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 20851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 20861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2087b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(Union4) { 20881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CcTest::InitializeVM(); 2089b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ZoneTests().Union4(); 2090b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org HeapTests().Union4(); 20911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 2092af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 2093af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 2094b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(Intersect) { 2095e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org CcTest::InitializeVM(); 2096b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ZoneTests().Intersect(); 2097b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org HeapTests().Intersect(); 2098e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org} 2099e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org 2100e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org 2101b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org/* 2102b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(Distributivity) { 2103d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CcTest::InitializeVM(); 2104b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org ZoneTests().Distributivity(); 2105b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org HeapTests().Distributivity(); 2106d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org} 2107b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org*/ 2108b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org 2109d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 2110af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTEST(Convert) { 2111af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org CcTest::InitializeVM(); 2112af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); 2113af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); 2114af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org} 2115eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org 2116eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org 2117eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.orgTEST(HTypeFromType) { 2118eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org CcTest::InitializeVM(); 2119eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org ZoneTests().HTypeFromType(); 2120eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org HeapTests().HTypeFromType(); 2121eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org} 2122