1dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 2dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// Redistribution and use in source and binary forms, with or without 3dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// modification, are permitted provided that the following conditions are 4dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// met: 5dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// 6dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// * Redistributions of source code must retain the above copyright 7dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// notice, this list of conditions and the following disclaimer. 8dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// * Redistributions in binary form must reproduce the above 9dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// copyright notice, this list of conditions and the following 10dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// disclaimer in the documentation and/or other materials provided 11dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// with the distribution. 12dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// * Neither the name of Google Inc. nor the names of its 13dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// contributors may be used to endorse or promote products derived 14dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// from this software without specific prior written permission. 15dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// 16dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 28202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org#include <vector> 295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-types.h" 31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/types.h" 32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils/random-number-generator.h" 33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h" 34dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 35dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgusing namespace v8::internal; 36dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 37c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org// Testing auxiliaries (breaking the Type abstraction). 38c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgstruct ZoneRep { 39c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org typedef void* Struct; 40c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 41c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static bool IsStruct(Type* t, int tag) { 42c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag; 43c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 44c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static bool IsBitset(Type* t) { return reinterpret_cast<intptr_t>(t) & 1; } 45c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static bool IsClass(Type* t) { return IsStruct(t, 0); } 46c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static bool IsConstant(Type* t) { return IsStruct(t, 1); } 477e6132b924829c353864933f29124419916db550machenbach@chromium.org static bool IsContext(Type* t) { return IsStruct(t, 2); } 487e6132b924829c353864933f29124419916db550machenbach@chromium.org static bool IsArray(Type* t) { return IsStruct(t, 3); } 497e6132b924829c353864933f29124419916db550machenbach@chromium.org static bool IsFunction(Type* t) { return IsStruct(t, 4); } 507e6132b924829c353864933f29124419916db550machenbach@chromium.org static bool IsUnion(Type* t) { return IsStruct(t, 5); } 51c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 52c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Struct* AsStruct(Type* t) { 53c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return reinterpret_cast<Struct*>(t); 54c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 55c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static int AsBitset(Type* t) { 56c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return static_cast<int>(reinterpret_cast<intptr_t>(t) >> 1); 57c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 58c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Map* AsClass(Type* t) { 59c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return *static_cast<Map**>(AsStruct(t)[3]); 60c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 61c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Object* AsConstant(Type* t) { 62c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return *static_cast<Object**>(AsStruct(t)[3]); 63c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 647e6132b924829c353864933f29124419916db550machenbach@chromium.org static Type* AsContext(Type* t) { 657e6132b924829c353864933f29124419916db550machenbach@chromium.org return *static_cast<Type**>(AsStruct(t)[2]); 667e6132b924829c353864933f29124419916db550machenbach@chromium.org } 67c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Struct* AsUnion(Type* t) { 68c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return AsStruct(t); 69c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 70c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static int Length(Struct* structured) { 71c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return static_cast<int>(reinterpret_cast<intptr_t>(structured[1])); 72c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 73c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 74c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Zone* ToRegion(Zone* zone, Isolate* isolate) { return zone; } 75d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 76d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org struct BitsetType : Type::BitsetType { 77d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using Type::BitsetType::New; 78d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using Type::BitsetType::Glb; 79d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using Type::BitsetType::Lub; 80d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using Type::BitsetType::InherentLub; 81d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org }; 82c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org}; 83c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 84c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 85c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgstruct HeapRep { 86c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org typedef FixedArray Struct; 87c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 88c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static bool IsStruct(Handle<HeapType> t, int tag) { 89c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag; 90c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 91c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); } 92d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org static bool IsClass(Handle<HeapType> t) { 93d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return t->IsMap() || IsStruct(t, 0); 94d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 95d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org static bool IsConstant(Handle<HeapType> t) { return IsStruct(t, 1); } 967e6132b924829c353864933f29124419916db550machenbach@chromium.org static bool IsContext(Handle<HeapType> t) { return IsStruct(t, 2); } 977e6132b924829c353864933f29124419916db550machenbach@chromium.org static bool IsArray(Handle<HeapType> t) { return IsStruct(t, 3); } 987e6132b924829c353864933f29124419916db550machenbach@chromium.org static bool IsFunction(Handle<HeapType> t) { return IsStruct(t, 4); } 997e6132b924829c353864933f29124419916db550machenbach@chromium.org static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 5); } 100c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 101c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); } 102c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static int AsBitset(Handle<HeapType> t) { return Smi::cast(*t)->value(); } 103d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org static Map* AsClass(Handle<HeapType> t) { 104d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org return t->IsMap() ? Map::cast(*t) : Map::cast(AsStruct(t)->get(2)); 105c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 106d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org static Object* AsConstant(Handle<HeapType> t) { return AsStruct(t)->get(2); } 1077e6132b924829c353864933f29124419916db550machenbach@chromium.org static HeapType* AsContext(Handle<HeapType> t) { 1087e6132b924829c353864933f29124419916db550machenbach@chromium.org return HeapType::cast(AsStruct(t)->get(1)); 1097e6132b924829c353864933f29124419916db550machenbach@chromium.org } 110c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); } 111c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static int Length(Struct* structured) { return structured->length() - 1; } 112c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 113c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; } 114d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 115d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org struct BitsetType : HeapType::BitsetType { 116d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using HeapType::BitsetType::New; 117d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using HeapType::BitsetType::Glb; 118d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using HeapType::BitsetType::Lub; 119d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org using HeapType::BitsetType::InherentLub; 120d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org static int Glb(Handle<HeapType> type) { return Glb(*type); } 121d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org static int Lub(Handle<HeapType> type) { return Lub(*type); } 122d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org static int InherentLub(Handle<HeapType> type) { return InherentLub(*type); } 123d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org }; 124c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org}; 125c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 126c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtemplate<class Type, class TypeHandle, class Region> 1286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgclass Types { 1296d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org public: 130202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Types(Region* region, Isolate* isolate) : region_(region) { 131202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org #define DECLARE_TYPE(name, value) \ 132202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org name = Type::name(region); \ 133202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org types.push_back(name); 134202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org BITSET_TYPE_LIST(DECLARE_TYPE) 135202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org #undef DECLARE_TYPE 136202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 137202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org object_map = isolate->factory()->NewMap(JS_OBJECT_TYPE, 3 * kPointerSize); 138202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org array_map = isolate->factory()->NewMap(JS_ARRAY_TYPE, 4 * kPointerSize); 139202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org uninitialized_map = isolate->factory()->uninitialized_map(); 140202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ObjectClass = Type::Class(object_map, region); 141202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ArrayClass = Type::Class(array_map, region); 142202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org UninitializedClass = Type::Class(uninitialized_map, region); 143202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 144202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org maps.push_back(object_map); 145202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org maps.push_back(array_map); 146202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org maps.push_back(uninitialized_map); 147202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapVector::iterator it = maps.begin(); it != maps.end(); ++it) { 148202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org types.push_back(Type::Class(*it, region)); 149202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 150202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org smi = handle(Smi::FromInt(666), isolate); 1526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org signed32 = isolate->factory()->NewHeapNumber(0x40000000); 1536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org object1 = isolate->factory()->NewJSObjectFromMap(object_map); 1546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org object2 = isolate->factory()->NewJSObjectFromMap(object_map); 1556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org array = isolate->factory()->NewJSArray(20); 156202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org uninitialized = isolate->factory()->uninitialized_value(); 1576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org SmiConstant = Type::Constant(smi, region); 1586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Signed32Constant = Type::Constant(signed32, region); 1596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ObjectConstant1 = Type::Constant(object1, region); 1606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ObjectConstant2 = Type::Constant(object2, region); 161202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ArrayConstant = Type::Constant(array, region); 162202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org UninitializedConstant = Type::Constant(uninitialized, region); 163202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 164202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(smi); 165202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(signed32); 166202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(object1); 167202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(object2); 168202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(array); 169202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org values.push_back(uninitialized); 170202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueVector::iterator it = values.begin(); it != values.end(); ++it) { 171202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org types.push_back(Type::Constant(*it, region)); 1725b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 1735b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1747e6132b924829c353864933f29124419916db550machenbach@chromium.org NumberArray = Type::Array(Number, region); 1759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org StringArray = Type::Array(String, region); 1769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org AnyArray = Type::Array(Any, region); 1779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 1789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region); 1799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org NumberFunction1 = Type::Function(Number, Number, region); 1809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org NumberFunction2 = Type::Function(Number, Number, Number, region); 1819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org MethodFunction = Type::Function(String, Object, 0, region); 1829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 1839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 50; ++i) { 184c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org types.push_back(Fuzz()); 185202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 1876d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Map> object_map; 1899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Map> array_map; 1909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Map> uninitialized_map; 1919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 1929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Smi> smi; 1939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::HeapNumber> signed32; 1949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::JSObject> object1; 1959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::JSObject> object2; 1969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::JSArray> array; 1979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<i::Oddball> uninitialized; 1989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 199202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org #define DECLARE_TYPE(name, value) TypeHandle name; 200202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org BITSET_TYPE_LIST(DECLARE_TYPE) 201202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org #undef DECLARE_TYPE 2026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 2036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle ObjectClass; 2046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle ArrayClass; 205202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle UninitializedClass; 2066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 2076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle SmiConstant; 2086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle Signed32Constant; 2096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle ObjectConstant1; 2106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle ObjectConstant2; 211202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle ArrayConstant; 212202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle UninitializedConstant; 2136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 2147e6132b924829c353864933f29124419916db550machenbach@chromium.org TypeHandle NumberArray; 2159fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle StringArray; 2169fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle AnyArray; 2176d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 2189fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle SignedFunction1; 2199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle NumberFunction1; 2209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle NumberFunction2; 2219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle MethodFunction; 2226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 223202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef std::vector<TypeHandle> TypeVector; 224202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef std::vector<Handle<i::Map> > MapVector; 225202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef std::vector<Handle<i::Object> > ValueVector; 226202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeVector types; 227202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org MapVector maps; 228202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ValueVector values; 2295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 230202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle Of(Handle<i::Object> value) { 231202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org return Type::Of(value, region_); 232202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 233202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 234202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle NowOf(Handle<i::Object> value) { 235202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org return Type::NowOf(value, region_); 236202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 2375b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 238202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle Constant(Handle<i::Object> value) { 239202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org return Type::Constant(value, region_); 2405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 2415b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 242202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle Class(Handle<i::Map> map) { 243202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org return Type::Class(map, region_); 2445b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 2455b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 2469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Array1(TypeHandle element) { 2479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return Type::Array(element, region_); 2489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Function0(TypeHandle result, TypeHandle receiver) { 2519fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return Type::Function(result, receiver, 0, region_); 2529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2549fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Function1(TypeHandle result, TypeHandle receiver, TypeHandle arg) { 2559fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type = Type::Function(result, receiver, 1, region_); 2569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org type->AsFunction()->InitParameter(0, arg); 2579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return type; 2589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Function2(TypeHandle result, TypeHandle arg1, TypeHandle arg2) { 2619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return Type::Function(result, arg1, arg2, region_); 2629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 2646d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle Union(TypeHandle t1, TypeHandle t2) { 2656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org return Type::Union(t1, t2, region_); 2666d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 2676d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TypeHandle Intersect(TypeHandle t1, TypeHandle t2) { 2686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org return Type::Intersect(t1, t2, region_); 2696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 2706d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 271af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org template<class Type2, class TypeHandle2> 272af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org TypeHandle Convert(TypeHandle2 t) { 273af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org return Type::template Convert<Type2>(t, region_); 274af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org } 275af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 2769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle Random() { 2779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org return types[rng_.NextInt(static_cast<int>(types.size()))]; 2789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 2799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 280c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle Fuzz(int depth = 5) { 281c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org switch (rng_.NextInt(depth == 0 ? 3 : 20)) { 282c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org case 0: { // bitset 283c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int n = 0 284c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org #define COUNT_BITSET_TYPES(type, value) + 1 285c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org BITSET_TYPE_LIST(COUNT_BITSET_TYPES) 286c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org #undef COUNT_BITSET_TYPES 287c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org ; 288c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int i = rng_.NextInt(n); 289c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org #define PICK_BITSET_TYPE(type, value) \ 290c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (i-- == 0) return Type::type(region_); 291c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org BITSET_TYPE_LIST(PICK_BITSET_TYPE) 292c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org #undef PICK_BITSET_TYPE 293c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org UNREACHABLE(); 294c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 295c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org case 1: { // class 296c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int i = rng_.NextInt(static_cast<int>(maps.size())); 297c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return Type::Class(maps[i], region_); 298c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 299c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org case 2: { // constant 300c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int i = rng_.NextInt(static_cast<int>(values.size())); 301c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return Type::Constant(values[i], region_); 302c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 3037e6132b924829c353864933f29124419916db550machenbach@chromium.org case 3: { // context 3047e6132b924829c353864933f29124419916db550machenbach@chromium.org int depth = rng_.NextInt(3); 3057e6132b924829c353864933f29124419916db550machenbach@chromium.org TypeHandle type = Type::Internal(region_); 3067e6132b924829c353864933f29124419916db550machenbach@chromium.org for (int i = 0; i < depth; ++i) type = Type::Context(type, region_); 3077e6132b924829c353864933f29124419916db550machenbach@chromium.org return type; 3087e6132b924829c353864933f29124419916db550machenbach@chromium.org } 3097e6132b924829c353864933f29124419916db550machenbach@chromium.org case 4: { // array 3108496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle element = Fuzz(depth / 2); 3118496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org return Type::Array(element, region_); 3128496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org } 3139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org case 5: 3147e6132b924829c353864933f29124419916db550machenbach@chromium.org case 6: 3157e6132b924829c353864933f29124419916db550machenbach@chromium.org case 7: { // function 3168496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle result = Fuzz(depth / 2); 3178496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle receiver = Fuzz(depth / 2); 3188496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org int arity = rng_.NextInt(3); 3198496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle type = Type::Function(result, receiver, arity, region_); 3209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < type->AsFunction()->Arity(); ++i) { 3218496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle parameter = Fuzz(depth - 1); 3228496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org type->AsFunction()->InitParameter(i, parameter); 3239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 3249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 325c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org default: { // union 326c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org int n = rng_.NextInt(10); 327c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = None; 328c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (int i = 0; i < n; ++i) { 3298496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org TypeHandle operand = Fuzz(depth - 1); 3308496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org type = Type::Union(type, operand, region_); 331c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 332c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return type; 333c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 334c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 335c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org UNREACHABLE(); 3366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 3376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 338d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Region* region() { return region_; } 339d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 340c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org private: 341c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Region* region_; 342c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org RandomNumberGenerator rng_; 3436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org}; 3441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 345e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 3466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtemplate<class Type, class TypeHandle, class Region, class Rep> 3476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgstruct Tests : Rep { 348202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef Types<Type, TypeHandle, Region> TypesInstance; 349202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef typename TypesInstance::TypeVector::iterator TypeIterator; 350202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef typename TypesInstance::MapVector::iterator MapIterator; 351202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org typedef typename TypesInstance::ValueVector::iterator ValueIterator; 352202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 3536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Isolate* isolate; 3546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HandleScope scope; 3556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Zone zone; 356202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypesInstance T; 3576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 3586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Tests() : 3596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org isolate(CcTest::i_isolate()), 3606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org scope(isolate), 3616d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org zone(isolate), 3626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T(Rep::ToRegion(&zone, isolate), isolate) { 3631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 365c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org bool Equal(TypeHandle type1, TypeHandle type2) { 366c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return 367c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org type1->Is(type2) && type2->Is(type1) && 368c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Rep::IsBitset(type1) == Rep::IsBitset(type2) && 369c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Rep::IsClass(type1) == Rep::IsClass(type2) && 370c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Rep::IsConstant(type1) == Rep::IsConstant(type2) && 3717e6132b924829c353864933f29124419916db550machenbach@chromium.org Rep::IsContext(type1) == Rep::IsContext(type2) && 372d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::IsArray(type1) == Rep::IsArray(type2) && 373d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::IsFunction(type1) == Rep::IsFunction(type2) && 374c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Rep::IsUnion(type1) == Rep::IsUnion(type2) && 375c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org type1->NumClasses() == type2->NumClasses() && 376c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org type1->NumConstants() == type2->NumConstants() && 377c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org (!Rep::IsBitset(type1) || 378c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Rep::AsBitset(type1) == Rep::AsBitset(type2)) && 379c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org (!Rep::IsClass(type1) || 380c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Rep::AsClass(type1) == Rep::AsClass(type2)) && 381c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org (!Rep::IsConstant(type1) || 382c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Rep::AsConstant(type1) == Rep::AsConstant(type2)) && 383d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // TODO(rossberg): Check details of arrays, functions, bounds. 384d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org (!Rep::IsUnion(type1) || 385c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Rep::Length(Rep::AsUnion(type1)) == Rep::Length(Rep::AsUnion(type2))); 386c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 387c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 3884452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org void CheckEqual(TypeHandle type1, TypeHandle type2) { 389c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(Equal(type1, type2)); 3906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 391e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 3924452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org void CheckSub(TypeHandle type1, TypeHandle type2) { 3936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(type1->Is(type2)); 3946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type2->Is(type1)); 3956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { 3966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK_NE(Rep::AsBitset(type1), Rep::AsBitset(type2)); 3976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 3981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 3991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4004452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org void CheckUnordered(TypeHandle type1, TypeHandle type2) { 4016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type1->Is(type2)); 4026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type2->Is(type1)); 4036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { 4046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK_NE(Rep::AsBitset(type1), Rep::AsBitset(type2)); 4056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 4066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 407e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 4084452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org void CheckOverlap(TypeHandle type1, TypeHandle type2, TypeHandle mask) { 4096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(type1->Maybe(type2)); 4106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(type2->Maybe(type1)); 4116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { 4124452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CHECK_NE(0, 4134452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask)); 4146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 4151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 4161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4174452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org void CheckDisjoint(TypeHandle type1, TypeHandle type2, TypeHandle mask) { 4186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type1->Is(type2)); 4196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type2->Is(type1)); 4206d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type1->Maybe(type2)); 4216d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CHECK(!type2->Maybe(type1)); 4226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { 4234452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CHECK_EQ(0, 4244452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask)); 4256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 4266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 4271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Bitset() { 429202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // None and Any are bitsets. 430bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org CHECK(this->IsBitset(T.None)); 431bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org CHECK(this->IsBitset(T.Any)); 432bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org 433bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org CHECK_EQ(0, this->AsBitset(T.None)); 434202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK_EQ(-1, this->AsBitset(T.Any)); 435202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 436c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Union(T1, T2) is bitset for bitsets T1,T2 437202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 438202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 439202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 440202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 441c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 442202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) || 443c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->IsBitset(union12)); 444202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 445202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 446202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 447c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Intersect(T1, T2) is bitset for bitsets T1,T2 448202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 449202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 450202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 451202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 452c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 453c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) || 454c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->IsBitset(intersect12)); 455c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 456c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 457c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 458c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Union(T1, T2) is bitset if T2 is bitset and T1->Is(T2) 459c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 460c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 461c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 462c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 463c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 464202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!(this->IsBitset(type2) && type1->Is(type2)) || 465c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->IsBitset(union12)); 466202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 467202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 468202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 469c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Union(T1, T2) is bitwise disjunction for bitsets T1,T2 470202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 471202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 472202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 473202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 474c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 475202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org if (this->IsBitset(type1) && this->IsBitset(type2)) { 476202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK_EQ( 477202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org this->AsBitset(type1) | this->AsBitset(type2), 478c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->AsBitset(union12)); 479202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 480202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 481202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 482202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 483c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Intersect(T1, T2) is bitwise conjunction for bitsets T1,T2 484202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 485202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 486202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 487202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 488c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 489202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org if (this->IsBitset(type1) && this->IsBitset(type2)) { 490202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK_EQ( 491202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org this->AsBitset(type1) & this->AsBitset(type2), 492c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org this->AsBitset(intersect12)); 493202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 494202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 495202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 496dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 497dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 4986d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Class() { 499202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constructor 500202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 501202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 502c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = T.Class(map); 503c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(this->IsClass(type)); 504202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 505dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 506202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Map attribute 507202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 508202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 509c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = T.Class(map); 5109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(*map == *type->AsClass()->Map()); 511202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 512202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 513c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Functionality & Injectivity: Class(M1) = Class(M2) iff M1 = M2 514202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { 515202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { 516202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map1 = *mt1; 517202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map2 = *mt2; 518c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = T.Class(map1); 519c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = T.Class(map2); 520c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(Equal(type1, type2) == (*map1 == *map2)); 521202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 522202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 5236d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 524dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 5256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Constant() { 526202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constructor 527202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 528202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 529c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = T.Constant(value); 530c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(this->IsConstant(type)); 531202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 532202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 533202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Value attribute 534202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 535202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 536c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = T.Constant(value); 5379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(*value == *type->AsConstant()->Value()); 538202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 539202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 5409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Functionality & Injectivity: Constant(V1) = Constant(V2) iff V1 = V2 541202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { 542202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { 543c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value1 = *vt1; 544c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value2 = *vt2; 545c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = T.Constant(value1); 546c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = T.Constant(value2); 547c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(Equal(type1, type2) == (*value1 == *value2)); 548202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 549202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 5507e6132b924829c353864933f29124419916db550machenbach@chromium.org 5517e6132b924829c353864933f29124419916db550machenbach@chromium.org // Typing of numbers 5527e6132b924829c353864933f29124419916db550machenbach@chromium.org Factory* fac = isolate->factory(); 5537e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0))->Is(T.UnsignedSmall)); 5547e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(1))->Is(T.UnsignedSmall)); 5557e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x3fffffff))->Is(T.UnsignedSmall)); 5567e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-1))->Is(T.OtherSignedSmall)); 5577e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x3fffffff))->Is(T.OtherSignedSmall)); 5587e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x40000000))->Is(T.OtherSignedSmall)); 5597e6132b924829c353864933f29124419916db550machenbach@chromium.org if (SmiValuesAre31Bits()) { 5607e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31)); 5617e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31)); 5627e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32)); 5637e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32)); 5647e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32)); 5657e6132b924829c353864933f29124419916db550machenbach@chromium.org } else { 5667e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(SmiValuesAre32Bits()); 5677e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.UnsignedSmall)); 5687e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.UnsignedSmall)); 5697e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31)); 5707e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31)); 5717e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSignedSmall)); 5727e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSignedSmall)); 5737e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSignedSmall)); 5747e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32)); 5757e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32)); 5767e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(!T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32)); 5777e6132b924829c353864933f29124419916db550machenbach@chromium.org } 5787e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0x80000000u))->Is(T.OtherUnsigned32)); 5797e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0xffffffffu))->Is(T.OtherUnsigned32)); 5807e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0xffffffffu+1.0))->Is(T.OtherNumber)); 5817e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-0x7fffffff-2.0))->Is(T.OtherNumber)); 5827e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(0.1))->Is(T.OtherNumber)); 5837e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-10.1))->Is(T.OtherNumber)); 5847e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(10e60))->Is(T.OtherNumber)); 5857e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-1.0*0.0))->Is(T.MinusZero)); 5867e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(OS::nan_value()))->Is(T.NaN)); 5877e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(V8_INFINITY))->Is(T.OtherNumber)); 5887e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(T.Constant(fac->NewNumber(-V8_INFINITY))->Is(T.OtherNumber)); 589202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 590202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 5919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void Array() { 5929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Constructor 5939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 5949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type = T.Random(); 5959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle array = T.Array1(type); 5969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(this->IsArray(array)); 5979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 5989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 5999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Attributes 6009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type = T.Random(); 6029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle array = T.Array1(type); 6039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type, array->AsArray()->Element()); 6049fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Functionality & Injectivity: Array(T1) = Array(T2) iff T1 = T2 6079fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int j = 0; j < 20; ++j) { 6099fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type1 = T.Random(); 6109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type2 = T.Random(); 6119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle array1 = T.Array1(type1); 6129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle array2 = T.Array1(type2); 6139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(array1, array2) == Equal(type1, type2)); 6149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6159fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6169fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6189fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void Function() { 6199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Constructors 6209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int j = 0; j < 20; ++j) { 6229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int k = 0; k < 20; ++k) { 6239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type1 = T.Random(); 6249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type2 = T.Random(); 6259fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type3 = T.Random(); 6269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function0 = T.Function0(type1, type2); 6279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function1 = T.Function1(type1, type2, type3); 6289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function2 = T.Function2(type1, type2, type3); 6299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(function0->IsFunction()); 6309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(function1->IsFunction()); 6319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(function2->IsFunction()); 6329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Attributes 6379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int j = 0; j < 20; ++j) { 6399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int k = 0; k < 20; ++k) { 6409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type1 = T.Random(); 6419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type2 = T.Random(); 6429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type3 = T.Random(); 6439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function0 = T.Function0(type1, type2); 6449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function1 = T.Function1(type1, type2, type3); 6459fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function2 = T.Function2(type1, type2, type3); 6469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK_EQ(0, function0->AsFunction()->Arity()); 6479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK_EQ(1, function1->AsFunction()->Arity()); 6489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK_EQ(2, function2->AsFunction()->Arity()); 6499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type1, function0->AsFunction()->Result()); 6509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type1, function1->AsFunction()->Result()); 6519fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type1, function2->AsFunction()->Result()); 6529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type2, function0->AsFunction()->Receiver()); 6539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type2, function1->AsFunction()->Receiver()); 6549fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(T.Any, function2->AsFunction()->Receiver()); 6559fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type3, function1->AsFunction()->Parameter(0)); 6569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type2, function2->AsFunction()->Parameter(0)); 6579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(type3, function2->AsFunction()->Parameter(1)); 6589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 6629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Functionality & Injectivity: Function(Ts1) = Function(Ts2) iff Ts1 = Ts2 6639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int i = 0; i < 20; ++i) { 6649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int j = 0; j < 20; ++j) { 6659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org for (int k = 0; k < 20; ++k) { 6669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type1 = T.Random(); 6679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type2 = T.Random(); 6689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle type3 = T.Random(); 6699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function01 = T.Function0(type1, type2); 6709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function02 = T.Function0(type1, type3); 6719fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function03 = T.Function0(type3, type2); 6729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function11 = T.Function1(type1, type2, type2); 6739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function12 = T.Function1(type1, type2, type3); 6749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function21 = T.Function2(type1, type2, type2); 6759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function22 = T.Function2(type1, type2, type3); 6769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org TypeHandle function23 = T.Function2(type1, type3, type2); 6779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function01, function02) == Equal(type2, type3)); 6789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function01, function03) == Equal(type1, type3)); 6799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function11, function12) == Equal(type2, type3)); 6809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function21, function22) == Equal(type2, type3)); 6819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(Equal(function21, function23) == Equal(type2, type3)); 6829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 6869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 687202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org void Of() { 688c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->Is(Of(V)) 689202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 690202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 691c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 692c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle of_type = T.Of(value); 693c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type->Is(of_type)); 694202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 695202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 696c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->Is(T) iff Of(V)->Is(T) or T->Maybe(Constant(V)) 697202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 698202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 699202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 700202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 701c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 702c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle of_type = T.Of(value); 703c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type->Is(type) == 704c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org (of_type->Is(type) || type->Maybe(const_type))); 705202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 706202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 707202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 708202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 709202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org void NowOf() { 710c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->NowIs(NowOf(V)) 711202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 712202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 713c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 714c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.NowOf(value); 715c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type->NowIs(nowof_type)); 716202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 717202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 718c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // NowOf(V)->Is(Of(V)) 719202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 720202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 721c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.NowOf(value); 722c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle of_type = T.Of(value); 723c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(nowof_type->Is(of_type)); 724202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 725202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 726c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->NowIs(T) iff NowOf(V)->NowIs(T) or T->Maybe(Constant(V)) 727202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 728202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 729202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 730202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 731c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 732c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.NowOf(value); 733c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type->NowIs(type) == 734c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org (nowof_type->NowIs(type) || type->Maybe(const_type))); 735202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 736202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 737202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 738c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->Is(T) implies NowOf(V)->Is(T) or T->Maybe(Constant(V)) 739202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 740202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 741202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 742202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 743c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 744c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.NowOf(value); 745c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!const_type->Is(type) || 746c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org (nowof_type->Is(type) || type->Maybe(const_type))); 747202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 748202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 7492efc3e46d2de48d8859520ee7fe035c02108509bmstarzinger@chromium.org } 7506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 751d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org void Bounds() { 752d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Ordering: (T->BitsetGlb())->Is(T->BitsetLub()) 753d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 754d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type = *it; 755d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle glb = 756d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region()); 757d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle lub = 758d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Lub(type), T.region()); 759d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(glb->Is(lub)); 760d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 761d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 762d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Lower bound: (T->BitsetGlb())->Is(T) 763d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 764d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type = *it; 765d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle glb = 766d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region()); 767d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(glb->Is(type)); 768d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 769d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 770d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Upper bound: T->Is(T->BitsetLub()) 771d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 772d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type = *it; 773d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle lub = 774d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Lub(type), T.region()); 775d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(type->Is(lub)); 776d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 777d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 778d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Inherent bound: (T->BitsetLub())->Is(T->InherentBitsetLub()) 779d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 780d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type = *it; 781d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle lub = 782d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::Lub(type), T.region()); 783d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle inherent = 784d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org Rep::BitsetType::New(Rep::BitsetType::InherentLub(type), T.region()); 785d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(lub->Is(inherent)); 786d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 787d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 788d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 7896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Is() { 790c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Least Element (Bottom): None->Is(T) 7915b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 7925b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 793c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(T.None->Is(type)); 7945b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 7955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 796c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Greatest Element (Top): T->Is(Any) 7975b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 7985b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 799c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->Is(T.Any)); 8005b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 802c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Bottom Uniqueness: T->Is(None) implies T = None 8035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 8045b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 805c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (type->Is(T.None)) CheckEqual(type, T.None); 8065b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 808c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Top Uniqueness: Any->Is(T) implies T = Any 8095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 8105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 811c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (T.Any->Is(type)) CheckEqual(type, T.Any); 8125b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8135b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 814c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Reflexivity: T->Is(T) 8155b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 8165b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 8175b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CHECK(type->Is(type)); 8185b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 820c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Transitivity: T1->Is(T2) and T2->Is(T3) implies T1->Is(T3) 8215b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 8225b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 8235b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 8245b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 8255b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 8265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type3 = *it3; 827202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!(type1->Is(type2) && type2->Is(type3)) || type1->Is(type3)); 8285b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8305b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 8316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 832c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Antisymmetry: T1->Is(T2) and T2->Is(T1) iff T1 = T2 833c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 834c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 835c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 836c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 837c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK((type1->Is(type2) && type2->Is(type1)) == Equal(type1, type2)); 838c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 839c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 840c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 841202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constant(V1)->Is(Constant(V2)) iff V1 = V2 842202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { 843202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { 844c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value1 = *vt1; 845c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value2 = *vt2; 846c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type1 = T.Constant(value1); 847c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type2 = T.Constant(value2); 848c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type1->Is(const_type2) == (*value1 == *value2)); 849202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 850202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 851202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 852202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Class(M1)->Is(Class(M2)) iff M1 = M2 853202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { 854202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { 855202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map1 = *mt1; 856202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map2 = *mt2; 857c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type1 = T.Class(map1); 858c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type2 = T.Class(map2); 859c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(class_type1->Is(class_type2) == (*map1 == *map2)); 860202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 861202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 862202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 863c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->Is(Class(M)) never 864202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 865202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 866202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 867202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 868c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle constant_type = T.Constant(value); 869c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 870c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!constant_type->Is(class_type)); 871202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 872202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 873202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 874c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Class(M)->Is(Constant(V)) never 875202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 876202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 877202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 878202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 879c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle constant_type = T.Constant(value); 880c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 881c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!class_type->Is(constant_type)); 882202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 883202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 8846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 885202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Basic types 8866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Boolean, T.Null); 8876d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Undefined, T.Null); 8886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Boolean, T.Undefined); 8896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 8904452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub(T.SignedSmall, T.Number); 8916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Signed32, T.Number); 8924452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub(T.SignedSmall, T.Signed32); 8937e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckUnordered(T.SignedSmall, T.MinusZero); 8947e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckUnordered(T.Signed32, T.Unsigned32); 8956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 8966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.UniqueName, T.Name); 8976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.String, T.Name); 8986d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.InternalizedString, T.String); 8996d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.InternalizedString, T.UniqueName); 9006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.InternalizedString, T.Name); 9016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Symbol, T.UniqueName); 9026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Symbol, T.Name); 9036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.String, T.UniqueName); 9046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.String, T.Symbol); 9056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.InternalizedString, T.Symbol); 9066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 9076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Object, T.Receiver); 9086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Array, T.Object); 9096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Function, T.Object); 9106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Proxy, T.Receiver); 9116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Object, T.Proxy); 9126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Array, T.Function); 9136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 914202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Structural types 9156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.ObjectClass, T.Object); 9166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.ArrayClass, T.Object); 9179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.ArrayClass, T.Array); 918c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckSub(T.UninitializedClass, T.Internal); 9196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectClass, T.ArrayClass); 920c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.UninitializedClass, T.Null); 921c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.UninitializedClass, T.Undefined); 9226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 9234452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub(T.SmiConstant, T.SignedSmall); 9246d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.SmiConstant, T.Signed32); 9256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.SmiConstant, T.Number); 9266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.ObjectConstant1, T.Object); 9276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.ObjectConstant2, T.Object); 928202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckSub(T.ArrayConstant, T.Object); 929202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckSub(T.ArrayConstant, T.Array); 930c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckSub(T.UninitializedConstant, T.Internal); 9316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant1, T.ObjectConstant2); 932202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckUnordered(T.ObjectConstant1, T.ArrayConstant); 933c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.UninitializedConstant, T.Null); 934c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.UninitializedConstant, T.Undefined); 9356d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 9366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant1, T.ObjectClass); 9376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant2, T.ObjectClass); 9386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant1, T.ArrayClass); 9396d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectConstant2, T.ArrayClass); 940202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckUnordered(T.ArrayConstant, T.ObjectClass); 9419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 9427e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckSub(T.NumberArray, T.Array); 9437e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckSub(T.NumberArray, T.Object); 9449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.StringArray, T.AnyArray); 9459fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 9469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.MethodFunction, T.Function); 9479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.NumberFunction1, T.Object); 9489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.SignedFunction1, T.NumberFunction1); 9499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.NumberFunction1, T.NumberFunction2); 9501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 951dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 9525b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org void NowIs() { 953c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Least Element (Bottom): None->NowIs(T) 9545b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 9555b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 956c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(T.None->NowIs(type)); 9575b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9585b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 959c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Greatest Element (Top): T->NowIs(Any) 9605b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 9615b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 962c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->NowIs(T.Any)); 9635b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9645b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 965c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Bottom Uniqueness: T->NowIs(None) implies T = None 9665b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 9675b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 968c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (type->NowIs(T.None)) CheckEqual(type, T.None); 9695b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 971c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Top Uniqueness: Any->NowIs(T) implies T = Any 9725b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 9735b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 974c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (T.Any->NowIs(type)) CheckEqual(type, T.Any); 9755b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9765b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 977c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Reflexivity: T->NowIs(T) 9785b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 9795b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 9805b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CHECK(type->NowIs(type)); 9815b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9825b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 983c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Transitivity: T1->NowIs(T2) and T2->NowIs(T3) implies T1->NowIs(T3) 9845b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 9855b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 9865b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 9875b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 9885b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 9895b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type3 = *it3; 990c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->NowIs(type2) && type2->NowIs(type3)) || 9915b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org type1->NowIs(type3)); 9925b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9935b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9945b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 9955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 996c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Antisymmetry: T1->NowIs(T2) and T2->NowIs(T1) iff T1 = T2 997c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 998c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 999c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1000c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1001c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK((type1->NowIs(type2) && type2->NowIs(type1)) == 1002c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Equal(type1, type2)); 1003c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1004c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1005c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1006c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T1->Is(T2) implies T1->NowIs(T2) 10075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 10085b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 10095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 10105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 10115b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CHECK(!type1->Is(type2) || type1->NowIs(type2)); 10125b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 10135b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 10145b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1015202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constant(V1)->NowIs(Constant(V2)) iff V1 = V2 1016202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { 1017202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { 1018c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value1 = *vt1; 1019c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value2 = *vt2; 1020c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type1 = T.Constant(value1); 1021c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type2 = T.Constant(value2); 1022c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type1->NowIs(const_type2) == (*value1 == *value2)); 1023202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1024202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1025202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1026202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Class(M1)->NowIs(Class(M2)) iff M1 = M2 1027202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { 1028202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { 1029202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map1 = *mt1; 1030202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map2 = *mt2; 1031c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type1 = T.Class(map1); 1032c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type2 = T.Class(map2); 1033c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(class_type1->NowIs(class_type2) == (*map1 == *map2)); 1034202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1035202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1036202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1037202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constant(V)->NowIs(Class(M)) iff V has map M 1038202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 1039202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1040202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 1041202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1042c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1043c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 1044202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK((value->IsHeapObject() && 1045202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org i::HeapObject::cast(*value)->map() == *map) 1046c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org == const_type->NowIs(class_type)); 1047202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1048202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1049202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1050c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Class(M)->NowIs(Constant(V)) never 1051202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 1052202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1053202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 1054202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1055c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1056c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 1057c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!class_type->NowIs(const_type)); 1058202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1059202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 10605b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 10615b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 10625b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org void Contains() { 1063c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T->Contains(V) iff Constant(V)->Is(T) 1064202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1065202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1066202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1067202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1068c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1069c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->Contains(value) == const_type->Is(type)); 1070202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1071202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1072202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1073c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Of(V)->Is(T) implies T->Contains(V) 10745b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1075202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 10765b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 1077202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1078c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle of_type = T.Of(value); 1079c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!of_type->Is(type) || type->Contains(value)); 1080202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1081202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1082202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1083202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1084202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org void NowContains() { 1085c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T->NowContains(V) iff Constant(V)->NowIs(T) 1086202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1087202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1088202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1089202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1090c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1091c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->NowContains(value) == const_type->NowIs(type)); 1092202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1093202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1094202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1095c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T->Contains(V) implies T->NowContains(V) 1096202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1097202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1098202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1099202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1100202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!type->Contains(value) || type->NowContains(value)); 11015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11025b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1104c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // NowOf(V)->Is(T) implies T->NowContains(V) 11055b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1106202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 11075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type = *it; 1108202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1109c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.Of(value); 1110c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!nowof_type->NowIs(type) || type->NowContains(value)); 1111202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1112202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1113202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1114c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // NowOf(V)->NowIs(T) implies T->NowContains(V) 1115202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1116202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1117202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1118202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1119c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle nowof_type = T.Of(value); 1120c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!nowof_type->NowIs(type) || type->NowContains(value)); 11215b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11225b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11235b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11245b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 11256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Maybe() { 1126202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // T->Maybe(Any) iff T inhabited 1127202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1128202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1129202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(type->Maybe(T.Any) == type->IsInhabited()); 1130202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1131202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1132202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // T->Maybe(None) never 1133202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1134202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type = *it; 1135202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!type->Maybe(T.None)); 1136202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1137202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1138c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Reflexivity upto Inhabitation: T->Maybe(T) iff T inhabited 1139c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1140c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1141c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type->Maybe(type) == type->IsInhabited()); 1142c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1143c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1144c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Symmetry: T1->Maybe(T2) iff T2->Maybe(T1) 11455b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 11465b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 11475b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 11485b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 11495b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CHECK(type1->Maybe(type2) == type2->Maybe(type1)); 11505b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11515b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 11525b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1153c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T1->Maybe(T2) implies T1, T2 inhabited 11545b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 11555b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 11565b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type1 = *it1; 11575b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org TypeHandle type2 = *it2; 1158202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!type1->Maybe(type2) || 1159202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org (type1->IsInhabited() && type2->IsInhabited())); 1160202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1161202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1162202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1163196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org // T1->Maybe(T2) implies Intersect(T1, T2) inhabited 1164c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1165c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1166c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1167c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1168c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1169196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org CHECK(!type1->Maybe(type2) || intersect12->IsInhabited()); 1170c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1171c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1172c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1173c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // T1->Is(T2) and T1 inhabited implies T1->Maybe(T2) 1174202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1175202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1176202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type1 = *it1; 1177202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org TypeHandle type2 = *it2; 1178202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CHECK(!(type1->Is(type2) && type1->IsInhabited()) || 1179202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org type1->Maybe(type2)); 1180202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1181202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1182202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1183202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Constant(V1)->Maybe(Constant(V2)) iff V1 = V2 1184202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { 1185202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { 1186c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value1 = *vt1; 1187c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<i::Object> value2 = *vt2; 1188c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type1 = T.Constant(value1); 1189c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type2 = T.Constant(value2); 1190c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(const_type1->Maybe(const_type2) == (*value1 == *value2)); 1191202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1192202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1193202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1194202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Class(M1)->Maybe(Class(M2)) iff M1 = M2 1195202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { 1196202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { 1197202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map1 = *mt1; 1198202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map2 = *mt2; 1199c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type1 = T.Class(map1); 1200c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type2 = T.Class(map2); 1201c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(class_type1->Maybe(class_type2) == (*map1 == *map2)); 12025b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 12035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org } 12045b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1205c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Constant(V)->Maybe(Class(M)) never 1206202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 1207202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1208202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 1209202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1210c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1211c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 1212c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!const_type->Maybe(class_type)); 1213202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1214202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 12154452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 1216c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Class(M)->Maybe(Constant(V)) never 1217202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 1218202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 1219202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Map> map = *mt; 1220202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org Handle<i::Object> value = *vt; 1221c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle const_type = T.Constant(value); 1222c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle class_type = T.Class(map); 1223c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!class_type->Maybe(const_type)); 1224202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1225202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org } 1226202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1227202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Basic types 12284452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.Boolean, T.Null, T.Semantic); 12294452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.Undefined, T.Null, T.Semantic); 12304452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.Boolean, T.Undefined, T.Semantic); 12314452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 12324452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.SignedSmall, T.Number, T.Semantic); 12337e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckOverlap(T.NaN, T.Number, T.Semantic); 12347e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckDisjoint(T.Signed32, T.NaN, T.Semantic); 12354452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 12364452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.UniqueName, T.Name, T.Semantic); 12374452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.String, T.Name, T.Semantic); 12384452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.InternalizedString, T.String, T.Semantic); 12394452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.InternalizedString, T.UniqueName, T.Semantic); 12404452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.InternalizedString, T.Name, T.Semantic); 12414452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.Symbol, T.UniqueName, T.Semantic); 12424452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.Symbol, T.Name, T.Semantic); 12434452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.String, T.UniqueName, T.Semantic); 12444452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.String, T.Symbol, T.Semantic); 12454452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.InternalizedString, T.Symbol, T.Semantic); 12464452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 12474452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.Object, T.Receiver, T.Semantic); 12484452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.Array, T.Object, T.Semantic); 12494452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.Function, T.Object, T.Semantic); 12504452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.Proxy, T.Receiver, T.Semantic); 12514452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.Object, T.Proxy, T.Semantic); 12524452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.Array, T.Function, T.Semantic); 12534452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 1254202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org // Structural types 12554452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.ObjectClass, T.Object, T.Semantic); 12564452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.ArrayClass, T.Object, T.Semantic); 12574452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.ObjectClass, T.ObjectClass, T.Semantic); 12584452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.ArrayClass, T.ArrayClass, T.Semantic); 12594452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.ObjectClass, T.ArrayClass, T.Semantic); 12604452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 12614452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.SmiConstant, T.SignedSmall, T.Semantic); 12624452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.SmiConstant, T.Signed32, T.Semantic); 12634452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.SmiConstant, T.Number, T.Semantic); 12644452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.ObjectConstant1, T.Object, T.Semantic); 12654452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.ObjectConstant2, T.Object, T.Semantic); 1266202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckOverlap(T.ArrayConstant, T.Object, T.Semantic); 1267202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckOverlap(T.ArrayConstant, T.Array, T.Semantic); 12684452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.ObjectConstant1, T.ObjectConstant1, T.Semantic); 12694452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.ObjectConstant1, T.ObjectConstant2, T.Semantic); 1270202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckDisjoint(T.ObjectConstant1, T.ArrayConstant, T.Semantic); 12714452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org 12724452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.ObjectConstant1, T.ObjectClass, T.Semantic); 12734452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.ObjectConstant2, T.ObjectClass, T.Semantic); 12744452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.ObjectConstant1, T.ArrayClass, T.Semantic); 12754452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.ObjectConstant2, T.ArrayClass, T.Semantic); 1276202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckDisjoint(T.ArrayConstant, T.ObjectClass, T.Semantic); 12779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 12787e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckOverlap(T.NumberArray, T.Array, T.Semantic); 12797e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckDisjoint(T.NumberArray, T.AnyArray, T.Semantic); 12807e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckDisjoint(T.NumberArray, T.StringArray, T.Semantic); 12819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 12829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckOverlap(T.MethodFunction, T.Function, T.Semantic); 12839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckDisjoint(T.SignedFunction1, T.NumberFunction1, T.Semantic); 12849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckDisjoint(T.SignedFunction1, T.NumberFunction2, T.Semantic); 12859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckDisjoint(T.NumberFunction1, T.NumberFunction2, T.Semantic); 12869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckDisjoint(T.SignedFunction1, T.MethodFunction, T.Semantic); 12876d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 12886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 12899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void Union1() { 1290c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Identity: Union(T, None) = T 1291c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1292c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1293c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union_type = T.Union(type, T.None); 1294c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union_type, type); 1295c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1296c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1297c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Domination: Union(T, Any) = Any 1298c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1299c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1300c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union_type = T.Union(type, T.Any); 1301c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union_type, T.Any); 1302c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1303c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1304c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Idempotence: Union(T, T) = T 1305c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1306c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1307c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union_type = T.Union(type, type); 1308c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union_type, type); 1309c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 13106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1311c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Commutativity: Union(T1, T2) = Union(T2, T1) 1312c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1313c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1314c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1315c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1316c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1317c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union21 = T.Union(type2, type1); 1318c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union12, union21); 1319c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1320c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1321c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1322c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Associativity: Union(T1, Union(T2, T3)) = Union(Union(T1, T2), T3) 1323c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1324c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1325c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1326c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1327c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1328c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1329c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1330c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union23 = T.Union(type2, type3); 1331c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union1_23 = T.Union(type1, union23); 1332c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12_3 = T.Union(union12, type3); 1333c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(union1_23, union12_3); 1334c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1335c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1336c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1337c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1338c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Meet: T1->Is(Union(T1, T2)) and T2->Is(Union(T1, T2)) 1339c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1340c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1341c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1342c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1343c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1344c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type1->Is(union12)); 1345c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(type2->Is(union12)); 1346c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1347c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1348c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1349c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Upper Boundedness: T1->Is(T2) implies Union(T1, T2) = T2 1350c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1351c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1352c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1353c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1354c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1355c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (type1->Is(type2)) CheckEqual(union12, type2); 1356c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1357c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 13589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 1359c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 13609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void Union2() { 1361c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T2) implies Union(T1, T3)->Is(Union(T2, T3)) 1362c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1363c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1364c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1365c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1366c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1367c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1368c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union13 = T.Union(type1, type3); 1369c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union23 = T.Union(type2, type3); 1370c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!type1->Is(type2) || union13->Is(union23)); 1371c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1372c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1373c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1374c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1375c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T3) and T2->Is(T3) implies Union(T1, T2)->Is(T3) 1376c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1377c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1378c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1379c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1380c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1381c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1382c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1383c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->Is(type3) && type2->Is(type3)) || union12->Is(type3)); 1384c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1385c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1386c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1387c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1388c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T2) or T1->Is(T3) implies T1->Is(Union(T2, T3)) 1389c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1390c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1391c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1392c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1393c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1394c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1395c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle union23 = T.Union(type2, type3); 1396c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->Is(type2) || type1->Is(type3)) || type1->Is(union23)); 1397c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1398c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1399c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 14006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Class-class 14026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectClass, T.ArrayClass), T.Object); 14036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Union(T.ObjectClass, T.ArrayClass), T.Array); 14044452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.Union(T.ObjectClass, T.ArrayClass), T.Array, T.Semantic); 14054452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.Union(T.ObjectClass, T.ArrayClass), T.Number, T.Semantic); 14066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Constant-constant 14086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectConstant1, T.ObjectConstant2), T.Object); 1409c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array); 14106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered( 14116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ObjectConstant2), T.ObjectClass); 14124452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap( 1413202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array, T.Semantic); 14144452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint( 1415202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayConstant), T.Number, T.Semantic); 14164452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint( 1417c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayConstant), T.ObjectClass, T.Semantic); 14186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Bitset-array 14209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(this->IsBitset(T.Union(T.AnyArray, T.Array))); 14217e6132b924829c353864933f29124419916db550machenbach@chromium.org CHECK(this->IsUnion(T.Union(T.NumberArray, T.Number))); 14229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 14239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(T.Union(T.AnyArray, T.Array), T.Array); 14249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.Union(T.AnyArray, T.String), T.Array); 14257e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckOverlap(T.Union(T.NumberArray, T.String), T.Object, T.Semantic); 14267e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckDisjoint(T.Union(T.NumberArray, T.String), T.Number, T.Semantic); 14279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 14289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Bitset-function 14299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(this->IsBitset(T.Union(T.MethodFunction, T.Function))); 14309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CHECK(this->IsUnion(T.Union(T.NumberFunction1, T.Number))); 14319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 14329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(T.Union(T.MethodFunction, T.Function), T.Function); 14339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckUnordered(T.Union(T.NumberFunction1, T.String), T.Function); 14349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckOverlap(T.Union(T.NumberFunction2, T.String), T.Object, T.Semantic); 14359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckDisjoint(T.Union(T.NumberFunction1, T.String), T.Number, T.Semantic); 14369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 14376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Bitset-class 14384452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub( 14394452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.ObjectClass, T.SignedSmall), T.Union(T.Object, T.Number)); 14406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectClass, T.Array), T.Object); 14416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Union(T.ObjectClass, T.String), T.Array); 14424452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.Union(T.ObjectClass, T.String), T.Object, T.Semantic); 14434452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.Union(T.ObjectClass, T.String), T.Number, T.Semantic); 14446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Bitset-constant 14466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 14476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.Signed32), T.Union(T.Object, T.Number)); 14486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectConstant1, T.Array), T.Object); 14496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.Union(T.ObjectConstant1, T.String), T.Array); 14504452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckOverlap(T.Union(T.ObjectConstant1, T.String), T.Object, T.Semantic); 14514452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint(T.Union(T.ObjectConstant1, T.String), T.Number, T.Semantic); 14526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Class-constant 14546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub(T.Union(T.ObjectConstant1, T.ArrayClass), T.Object); 14556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckUnordered(T.ObjectClass, T.Union(T.ObjectConstant1, T.ArrayClass)); 14566d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 14576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayClass), T.Union(T.Array, T.Object)); 1458202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayClass), T.ArrayConstant); 14594452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint( 14604452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayClass), T.ObjectConstant2, 14614452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Semantic); 14624452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckDisjoint( 14634452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.ObjectConstant1, T.ArrayClass), T.ObjectClass, T.Semantic); 14646d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Bitset-union 14666d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 14677e6132b924829c353864933f29124419916db550machenbach@chromium.org T.NaN, 14686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number)); 14696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 14707e6132b924829c353864933f29124419916db550machenbach@chromium.org T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Signed32), 14716d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.Union(T.Number, T.ArrayClass))); 14726d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Class-union 14746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckSub( 14756d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectClass, T.Union(T.ObjectConstant1, T.ObjectClass)), 14766d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Object); 14776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 14786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Union(T.ArrayClass, T.ObjectConstant2), T.ArrayClass), 14796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ArrayClass, T.ObjectConstant2)); 14806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Constant-union 14826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 14836d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 14846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)), 14856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1)); 14866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 14876d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 1488202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org T.Union(T.ArrayConstant, T.ObjectConstant2), T.ObjectConstant1), 14896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 1490202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org T.ObjectConstant2, T.Union(T.ArrayConstant, T.ObjectConstant1))); 14916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 14929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Array-union 14939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 14947e6132b924829c353864933f29124419916db550machenbach@chromium.org T.Union(T.AnyArray, T.Union(T.NumberArray, T.AnyArray)), 14957e6132b924829c353864933f29124419916db550machenbach@chromium.org T.Union(T.AnyArray, T.NumberArray)); 14967e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckSub(T.Union(T.AnyArray, T.NumberArray), T.Array); 14979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 14989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Function-union 14999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 15009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Union(T.NumberFunction1, T.NumberFunction2), 15019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Union(T.NumberFunction2, T.NumberFunction1)); 15029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.Union(T.SignedFunction1, T.MethodFunction), T.Function); 15039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 15046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Union-union 15056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 15066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 15076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1), 15086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ObjectConstant2)), 15096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1)); 15106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 15116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 15124452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.Number, T.ArrayClass), 15134452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.SignedSmall, T.Array)), 15146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Number, T.Array)); 15156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 15166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 15179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void Intersect1() { 1518c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Identity: Intersect(T, Any) = T 1519c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1520c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1521c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect_type = T.Intersect(type, T.Any); 1522c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect_type, type); 1523c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 15246d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1525c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Domination: Intersect(T, None) = None 1526c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1527c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1528c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect_type = T.Intersect(type, T.None); 1529c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect_type, T.None); 1530c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 15316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1532c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Idempotence: Intersect(T, T) = T 1533c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1534c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type = *it; 1535c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect_type = T.Intersect(type, type); 1536c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect_type, type); 1537c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 15386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1539c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Commutativity: Intersect(T1, T2) = Intersect(T2, T1) 1540c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1541c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1542c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1543c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1544c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1545c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect21 = T.Intersect(type2, type1); 1546c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect12, intersect21); 1547c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1548c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 15496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1550c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Associativity: 1551c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Intersect(T1, Intersect(T2, T3)) = Intersect(Intersect(T1, T2), T3) 1552c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1553c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1554c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1555c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1556c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1557c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1558c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1559c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect23 = T.Intersect(type2, type3); 1560c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect1_23 = T.Intersect(type1, intersect23); 1561c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12_3 = T.Intersect(intersect12, type3); 1562c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(intersect1_23, intersect12_3); 1563c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1564c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1565c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 15666d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1567c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Join: Intersect(T1, T2)->Is(T1) and Intersect(T1, T2)->Is(T2) 1568c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1569c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1570c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1571c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1572c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1573c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(intersect12->Is(type1)); 1574c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(intersect12->Is(type2)); 1575c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1576c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 15776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1578c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Lower Boundedness: T1->Is(T2) implies Intersect(T1, T2) = T1 1579c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1580c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1581c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1582c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1583c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1584c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (type1->Is(type2)) CheckEqual(intersect12, type1); 1585c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1586c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 15879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org } 1588c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 15899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org void Intersect2() { 1590c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T2) implies Intersect(T1, T3)->Is(Intersect(T2, T3)) 1591c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1592c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1593c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1594c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1595c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1596c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1597c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect13 = T.Intersect(type1, type3); 1598c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect23 = T.Intersect(type2, type3); 1599c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!type1->Is(type2) || intersect13->Is(intersect23)); 1600c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1601c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1602c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 16036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1604c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T3) or T2->Is(T3) implies Intersect(T1, T2)->Is(T3) 1605c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1606c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1607c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1608c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1609c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1610c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1611c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1612c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->Is(type3) || type2->Is(type3)) || 1613c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org intersect12->Is(type3)); 1614c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1615c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1616c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1617c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1618c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Monotonicity: T1->Is(T2) and T1->Is(T3) implies T1->Is(Intersect(T2, T3)) 1619c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1620c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1621c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1622c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it1; 1623c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type2 = *it2; 1624c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = *it3; 1625c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle intersect23 = T.Intersect(type2, type3); 1626c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CHECK(!(type1->Is(type2) && type1->Is(type3)) || 1627c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org type1->Is(intersect23)); 1628c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1629c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1630c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 1631c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 1632c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Bitset-class 16336d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual(T.Intersect(T.ObjectClass, T.Object), T.ObjectClass); 16344452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub(T.Intersect(T.ObjectClass, T.Array), T.Representation); 16354452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org CheckSub(T.Intersect(T.ObjectClass, T.Number), T.Representation); 16366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 16379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Bitset-array 16387e6132b924829c353864933f29124419916db550machenbach@chromium.org CheckEqual(T.Intersect(T.NumberArray, T.Object), T.NumberArray); 16399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.Intersect(T.AnyArray, T.Function), T.Representation); 16409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 16419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Bitset-function 16429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual(T.Intersect(T.MethodFunction, T.Object), T.MethodFunction); 16439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckSub(T.Intersect(T.NumberFunction1, T.Array), T.Representation); 16446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 16456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Bitset-union 16466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect(T.Object, T.Union(T.ObjectConstant1, T.ObjectClass)), 16486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ObjectClass)); 1649d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1650d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org !T.Intersect(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number) 1651d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org ->IsInhabited()); 16526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 16539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Class-constant 1654d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(!T.Intersect(T.ObjectConstant1, T.ObjectClass)->IsInhabited()); 1655d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(!T.Intersect(T.ArrayClass, T.ObjectConstant2)->IsInhabited()); 16569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 16579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Array-union 16589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 16597e6132b924829c353864933f29124419916db550machenbach@chromium.org T.Intersect(T.NumberArray, T.Union(T.NumberArray, T.ArrayClass)), 16607e6132b924829c353864933f29124419916db550machenbach@chromium.org T.NumberArray); 16619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 16629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Intersect(T.AnyArray, T.Union(T.Object, T.SmiConstant)), 16639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.AnyArray); 1664d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1665d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org !T.Intersect(T.Union(T.AnyArray, T.ArrayConstant), T.NumberArray) 1666d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org ->IsInhabited()); 16679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 16689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org // Function-union 16699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 16709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Intersect(T.MethodFunction, T.Union(T.String, T.MethodFunction)), 16719fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.MethodFunction); 16729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CheckEqual( 16739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.Intersect(T.NumberFunction1, T.Union(T.Object, T.SmiConstant)), 16749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org T.NumberFunction1); 1675d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1676d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org !T.Intersect(T.Union(T.MethodFunction, T.Name), T.NumberFunction2) 1677d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org ->IsInhabited()); 16789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 16796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Class-union 16806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect(T.ArrayClass, T.Union(T.ObjectConstant2, T.ArrayClass)), 16826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ArrayClass); 16836d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect(T.ArrayClass, T.Union(T.Object, T.SmiConstant)), 16856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ArrayClass); 1686d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1687d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org !T.Intersect(T.Union(T.ObjectClass, T.ArrayConstant), T.ArrayClass) 1688d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org ->IsInhabited()); 16896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 16906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Constant-union 16916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16926d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 16936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)), 16946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ObjectConstant1); 16956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 16966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect(T.SmiConstant, T.Union(T.Number, T.ObjectConstant2)), 16976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.SmiConstant); 1698d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK( 1699d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org !T.Intersect( 1700d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org T.Union(T.ArrayConstant, T.ObjectClass), T.ObjectConstant1) 1701d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org ->IsInhabited()); 17026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 17036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org // Union-union 17046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 17056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 17066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Number, T.ArrayClass), 17074452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.SignedSmall, T.Array)), 17084452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org T.Union(T.SignedSmall, T.ArrayClass)); 17096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 17106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 17116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Number, T.ObjectClass), 17126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.Signed32, T.Array)), 17136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Signed32); 17146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 17156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 17166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1), 17176d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant1, T.ObjectConstant2)), 17186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1)); 17196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org CheckEqual( 17206d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Intersect( 17216d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 17226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1), T.ArrayClass), 17236d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union( 17246d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.ObjectConstant1, 1725202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org T.Union(T.ArrayConstant, T.ObjectConstant2))), 17266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org T.Union(T.ObjectConstant2, T.ObjectConstant1)); 17276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 1728af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 1729e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org void Distributivity1() { 1730d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Distributivity: 1731d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Union(T1, Intersect(T2, T3)) = Intersect(Union(T1, T2), Union(T1, T3)) 1732d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1733d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1734d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1735d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type1 = *it1; 1736d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type2 = *it2; 1737d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type3 = *it3; 1738d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union12 = T.Union(type1, type2); 1739d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union13 = T.Union(type1, type3); 1740d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect23 = T.Intersect(type2, type3); 1741d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union1_23 = T.Union(type1, intersect23); 1742d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect12_13 = T.Intersect(union12, union13); 1743d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(Equal(union1_23, intersect12_13)); 1744d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1745d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1746d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1747e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org } 1748d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 1749e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org void Distributivity2() { 1750d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Distributivity: 1751d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org // Intersect(T1, Union(T2, T3)) = Union(Intersect(T1, T2), Intersect(T1,T3)) 1752d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1753d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1754d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1755d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type1 = *it1; 1756d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type2 = *it2; 1757d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle type3 = *it3; 1758d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect12 = T.Intersect(type1, type2); 1759d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect13 = T.Intersect(type1, type3); 1760d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union23 = T.Union(type2, type3); 1761d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle intersect1_23 = T.Intersect(type1, union23); 1762d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org TypeHandle union12_13 = T.Union(intersect12, intersect13); 1763d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CHECK(Equal(intersect1_23, union12_13)); 1764d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1765d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1766d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1767d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org } 1768d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 1769af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org template<class Type2, class TypeHandle2, class Region2, class Rep2> 1770af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org void Convert() { 1771af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org Types<Type2, TypeHandle2, Region2> T2( 1772af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org Rep2::ToRegion(&zone, isolate), isolate); 1773202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1774c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type1 = *it; 1775c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle2 type2 = T2.template Convert<Type>(type1); 1776c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org TypeHandle type3 = T.template Convert<Type2>(type2); 1777c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org CheckEqual(type1, type3); 1778af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org } 1779af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org } 1780eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org 1781eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org void HTypeFromType() { 1782eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1783eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1784eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org TypeHandle type1 = *it1; 1785eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org TypeHandle type2 = *it2; 1786eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org HType htype1 = HType::FromType<Type>(type1); 1787eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org HType htype2 = HType::FromType<Type>(type2); 1788eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org CHECK(!type1->Is(type2) || htype1.IsSubtypeOf(htype2)); 1789eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 1790eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 1791eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org } 1792dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}; 1793dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 17946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtypedef Tests<Type, Type*, Zone, ZoneRep> ZoneTests; 17956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtypedef Tests<HeapType, Handle<HeapType>, Isolate, HeapRep> HeapTests; 17966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 1797dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 17989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(BitsetType) { 1799dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 18006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Bitset(); 18016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Bitset(); 1802dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 1803dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 1804dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 18059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ClassType) { 1806dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 18076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Class(); 18086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Class(); 1809dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 1810dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 1811dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 18129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ConstantType) { 1813dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 18146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Constant(); 18156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Constant(); 1816dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 1817dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 1818dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 18199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ArrayType) { 18209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CcTest::InitializeVM(); 18219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Array(); 18229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Array(); 18239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org} 18249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 18259fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 18269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(FunctionType) { 18279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CcTest::InitializeVM(); 18289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Function(); 18299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Function(); 18309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org} 18319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 18329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 1833202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(Of) { 1834202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CcTest::InitializeVM(); 1835202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ZoneTests().Of(); 1836202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org HeapTests().Of(); 1837202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org} 1838202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1839202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1840202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(NowOf) { 1841202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CcTest::InitializeVM(); 1842202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ZoneTests().NowOf(); 1843202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org HeapTests().NowOf(); 1844202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org} 1845202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1846202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1847d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgTEST(Bounds) { 1848d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CcTest::InitializeVM(); 1849d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org ZoneTests().Bounds(); 1850d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org HeapTests().Bounds(); 1851d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org} 1852d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 1853d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 1854dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgTEST(Is) { 1855dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 18566d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Is(); 18576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Is(); 1858dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 1859dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 1860dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 18615b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgTEST(NowIs) { 18625b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CcTest::InitializeVM(); 18635b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org ZoneTests().NowIs(); 18645b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org HeapTests().NowIs(); 18655b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org} 18665b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 18675b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 18685b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgTEST(Contains) { 18695b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org CcTest::InitializeVM(); 18705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org ZoneTests().Contains(); 18715b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org HeapTests().Contains(); 18725b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org} 18735b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 18745b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1875202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(NowContains) { 1876202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org CcTest::InitializeVM(); 1877202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org ZoneTests().NowContains(); 1878202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org HeapTests().NowContains(); 1879202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org} 1880202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1881202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org 1882dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgTEST(Maybe) { 1883dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 18846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ZoneTests().Maybe(); 18856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org HeapTests().Maybe(); 1886dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 1887dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 1888dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 18899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Union1) { 18909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CcTest::InitializeVM(); 18919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Union1(); 18929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Union1(); 18939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org} 18949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 18959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 18969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Union2) { 18979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org CcTest::InitializeVM(); 18989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Union2(); 18999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Union2(); 19009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org} 19019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 19029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org 19039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Intersect1) { 1904dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org CcTest::InitializeVM(); 19059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Intersect1(); 19069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Intersect1(); 1907dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org} 19081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 19109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Intersect2) { 19111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CcTest::InitializeVM(); 19129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org ZoneTests().Intersect2(); 19139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org HeapTests().Intersect2(); 19141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 1915af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 1916af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org 1917e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.orgTEST(Distributivity1) { 1918e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org CcTest::InitializeVM(); 1919e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org ZoneTests().Distributivity1(); 1920e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org HeapTests().Distributivity1(); 1921e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org} 1922e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org 1923e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org 1924e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.orgTEST(Distributivity2) { 1925d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org CcTest::InitializeVM(); 1926e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org ZoneTests().Distributivity2(); 1927e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org HeapTests().Distributivity2(); 1928d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org} 1929d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 1930d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org 1931af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTEST(Convert) { 1932af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org CcTest::InitializeVM(); 1933af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); 1934af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); 1935af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org} 1936eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org 1937eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org 1938eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.orgTEST(HTypeFromType) { 1939eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org CcTest::InitializeVM(); 1940eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org ZoneTests().HTypeFromType(); 1941eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org HeapTests().HTypeFromType(); 1942eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org} 1943