| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 #define DECLARE_TYPE(name, value) \ | 43 #define DECLARE_TYPE(name, value) \ |
| 44 name = Type::name(region); \ | 44 name = Type::name(region); \ |
| 45 types.push_back(name); | 45 types.push_back(name); |
| 46 BITSET_TYPE_LIST(DECLARE_TYPE) | 46 BITSET_TYPE_LIST(DECLARE_TYPE) |
| 47 #undef DECLARE_TYPE | 47 #undef DECLARE_TYPE |
| 48 | 48 |
| 49 object_map = isolate->factory()->NewMap(JS_OBJECT_TYPE, 3 * kPointerSize); | 49 object_map = isolate->factory()->NewMap(JS_OBJECT_TYPE, 3 * kPointerSize); |
| 50 array_map = isolate->factory()->NewMap(JS_ARRAY_TYPE, 4 * kPointerSize); | 50 array_map = isolate->factory()->NewMap(JS_ARRAY_TYPE, 4 * kPointerSize); |
| 51 ObjectClass = Type::Class(object_map, region); | 51 ObjectClass = Type::Class(object_map, region); |
| 52 ArrayClass = Type::Class(array_map, region); | 52 ArrayClass = Type::Class(array_map, region); |
| 53 types.push_back(ObjectClass); | 53 |
| 54 types.push_back(ArrayClass); | 54 maps.push_back(object_map); |
| 55 maps.push_back(array_map); |
| 56 for (MapVector::iterator it = maps.begin(); it != maps.end(); ++it) { |
| 57 types.push_back(Type::Class(*it, region)); |
| 58 } |
| 55 | 59 |
| 56 smi = handle(Smi::FromInt(666), isolate); | 60 smi = handle(Smi::FromInt(666), isolate); |
| 57 signed32 = isolate->factory()->NewHeapNumber(0x40000000); | 61 signed32 = isolate->factory()->NewHeapNumber(0x40000000); |
| 58 object1 = isolate->factory()->NewJSObjectFromMap(object_map); | 62 object1 = isolate->factory()->NewJSObjectFromMap(object_map); |
| 59 object2 = isolate->factory()->NewJSObjectFromMap(object_map); | 63 object2 = isolate->factory()->NewJSObjectFromMap(object_map); |
| 60 array = isolate->factory()->NewJSArray(20); | 64 array = isolate->factory()->NewJSArray(20); |
| 65 SmiConstant = Type::Constant(smi, region); |
| 66 Signed32Constant = Type::Constant(signed32, region); |
| 67 ObjectConstant1 = Type::Constant(object1, region); |
| 68 ObjectConstant2 = Type::Constant(object2, region); |
| 69 ArrayConstant = Type::Constant(array, region); |
| 70 |
| 61 values.push_back(smi); | 71 values.push_back(smi); |
| 62 values.push_back(signed32); | 72 values.push_back(signed32); |
| 63 values.push_back(object1); | 73 values.push_back(object1); |
| 64 values.push_back(object2); | 74 values.push_back(object2); |
| 65 values.push_back(array); | 75 values.push_back(array); |
| 66 SmiConstant = Type::Constant(smi, region); | |
| 67 Signed32Constant = Type::Constant(signed32, region); | |
| 68 ObjectConstant1 = Type::Constant(object1, region); | |
| 69 ObjectConstant2 = Type::Constant(object2, region); | |
| 70 ArrayConstant = Type::Constant(array, region); | |
| 71 for (ValueVector::iterator it = values.begin(); it != values.end(); ++it) { | 76 for (ValueVector::iterator it = values.begin(); it != values.end(); ++it) { |
| 72 types.push_back(Type::Constant(*it, region)); | 77 types.push_back(Type::Constant(*it, region)); |
| 73 } | 78 } |
| 74 | 79 |
| 75 while (types.size() < kMaxTypes) { | 80 while (types.size() < kMaxTypes) { |
| 76 size_t i = rng.NextInt(types.size()); | 81 size_t i = rng.NextInt(types.size()); |
| 77 size_t j = rng.NextInt(types.size()); | 82 size_t j = rng.NextInt(types.size()); |
| 78 if (i != j) types.push_back(Type::Union(types[i], types[j], region)); | 83 if (i != j) types.push_back(Type::Union(types[i], types[j], region)); |
| 79 } | 84 } |
| 80 } | 85 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 97 Handle<i::Map> object_map; | 102 Handle<i::Map> object_map; |
| 98 Handle<i::Map> array_map; | 103 Handle<i::Map> array_map; |
| 99 | 104 |
| 100 Handle<i::Smi> smi; | 105 Handle<i::Smi> smi; |
| 101 Handle<i::HeapNumber> signed32; | 106 Handle<i::HeapNumber> signed32; |
| 102 Handle<i::JSObject> object1; | 107 Handle<i::JSObject> object1; |
| 103 Handle<i::JSObject> object2; | 108 Handle<i::JSObject> object2; |
| 104 Handle<i::JSArray> array; | 109 Handle<i::JSArray> array; |
| 105 | 110 |
| 106 typedef std::vector<TypeHandle> TypeVector; | 111 typedef std::vector<TypeHandle> TypeVector; |
| 112 typedef std::vector<Handle<i::Map> > MapVector; |
| 113 typedef std::vector<Handle<i::Object> > ValueVector; |
| 107 TypeVector types; | 114 TypeVector types; |
| 108 | 115 MapVector maps; |
| 109 typedef std::vector<Handle<i::Object> > ValueVector; | |
| 110 ValueVector values; | 116 ValueVector values; |
| 111 | 117 |
| 112 TypeHandle Of(Handle<i::Object> obj) { | 118 TypeHandle Of(Handle<i::Object> value) { |
| 113 return Type::Of(obj, region_); | 119 return Type::Of(value, region_); |
| 114 } | 120 } |
| 115 | 121 |
| 116 TypeHandle NowOf(Handle<i::Object> obj) { | 122 TypeHandle NowOf(Handle<i::Object> value) { |
| 117 return Type::NowOf(obj, region_); | 123 return Type::NowOf(value, region_); |
| 118 } | 124 } |
| 119 | 125 |
| 120 TypeHandle Constant(Handle<i::Object> obj) { | 126 TypeHandle Constant(Handle<i::Object> value) { |
| 121 return Type::Constant(obj, region_); | 127 return Type::Constant(value, region_); |
| 128 } |
| 129 |
| 130 TypeHandle Class(Handle<i::Map> map) { |
| 131 return Type::Class(map, region_); |
| 122 } | 132 } |
| 123 | 133 |
| 124 TypeHandle Union(TypeHandle t1, TypeHandle t2) { | 134 TypeHandle Union(TypeHandle t1, TypeHandle t2) { |
| 125 return Type::Union(t1, t2, region_); | 135 return Type::Union(t1, t2, region_); |
| 126 } | 136 } |
| 127 TypeHandle Intersect(TypeHandle t1, TypeHandle t2) { | 137 TypeHandle Intersect(TypeHandle t1, TypeHandle t2) { |
| 128 return Type::Intersect(t1, t2, region_); | 138 return Type::Intersect(t1, t2, region_); |
| 129 } | 139 } |
| 130 | 140 |
| 131 template<class Type2, class TypeHandle2> | 141 template<class Type2, class TypeHandle2> |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 static int Length(Struct* structured) { return structured->length() - 1; } | 204 static int Length(Struct* structured) { return structured->length() - 1; } |
| 195 | 205 |
| 196 static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; } | 206 static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; } |
| 197 }; | 207 }; |
| 198 | 208 |
| 199 | 209 |
| 200 template<class Type, class TypeHandle, class Region, class Rep> | 210 template<class Type, class TypeHandle, class Region, class Rep> |
| 201 struct Tests : Rep { | 211 struct Tests : Rep { |
| 202 typedef Types<Type, TypeHandle, Region> TypesInstance; | 212 typedef Types<Type, TypeHandle, Region> TypesInstance; |
| 203 typedef typename TypesInstance::TypeVector::iterator TypeIterator; | 213 typedef typename TypesInstance::TypeVector::iterator TypeIterator; |
| 214 typedef typename TypesInstance::MapVector::iterator MapIterator; |
| 204 typedef typename TypesInstance::ValueVector::iterator ValueIterator; | 215 typedef typename TypesInstance::ValueVector::iterator ValueIterator; |
| 205 | 216 |
| 206 Isolate* isolate; | 217 Isolate* isolate; |
| 207 HandleScope scope; | 218 HandleScope scope; |
| 208 Zone zone; | 219 Zone zone; |
| 209 TypesInstance T; | 220 TypesInstance T; |
| 210 | 221 |
| 211 Tests() : | 222 Tests() : |
| 212 isolate(CcTest::i_isolate()), | 223 isolate(CcTest::i_isolate()), |
| 213 scope(isolate), | 224 scope(isolate), |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 CHECK(!type2->Is(type1)); | 277 CHECK(!type2->Is(type1)); |
| 267 CHECK(!type1->Maybe(type2)); | 278 CHECK(!type1->Maybe(type2)); |
| 268 CHECK(!type2->Maybe(type1)); | 279 CHECK(!type2->Maybe(type1)); |
| 269 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { | 280 if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) { |
| 270 CHECK_EQ(0, | 281 CHECK_EQ(0, |
| 271 Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask)); | 282 Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask)); |
| 272 } | 283 } |
| 273 } | 284 } |
| 274 | 285 |
| 275 void Bitset() { | 286 void Bitset() { |
| 287 // None and Any are bitsets. |
| 276 CHECK(this->IsBitset(T.None)); | 288 CHECK(this->IsBitset(T.None)); |
| 277 CHECK(this->IsBitset(T.Any)); | 289 CHECK(this->IsBitset(T.Any)); |
| 278 CHECK(this->IsBitset(T.String)); | |
| 279 CHECK(this->IsBitset(T.Object)); | |
| 280 | |
| 281 CHECK(this->IsBitset(T.Union(T.String, T.Number))); | |
| 282 CHECK(this->IsBitset(T.Union(T.String, T.Receiver))); | |
| 283 | 290 |
| 284 CHECK_EQ(0, this->AsBitset(T.None)); | 291 CHECK_EQ(0, this->AsBitset(T.None)); |
| 285 CHECK_EQ( | 292 CHECK_EQ(-1, this->AsBitset(T.Any)); |
| 286 this->AsBitset(T.Number) | this->AsBitset(T.String), | 293 |
| 287 this->AsBitset(T.Union(T.String, T.Number))); | 294 // Union(T1, T2) is a bitset for all bitsets T1,T2 |
| 288 CHECK_EQ( | 295 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 289 this->AsBitset(T.Receiver), | 296 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 290 this->AsBitset(T.Union(T.Receiver, T.Object))); | 297 TypeHandle type1 = *it1; |
| 298 TypeHandle type2 = *it2; |
| 299 CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) || |
| 300 this->IsBitset(T.Union(type1, type2))); |
| 301 } |
| 302 } |
| 303 |
| 304 // Union(T1, T2) is a bitset if T2 is a bitset and T1->Is(T2) |
| 305 // (and vice versa). |
| 306 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 307 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 308 TypeHandle type1 = *it1; |
| 309 TypeHandle type2 = *it2; |
| 310 CHECK(!(this->IsBitset(type2) && type1->Is(type2)) || |
| 311 this->IsBitset(T.Union(type1, type2))); |
| 312 CHECK(!(this->IsBitset(type1) && type2->Is(type1)) || |
| 313 this->IsBitset(T.Union(type1, type2))); |
| 314 } |
| 315 } |
| 316 |
| 317 // Union(T1, T2) is bitwise disjunction for all bitsets T1,T2 |
| 318 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 319 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 320 TypeHandle type1 = *it1; |
| 321 TypeHandle type2 = *it2; |
| 322 if (this->IsBitset(type1) && this->IsBitset(type2)) { |
| 323 CHECK_EQ( |
| 324 this->AsBitset(type1) | this->AsBitset(type2), |
| 325 this->AsBitset(T.Union(type1, type2))); |
| 326 } |
| 327 } |
| 328 } |
| 329 |
| 330 // Intersect(T1, T2) is bitwise conjunction for all bitsets T1,T2 |
| 331 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 332 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 333 TypeHandle type1 = *it1; |
| 334 TypeHandle type2 = *it2; |
| 335 if (this->IsBitset(type1) && this->IsBitset(type2)) { |
| 336 CHECK_EQ( |
| 337 this->AsBitset(type1) & this->AsBitset(type2), |
| 338 this->AsBitset(T.Intersect(type1, type2))); |
| 339 } |
| 340 } |
| 341 } |
| 291 } | 342 } |
| 292 | 343 |
| 293 void Class() { | 344 void Class() { |
| 294 CHECK(this->IsClass(T.ObjectClass)); | 345 // Constructor |
| 295 CHECK(this->IsClass(T.ArrayClass)); | 346 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
| 347 Handle<i::Map> map = *mt; |
| 348 CHECK(this->IsClass(T.Class(map))); |
| 349 } |
| 296 | 350 |
| 297 CHECK(*T.object_map == this->AsClass(T.ObjectClass)); | 351 // Map attribute |
| 298 CHECK(*T.array_map == this->AsClass(T.ArrayClass)); | 352 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
| 353 Handle<i::Map> map = *mt; |
| 354 CHECK(*map == *T.Class(map)->AsClass()); |
| 355 } |
| 356 |
| 357 // Functionality & Injectivity |
| 358 for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { |
| 359 for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { |
| 360 Handle<i::Map> map1 = *mt1; |
| 361 Handle<i::Map> map2 = *mt2; |
| 362 CHECK(T.Class(map1)->Is(T.Class(map2)) == (*map1 == *map2)); |
| 363 } |
| 364 } |
| 299 } | 365 } |
| 300 | 366 |
| 301 void Constant() { | 367 void Constant() { |
| 302 CHECK(this->IsConstant(T.SmiConstant)); | 368 // Constructor |
| 303 CHECK(this->IsConstant(T.ObjectConstant1)); | 369 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 304 CHECK(this->IsConstant(T.ObjectConstant2)); | 370 Handle<i::Object> value = *vt; |
| 305 CHECK(this->IsConstant(T.ArrayConstant)); | 371 CHECK(this->IsConstant(T.Constant(value))); |
| 372 } |
| 306 | 373 |
| 307 CHECK(*T.smi == this->AsConstant(T.SmiConstant)); | 374 // Value attribute |
| 308 CHECK(*T.object1 == this->AsConstant(T.ObjectConstant1)); | 375 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 309 CHECK(*T.object2 == this->AsConstant(T.ObjectConstant2)); | 376 Handle<i::Object> value = *vt; |
| 310 CHECK(*T.object1 != this->AsConstant(T.ObjectConstant2)); | 377 CHECK(*value == *T.Constant(value)->AsConstant()); |
| 311 CHECK(*T.array == this->AsConstant(T.ArrayConstant)); | 378 } |
| 379 |
| 380 // Functionality & Injectivity |
| 381 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { |
| 382 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { |
| 383 Handle<i::Object> val1 = *vt1; |
| 384 Handle<i::Object> val2 = *vt2; |
| 385 CHECK(T.Constant(val1)->Is(T.Constant(val2)) == (*val1 == *val2)); |
| 386 } |
| 387 } |
| 312 } | 388 } |
| 313 | 389 |
| 314 void Of() { | 390 void Of() { |
| 315 CHECK(T.Of(T.smi)->Is(T.SignedSmall)); | 391 // Constant(V)->Is(Of(V)) for all V |
| 316 CHECK(T.Of(T.signed32)->Is(T.Signed32)); | 392 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 317 CHECK(T.Of(T.object1)->Is(T.Object)); | 393 Handle<i::Object> value = *vt; |
| 318 CHECK(T.Of(T.object2)->Is(T.Object)); | 394 CHECK(T.Constant(value)->Is(T.Of(value))); |
| 319 CHECK(T.Of(T.array)->Is(T.Array)); | 395 } |
| 396 |
| 397 // Constant(V)->Is(T) implies Of(V)->Is(T) or T->Maybe(Constant(V)) |
| 398 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 399 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 400 Handle<i::Object> value = *vt; |
| 401 TypeHandle type = *it; |
| 402 CHECK(!T.Constant(value)->Is(type) || |
| 403 T.Of(value)->Is(type) || type->Maybe(T.Constant(value))); |
| 404 } |
| 405 } |
| 320 } | 406 } |
| 321 | 407 |
| 322 void NowOf() { | 408 void NowOf() { |
| 409 // Constant(V)->NowIs(NowOf(V)) for all V |
| 410 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 411 Handle<i::Object> value = *vt; |
| 412 CHECK(T.Constant(value)->NowIs(T.NowOf(value))); |
| 413 } |
| 414 |
| 323 // NowOf(V)->Is(Of(V)) for all V | 415 // NowOf(V)->Is(Of(V)) for all V |
| 324 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 416 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 325 Handle<i::Object> val = *vt; | 417 Handle<i::Object> value = *vt; |
| 326 CHECK(T.NowOf(val)->Is(T.Of(val))); | 418 CHECK(T.NowOf(value)->Is(T.Of(value))); |
| 327 } | 419 } |
| 328 | 420 |
| 329 CHECK(T.NowOf(T.smi)->NowIs(T.SignedSmall)); | 421 // Constant(V)->Is(T) implies NowOf(V)->Is(T) or T->Maybe(Constant(V)) |
| 330 CHECK(T.NowOf(T.signed32)->NowIs(T.Signed32)); | 422 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 331 CHECK(T.NowOf(T.object1)->NowIs(T.ObjectClass)); | 423 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 332 CHECK(T.NowOf(T.object2)->NowIs(T.ObjectClass)); | 424 Handle<i::Object> value = *vt; |
| 333 CHECK(T.NowOf(T.array)->NowIs(T.Array)); | 425 TypeHandle type = *it; |
| 426 CHECK(!T.Constant(value)->Is(type) || |
| 427 T.NowOf(value)->Is(type) || type->Maybe(T.Constant(value))); |
| 428 } |
| 429 } |
| 430 |
| 431 // Constant(V)->NowIs(T) implies NowOf(V)->NowIs(T) or T->Maybe(Constant(V)) |
| 432 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 433 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 434 Handle<i::Object> value = *vt; |
| 435 TypeHandle type = *it; |
| 436 CHECK(!T.Constant(value)->NowIs(type) || |
| 437 T.NowOf(value)->NowIs(type) || type->Maybe(T.Constant(value))); |
| 438 } |
| 439 } |
| 334 } | 440 } |
| 335 | 441 |
| 336 void Is() { | 442 void Is() { |
| 337 // T->Is(None) implies T = None for all T | 443 // T->Is(None) implies T = None for all T |
| 338 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 444 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 339 TypeHandle type = *it; | 445 TypeHandle type = *it; |
| 340 if (type->Is(T.None)) CheckEqual(type, T.None); | 446 if (type->Is(T.None)) CheckEqual(type, T.None); |
| 341 } | 447 } |
| 342 | 448 |
| 343 // None->Is(T) for all T | 449 // None->Is(T) for all T |
| (...skipping 20 matching lines...) Expand all Loading... |
| 364 CHECK(type->Is(type)); | 470 CHECK(type->Is(type)); |
| 365 } | 471 } |
| 366 | 472 |
| 367 // Transitivity | 473 // Transitivity |
| 368 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { | 474 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 369 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { | 475 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 370 for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { | 476 for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { |
| 371 TypeHandle type1 = *it1; | 477 TypeHandle type1 = *it1; |
| 372 TypeHandle type2 = *it2; | 478 TypeHandle type2 = *it2; |
| 373 TypeHandle type3 = *it3; | 479 TypeHandle type3 = *it3; |
| 374 CHECK(!type1->Is(type2) || | 480 CHECK(!(type1->Is(type2) && type2->Is(type3)) || type1->Is(type3)); |
| 375 !type2->Is(type3) || | |
| 376 type1->Is(type3)); | |
| 377 } | 481 } |
| 378 } | 482 } |
| 379 } | 483 } |
| 380 | 484 |
| 381 // Symmetry and Transitivity | 485 // Constant(V1)->Is(Constant(V2)) iff V1 = V2 |
| 382 CheckSub(T.None, T.Number); | 486 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { |
| 383 CheckSub(T.None, T.Any); | 487 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { |
| 488 Handle<i::Object> val1 = *vt1; |
| 489 Handle<i::Object> val2 = *vt2; |
| 490 CHECK(T.Constant(val1)->Is(T.Constant(val2)) == (*val1 == *val2)); |
| 491 } |
| 492 } |
| 384 | 493 |
| 494 // Class(M1)->Is(Class(M2)) iff M1 = M2 |
| 495 for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { |
| 496 for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { |
| 497 Handle<i::Map> map1 = *mt1; |
| 498 Handle<i::Map> map2 = *mt2; |
| 499 CHECK(T.Class(map1)->Is(T.Class(map2)) == (*map1 == *map2)); |
| 500 } |
| 501 } |
| 502 |
| 503 // Constant(V)->Is(Class(M)) for no V,M |
| 504 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
| 505 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 506 Handle<i::Map> map = *mt; |
| 507 Handle<i::Object> value = *vt; |
| 508 CHECK(!T.Constant(value)->Is(T.Class(map))); |
| 509 } |
| 510 } |
| 511 |
| 512 // Class(M)->Is(Constant(V)) for no V,M |
| 513 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
| 514 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 515 Handle<i::Map> map = *mt; |
| 516 Handle<i::Object> value = *vt; |
| 517 CHECK(!T.Class(map)->Is(T.Constant(value))); |
| 518 } |
| 519 } |
| 520 |
| 521 // Basic types |
| 385 CheckUnordered(T.Boolean, T.Null); | 522 CheckUnordered(T.Boolean, T.Null); |
| 386 CheckUnordered(T.Undefined, T.Null); | 523 CheckUnordered(T.Undefined, T.Null); |
| 387 CheckUnordered(T.Boolean, T.Undefined); | 524 CheckUnordered(T.Boolean, T.Undefined); |
| 388 | 525 |
| 389 CheckSub(T.Number, T.Any); | |
| 390 CheckSub(T.SignedSmall, T.Number); | 526 CheckSub(T.SignedSmall, T.Number); |
| 391 CheckSub(T.Signed32, T.Number); | 527 CheckSub(T.Signed32, T.Number); |
| 392 CheckSub(T.Float, T.Number); | 528 CheckSub(T.Float, T.Number); |
| 393 CheckSub(T.SignedSmall, T.Signed32); | 529 CheckSub(T.SignedSmall, T.Signed32); |
| 394 CheckUnordered(T.SignedSmall, T.Float); | 530 CheckUnordered(T.SignedSmall, T.Float); |
| 395 CheckUnordered(T.Signed32, T.Float); | 531 CheckUnordered(T.Signed32, T.Float); |
| 396 | 532 |
| 397 CheckSub(T.Name, T.Any); | |
| 398 CheckSub(T.UniqueName, T.Any); | |
| 399 CheckSub(T.UniqueName, T.Name); | 533 CheckSub(T.UniqueName, T.Name); |
| 400 CheckSub(T.String, T.Name); | 534 CheckSub(T.String, T.Name); |
| 401 CheckSub(T.InternalizedString, T.String); | 535 CheckSub(T.InternalizedString, T.String); |
| 402 CheckSub(T.InternalizedString, T.UniqueName); | 536 CheckSub(T.InternalizedString, T.UniqueName); |
| 403 CheckSub(T.InternalizedString, T.Name); | 537 CheckSub(T.InternalizedString, T.Name); |
| 404 CheckSub(T.Symbol, T.UniqueName); | 538 CheckSub(T.Symbol, T.UniqueName); |
| 405 CheckSub(T.Symbol, T.Name); | 539 CheckSub(T.Symbol, T.Name); |
| 406 CheckUnordered(T.String, T.UniqueName); | 540 CheckUnordered(T.String, T.UniqueName); |
| 407 CheckUnordered(T.String, T.Symbol); | 541 CheckUnordered(T.String, T.Symbol); |
| 408 CheckUnordered(T.InternalizedString, T.Symbol); | 542 CheckUnordered(T.InternalizedString, T.Symbol); |
| 409 | 543 |
| 410 CheckSub(T.Receiver, T.Any); | |
| 411 CheckSub(T.Object, T.Any); | |
| 412 CheckSub(T.Object, T.Receiver); | 544 CheckSub(T.Object, T.Receiver); |
| 413 CheckSub(T.Array, T.Object); | 545 CheckSub(T.Array, T.Object); |
| 414 CheckSub(T.Function, T.Object); | 546 CheckSub(T.Function, T.Object); |
| 415 CheckSub(T.Proxy, T.Receiver); | 547 CheckSub(T.Proxy, T.Receiver); |
| 416 CheckUnordered(T.Object, T.Proxy); | 548 CheckUnordered(T.Object, T.Proxy); |
| 417 CheckUnordered(T.Array, T.Function); | 549 CheckUnordered(T.Array, T.Function); |
| 418 | 550 |
| 419 // Structured subtyping | 551 // Structural types |
| 420 CheckSub(T.None, T.ObjectClass); | |
| 421 CheckSub(T.None, T.ObjectConstant1); | |
| 422 CheckSub(T.ObjectClass, T.Any); | |
| 423 CheckSub(T.ObjectConstant1, T.Any); | |
| 424 | |
| 425 CheckSub(T.ObjectClass, T.Object); | 552 CheckSub(T.ObjectClass, T.Object); |
| 426 CheckSub(T.ArrayClass, T.Object); | 553 CheckSub(T.ArrayClass, T.Object); |
| 427 CheckUnordered(T.ObjectClass, T.ArrayClass); | 554 CheckUnordered(T.ObjectClass, T.ArrayClass); |
| 428 | 555 |
| 429 CheckSub(T.SmiConstant, T.SignedSmall); | 556 CheckSub(T.SmiConstant, T.SignedSmall); |
| 430 CheckSub(T.SmiConstant, T.Signed32); | 557 CheckSub(T.SmiConstant, T.Signed32); |
| 431 CheckSub(T.SmiConstant, T.Number); | 558 CheckSub(T.SmiConstant, T.Number); |
| 432 CheckSub(T.ObjectConstant1, T.Object); | 559 CheckSub(T.ObjectConstant1, T.Object); |
| 433 CheckSub(T.ObjectConstant2, T.Object); | 560 CheckSub(T.ObjectConstant2, T.Object); |
| 434 CheckSub(T.ArrayConstant, T.Object); | 561 CheckSub(T.ArrayConstant, T.Object); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 | 617 |
| 491 // T1->Is(T2) implies T1->NowIs(T2) for all T1,T2 | 618 // T1->Is(T2) implies T1->NowIs(T2) for all T1,T2 |
| 492 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { | 619 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 493 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { | 620 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 494 TypeHandle type1 = *it1; | 621 TypeHandle type1 = *it1; |
| 495 TypeHandle type2 = *it2; | 622 TypeHandle type2 = *it2; |
| 496 CHECK(!type1->Is(type2) || type1->NowIs(type2)); | 623 CHECK(!type1->Is(type2) || type1->NowIs(type2)); |
| 497 } | 624 } |
| 498 } | 625 } |
| 499 | 626 |
| 500 CHECK(T.ObjectConstant1->NowIs(T.ObjectClass)); | 627 // Constant(V1)->NowIs(Constant(V2)) iff V1 = V2 |
| 501 CHECK(T.ObjectConstant2->NowIs(T.ObjectClass)); | 628 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { |
| 629 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { |
| 630 Handle<i::Object> val1 = *vt1; |
| 631 Handle<i::Object> val2 = *vt2; |
| 632 CHECK(T.Constant(val1)->NowIs(T.Constant(val2)) == (*val1 == *val2)); |
| 633 } |
| 634 } |
| 635 |
| 636 // Class(M1)->NowIs(Class(M2)) iff M1 = M2 |
| 637 for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { |
| 638 for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { |
| 639 Handle<i::Map> map1 = *mt1; |
| 640 Handle<i::Map> map2 = *mt2; |
| 641 CHECK(T.Class(map1)->NowIs(T.Class(map2)) == (*map1 == *map2)); |
| 642 } |
| 643 } |
| 644 |
| 645 // Constant(V)->NowIs(Class(M)) iff V has map M |
| 646 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
| 647 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 648 Handle<i::Map> map = *mt; |
| 649 Handle<i::Object> value = *vt; |
| 650 CHECK((value->IsHeapObject() && |
| 651 i::HeapObject::cast(*value)->map() == *map) |
| 652 == T.Constant(value)->NowIs(T.Class(map))); |
| 653 } |
| 654 } |
| 655 |
| 656 // Class(M)->NowIs(Constant(V)) for no V,M |
| 657 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
| 658 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 659 Handle<i::Map> map = *mt; |
| 660 Handle<i::Object> value = *vt; |
| 661 CHECK(!T.Class(map)->NowIs(T.Constant(value))); |
| 662 } |
| 663 } |
| 502 } | 664 } |
| 503 | 665 |
| 504 void Contains() { | 666 void Contains() { |
| 505 // T->Contains(V) iff Constant(V)->Is(T) for all T,V | 667 // T->Contains(V) iff Constant(V)->Is(T) for all T,V |
| 506 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 668 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 507 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 669 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 508 TypeHandle type = *it; | 670 TypeHandle type = *it; |
| 509 Handle<i::Object> val = *vt; | 671 Handle<i::Object> value = *vt; |
| 510 CHECK(type->Contains(val) == T.Constant(val)->Is(type)); | 672 CHECK(type->Contains(value) == T.Constant(value)->Is(type)); |
| 511 } | 673 } |
| 512 } | 674 } |
| 513 | 675 |
| 514 // Of(V)->Is(T) implies T->Contains(V) for all T,V | 676 // Of(V)->Is(T) implies T->Contains(V) for all T,V |
| 515 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 677 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 516 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 678 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 517 TypeHandle type = *it; | 679 TypeHandle type = *it; |
| 518 Handle<i::Object> val = *vt; | 680 Handle<i::Object> value = *vt; |
| 519 CHECK(!T.Of(val)->Is(type) || type->Contains(val)); | 681 CHECK(!T.Of(value)->Is(type) || type->Contains(value)); |
| 520 } | 682 } |
| 521 } | 683 } |
| 522 } | 684 } |
| 523 | 685 |
| 524 void NowContains() { | 686 void NowContains() { |
| 525 // T->NowContains(V) iff Constant(V)->NowIs(T) for all T,V | 687 // T->NowContains(V) iff Constant(V)->NowIs(T) for all T,V |
| 526 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 688 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 527 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 689 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 528 TypeHandle type = *it; | 690 TypeHandle type = *it; |
| 529 Handle<i::Object> val = *vt; | 691 Handle<i::Object> value = *vt; |
| 530 CHECK(type->NowContains(val) == T.Constant(val)->NowIs(type)); | 692 CHECK(type->NowContains(value) == T.Constant(value)->NowIs(type)); |
| 693 } |
| 694 } |
| 695 |
| 696 // T->Contains(V) implies T->NowContains(V) for all T,V |
| 697 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 698 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 699 TypeHandle type = *it; |
| 700 Handle<i::Object> value = *vt; |
| 701 CHECK(!type->Contains(value) || type->NowContains(value)); |
| 531 } | 702 } |
| 532 } | 703 } |
| 533 | 704 |
| 534 // NowOf(V)->Is(T) implies T->NowContains(V) for all T,V | 705 // NowOf(V)->Is(T) implies T->NowContains(V) for all T,V |
| 535 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 706 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 536 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 707 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 537 TypeHandle type = *it; | 708 TypeHandle type = *it; |
| 538 Handle<i::Object> value = *vt; | 709 Handle<i::Object> value = *vt; |
| 539 CHECK(!T.NowOf(value)->NowIs(type) || type->NowContains(value)); | 710 CHECK(!T.NowOf(value)->NowIs(type) || type->NowContains(value)); |
| 540 } | 711 } |
| 541 } | 712 } |
| 542 | 713 |
| 543 // NowOf(V)->NowIs(T) implies T->NowContains(V) for all T,V | 714 // NowOf(V)->NowIs(T) implies T->NowContains(V) for all T,V |
| 544 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 715 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 545 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | 716 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 546 TypeHandle type = *it; | 717 TypeHandle type = *it; |
| 547 Handle<i::Object> val = *vt; | 718 Handle<i::Object> value = *vt; |
| 548 CHECK(!T.NowOf(val)->NowIs(type) || type->NowContains(val)); | 719 CHECK(!T.NowOf(value)->NowIs(type) || type->NowContains(value)); |
| 549 } | |
| 550 } | |
| 551 | |
| 552 // T->Contains(V) implies T->NowContains(V) for all T,V | |
| 553 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | |
| 554 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { | |
| 555 TypeHandle type = *it; | |
| 556 Handle<i::Object> val = *vt; | |
| 557 CHECK(!type->Contains(val) || type->NowContains(val)); | |
| 558 } | 720 } |
| 559 } | 721 } |
| 560 } | 722 } |
| 561 | 723 |
| 562 void Maybe() { | 724 void Maybe() { |
| 563 // T->Maybe(T) for all inhabited T | 725 // T->Maybe(T) iff T inhabited |
| 564 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 726 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 565 TypeHandle type = *it; | 727 TypeHandle type = *it; |
| 566 CHECK(type->Maybe(type) || !type->IsInhabited()); | 728 CHECK(type->Maybe(type) == type->IsInhabited()); |
| 729 } |
| 730 |
| 731 // T->Maybe(Any) iff T inhabited |
| 732 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 733 TypeHandle type = *it; |
| 734 CHECK(type->Maybe(T.Any) == type->IsInhabited()); |
| 735 } |
| 736 |
| 737 // T->Maybe(None) never |
| 738 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 739 TypeHandle type = *it; |
| 740 CHECK(!type->Maybe(T.None)); |
| 567 } | 741 } |
| 568 | 742 |
| 569 // Symmetry | 743 // Symmetry |
| 570 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { | 744 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 571 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { | 745 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 572 TypeHandle type1 = *it1; | 746 TypeHandle type1 = *it1; |
| 573 TypeHandle type2 = *it2; | 747 TypeHandle type2 = *it2; |
| 574 CHECK(type1->Maybe(type2) == type2->Maybe(type1)); | 748 CHECK(type1->Maybe(type2) == type2->Maybe(type1)); |
| 575 } | 749 } |
| 576 } | 750 } |
| 577 | 751 |
| 578 // T1->Is(T2) implies T1->Maybe(T2) or T1 is uninhabited for all T1,T2 | 752 // T1->Maybe(T2) only if T1, T2 inhabited |
| 579 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { | 753 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 580 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { | 754 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 581 TypeHandle type1 = *it1; | 755 TypeHandle type1 = *it1; |
| 582 TypeHandle type2 = *it2; | 756 TypeHandle type2 = *it2; |
| 583 CHECK(!type1->Is(type2) || | 757 CHECK(!type1->Maybe(type2) || |
| 584 type1->Maybe(type2) || | 758 (type1->IsInhabited() && type2->IsInhabited())); |
| 585 !type1->IsInhabited()); | |
| 586 } | 759 } |
| 587 } | 760 } |
| 588 | 761 |
| 589 CheckOverlap(T.Any, T.Any, T.Semantic); | 762 // T1->Is(T2) and T1 inhabited implies T1->Maybe(T2) for all T1,T2 |
| 590 CheckOverlap(T.Object, T.Object, T.Semantic); | 763 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 764 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 765 TypeHandle type1 = *it1; |
| 766 TypeHandle type2 = *it2; |
| 767 CHECK(!(type1->Is(type2) && type1->IsInhabited()) || |
| 768 type1->Maybe(type2)); |
| 769 } |
| 770 } |
| 591 | 771 |
| 772 // Constant(V1)->Maybe(Constant(V2)) iff V1 = V2 |
| 773 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { |
| 774 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { |
| 775 Handle<i::Object> val1 = *vt1; |
| 776 Handle<i::Object> val2 = *vt2; |
| 777 CHECK(T.Constant(val1)->Maybe(T.Constant(val2)) == (*val1 == *val2)); |
| 778 } |
| 779 } |
| 780 |
| 781 // Class(M1)->Maybe(Class(M2)) iff M1 = M2 |
| 782 for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { |
| 783 for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { |
| 784 Handle<i::Map> map1 = *mt1; |
| 785 Handle<i::Map> map2 = *mt2; |
| 786 CHECK(T.Class(map1)->Maybe(T.Class(map2)) == (*map1 == *map2)); |
| 787 } |
| 788 } |
| 789 |
| 790 // Constant(V)->Maybe(Class(M)) for no V,M |
| 791 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
| 792 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 793 Handle<i::Map> map = *mt; |
| 794 Handle<i::Object> value = *vt; |
| 795 CHECK(!T.Constant(value)->Maybe(T.Class(map))); |
| 796 } |
| 797 } |
| 798 |
| 799 // Class(M)->Maybe(Constant(V)) for no V,M |
| 800 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { |
| 801 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { |
| 802 Handle<i::Map> map = *mt; |
| 803 Handle<i::Object> value = *vt; |
| 804 CHECK(!T.Class(map)->Maybe(T.Constant(value))); |
| 805 } |
| 806 } |
| 807 |
| 808 // Basic types |
| 592 CheckDisjoint(T.Boolean, T.Null, T.Semantic); | 809 CheckDisjoint(T.Boolean, T.Null, T.Semantic); |
| 593 CheckDisjoint(T.Undefined, T.Null, T.Semantic); | 810 CheckDisjoint(T.Undefined, T.Null, T.Semantic); |
| 594 CheckDisjoint(T.Boolean, T.Undefined, T.Semantic); | 811 CheckDisjoint(T.Boolean, T.Undefined, T.Semantic); |
| 595 | 812 |
| 596 CheckOverlap(T.Number, T.Any, T.Semantic); | |
| 597 CheckOverlap(T.SignedSmall, T.Number, T.Semantic); | 813 CheckOverlap(T.SignedSmall, T.Number, T.Semantic); |
| 598 CheckOverlap(T.Float, T.Number, T.Semantic); | 814 CheckOverlap(T.Float, T.Number, T.Semantic); |
| 599 CheckDisjoint(T.Signed32, T.Float, T.Semantic); | 815 CheckDisjoint(T.Signed32, T.Float, T.Semantic); |
| 600 | 816 |
| 601 CheckOverlap(T.Name, T.Any, T.Semantic); | |
| 602 CheckOverlap(T.UniqueName, T.Any, T.Semantic); | |
| 603 CheckOverlap(T.UniqueName, T.Name, T.Semantic); | 817 CheckOverlap(T.UniqueName, T.Name, T.Semantic); |
| 604 CheckOverlap(T.String, T.Name, T.Semantic); | 818 CheckOverlap(T.String, T.Name, T.Semantic); |
| 605 CheckOverlap(T.InternalizedString, T.String, T.Semantic); | 819 CheckOverlap(T.InternalizedString, T.String, T.Semantic); |
| 606 CheckOverlap(T.InternalizedString, T.UniqueName, T.Semantic); | 820 CheckOverlap(T.InternalizedString, T.UniqueName, T.Semantic); |
| 607 CheckOverlap(T.InternalizedString, T.Name, T.Semantic); | 821 CheckOverlap(T.InternalizedString, T.Name, T.Semantic); |
| 608 CheckOverlap(T.Symbol, T.UniqueName, T.Semantic); | 822 CheckOverlap(T.Symbol, T.UniqueName, T.Semantic); |
| 609 CheckOverlap(T.Symbol, T.Name, T.Semantic); | 823 CheckOverlap(T.Symbol, T.Name, T.Semantic); |
| 610 CheckOverlap(T.String, T.UniqueName, T.Semantic); | 824 CheckOverlap(T.String, T.UniqueName, T.Semantic); |
| 611 CheckDisjoint(T.String, T.Symbol, T.Semantic); | 825 CheckDisjoint(T.String, T.Symbol, T.Semantic); |
| 612 CheckDisjoint(T.InternalizedString, T.Symbol, T.Semantic); | 826 CheckDisjoint(T.InternalizedString, T.Symbol, T.Semantic); |
| 613 | 827 |
| 614 CheckOverlap(T.Receiver, T.Any, T.Semantic); | |
| 615 CheckOverlap(T.Object, T.Any, T.Semantic); | |
| 616 CheckOverlap(T.Object, T.Receiver, T.Semantic); | 828 CheckOverlap(T.Object, T.Receiver, T.Semantic); |
| 617 CheckOverlap(T.Array, T.Object, T.Semantic); | 829 CheckOverlap(T.Array, T.Object, T.Semantic); |
| 618 CheckOverlap(T.Function, T.Object, T.Semantic); | 830 CheckOverlap(T.Function, T.Object, T.Semantic); |
| 619 CheckOverlap(T.Proxy, T.Receiver, T.Semantic); | 831 CheckOverlap(T.Proxy, T.Receiver, T.Semantic); |
| 620 CheckDisjoint(T.Object, T.Proxy, T.Semantic); | 832 CheckDisjoint(T.Object, T.Proxy, T.Semantic); |
| 621 CheckDisjoint(T.Array, T.Function, T.Semantic); | 833 CheckDisjoint(T.Array, T.Function, T.Semantic); |
| 622 | 834 |
| 623 CheckOverlap(T.ObjectClass, T.Any, T.Semantic); | 835 // Structural types |
| 624 CheckOverlap(T.ObjectConstant1, T.Any, T.Semantic); | |
| 625 | |
| 626 CheckOverlap(T.ObjectClass, T.Object, T.Semantic); | 836 CheckOverlap(T.ObjectClass, T.Object, T.Semantic); |
| 627 CheckOverlap(T.ArrayClass, T.Object, T.Semantic); | 837 CheckOverlap(T.ArrayClass, T.Object, T.Semantic); |
| 628 CheckOverlap(T.ObjectClass, T.ObjectClass, T.Semantic); | 838 CheckOverlap(T.ObjectClass, T.ObjectClass, T.Semantic); |
| 629 CheckOverlap(T.ArrayClass, T.ArrayClass, T.Semantic); | 839 CheckOverlap(T.ArrayClass, T.ArrayClass, T.Semantic); |
| 630 CheckDisjoint(T.ObjectClass, T.ArrayClass, T.Semantic); | 840 CheckDisjoint(T.ObjectClass, T.ArrayClass, T.Semantic); |
| 631 | 841 |
| 632 CheckOverlap(T.SmiConstant, T.SignedSmall, T.Semantic); | 842 CheckOverlap(T.SmiConstant, T.SignedSmall, T.Semantic); |
| 633 CheckOverlap(T.SmiConstant, T.Signed32, T.Semantic); | 843 CheckOverlap(T.SmiConstant, T.Signed32, T.Semantic); |
| 634 CheckOverlap(T.SmiConstant, T.Number, T.Semantic); | 844 CheckOverlap(T.SmiConstant, T.Number, T.Semantic); |
| 635 CheckDisjoint(T.SmiConstant, T.Float, T.Semantic); | 845 CheckDisjoint(T.SmiConstant, T.Float, T.Semantic); |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1066 ZoneTests().Intersect(); | 1276 ZoneTests().Intersect(); |
| 1067 HeapTests().Intersect(); | 1277 HeapTests().Intersect(); |
| 1068 } | 1278 } |
| 1069 | 1279 |
| 1070 | 1280 |
| 1071 TEST(Convert) { | 1281 TEST(Convert) { |
| 1072 CcTest::InitializeVM(); | 1282 CcTest::InitializeVM(); |
| 1073 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); | 1283 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); |
| 1074 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); | 1284 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); |
| 1075 } | 1285 } |
| OLD | NEW |