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

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

Issue 240143003: Revert "Implement structural function and array types" (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/x64/stub-cache-x64.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 25 matching lines...) Expand all
36 // Testing auxiliaries (breaking the Type abstraction). 36 // Testing auxiliaries (breaking the Type abstraction).
37 struct ZoneRep { 37 struct ZoneRep {
38 typedef void* Struct; 38 typedef void* Struct;
39 39
40 static bool IsStruct(Type* t, int tag) { 40 static bool IsStruct(Type* t, int tag) {
41 return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag; 41 return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag;
42 } 42 }
43 static bool IsBitset(Type* t) { return reinterpret_cast<intptr_t>(t) & 1; } 43 static bool IsBitset(Type* t) { return reinterpret_cast<intptr_t>(t) & 1; }
44 static bool IsClass(Type* t) { return IsStruct(t, 0); } 44 static bool IsClass(Type* t) { return IsStruct(t, 0); }
45 static bool IsConstant(Type* t) { return IsStruct(t, 1); } 45 static bool IsConstant(Type* t) { return IsStruct(t, 1); }
46 static bool IsArray(Type* t) { return IsStruct(t, 2); } 46 static bool IsUnion(Type* t) { return IsStruct(t, 2); }
47 static bool IsFunction(Type* t) { return IsStruct(t, 3); }
48 static bool IsUnion(Type* t) { return IsStruct(t, 4); }
49 47
50 static Struct* AsStruct(Type* t) { 48 static Struct* AsStruct(Type* t) {
51 return reinterpret_cast<Struct*>(t); 49 return reinterpret_cast<Struct*>(t);
52 } 50 }
53 static int AsBitset(Type* t) { 51 static int AsBitset(Type* t) {
54 return static_cast<int>(reinterpret_cast<intptr_t>(t) >> 1); 52 return static_cast<int>(reinterpret_cast<intptr_t>(t) >> 1);
55 } 53 }
56 static Map* AsClass(Type* t) { 54 static Map* AsClass(Type* t) {
57 return *static_cast<Map**>(AsStruct(t)[3]); 55 return *static_cast<Map**>(AsStruct(t)[3]);
58 } 56 }
(...skipping 13 matching lines...) Expand all
72 70
73 struct HeapRep { 71 struct HeapRep {
74 typedef FixedArray Struct; 72 typedef FixedArray Struct;
75 73
76 static bool IsStruct(Handle<HeapType> t, int tag) { 74 static bool IsStruct(Handle<HeapType> t, int tag) {
77 return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag; 75 return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag;
78 } 76 }
79 static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); } 77 static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); }
80 static bool IsClass(Handle<HeapType> t) { return t->IsMap(); } 78 static bool IsClass(Handle<HeapType> t) { return t->IsMap(); }
81 static bool IsConstant(Handle<HeapType> t) { return t->IsBox(); } 79 static bool IsConstant(Handle<HeapType> t) { return t->IsBox(); }
82 static bool IsArray(Handle<HeapType> t) { return IsStruct(t, 2); } 80 static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 2); }
83 static bool IsFunction(Handle<HeapType> t) { return IsStruct(t, 3); }
84 static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 4); }
85 81
86 static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); } 82 static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); }
87 static int AsBitset(Handle<HeapType> t) { return Smi::cast(*t)->value(); } 83 static int AsBitset(Handle<HeapType> t) { return Smi::cast(*t)->value(); }
88 static Map* AsClass(Handle<HeapType> t) { return Map::cast(*t); } 84 static Map* AsClass(Handle<HeapType> t) { return Map::cast(*t); }
89 static Object* AsConstant(Handle<HeapType> t) { 85 static Object* AsConstant(Handle<HeapType> t) {
90 return Box::cast(*t)->value(); 86 return Box::cast(*t)->value();
91 } 87 }
92 static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); } 88 static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); }
93 static int Length(Struct* structured) { return structured->length() - 1; } 89 static int Length(Struct* structured) { return structured->length() - 1; }
94 90
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 values.push_back(smi); 132 values.push_back(smi);
137 values.push_back(signed32); 133 values.push_back(signed32);
138 values.push_back(object1); 134 values.push_back(object1);
139 values.push_back(object2); 135 values.push_back(object2);
140 values.push_back(array); 136 values.push_back(array);
141 values.push_back(uninitialized); 137 values.push_back(uninitialized);
142 for (ValueVector::iterator it = values.begin(); it != values.end(); ++it) { 138 for (ValueVector::iterator it = values.begin(); it != values.end(); ++it) {
143 types.push_back(Type::Constant(*it, region)); 139 types.push_back(Type::Constant(*it, region));
144 } 140 }
145 141
146 FloatArray = Type::Array(Float, region);
147 StringArray = Type::Array(String, region);
148 AnyArray = Type::Array(Any, region);
149
150 SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region);
151 NumberFunction1 = Type::Function(Number, Number, region);
152 NumberFunction2 = Type::Function(Number, Number, Number, region);
153 MethodFunction = Type::Function(String, Object, 0, region);
154
155 for (int i = 0; i < 50; ++i) { 142 for (int i = 0; i < 50; ++i) {
156 types.push_back(Fuzz()); 143 types.push_back(Fuzz());
157 } 144 }
158 } 145 }
159 146
160 Handle<i::Map> object_map;
161 Handle<i::Map> array_map;
162 Handle<i::Map> uninitialized_map;
163
164 Handle<i::Smi> smi;
165 Handle<i::HeapNumber> signed32;
166 Handle<i::JSObject> object1;
167 Handle<i::JSObject> object2;
168 Handle<i::JSArray> array;
169 Handle<i::Oddball> uninitialized;
170
171 #define DECLARE_TYPE(name, value) TypeHandle name; 147 #define DECLARE_TYPE(name, value) TypeHandle name;
172 BITSET_TYPE_LIST(DECLARE_TYPE) 148 BITSET_TYPE_LIST(DECLARE_TYPE)
173 #undef DECLARE_TYPE 149 #undef DECLARE_TYPE
174 150
175 TypeHandle ObjectClass; 151 TypeHandle ObjectClass;
176 TypeHandle ArrayClass; 152 TypeHandle ArrayClass;
177 TypeHandle UninitializedClass; 153 TypeHandle UninitializedClass;
178 154
179 TypeHandle SmiConstant; 155 TypeHandle SmiConstant;
180 TypeHandle Signed32Constant; 156 TypeHandle Signed32Constant;
181 TypeHandle ObjectConstant1; 157 TypeHandle ObjectConstant1;
182 TypeHandle ObjectConstant2; 158 TypeHandle ObjectConstant2;
183 TypeHandle ArrayConstant; 159 TypeHandle ArrayConstant;
184 TypeHandle UninitializedConstant; 160 TypeHandle UninitializedConstant;
185 161
186 TypeHandle FloatArray; 162 Handle<i::Map> object_map;
187 TypeHandle StringArray; 163 Handle<i::Map> array_map;
188 TypeHandle AnyArray; 164 Handle<i::Map> uninitialized_map;
189 165
190 TypeHandle SignedFunction1; 166 Handle<i::Smi> smi;
191 TypeHandle NumberFunction1; 167 Handle<i::HeapNumber> signed32;
192 TypeHandle NumberFunction2; 168 Handle<i::JSObject> object1;
193 TypeHandle MethodFunction; 169 Handle<i::JSObject> object2;
170 Handle<i::JSArray> array;
171 Handle<i::Oddball> uninitialized;
194 172
195 typedef std::vector<TypeHandle> TypeVector; 173 typedef std::vector<TypeHandle> TypeVector;
196 typedef std::vector<Handle<i::Map> > MapVector; 174 typedef std::vector<Handle<i::Map> > MapVector;
197 typedef std::vector<Handle<i::Object> > ValueVector; 175 typedef std::vector<Handle<i::Object> > ValueVector;
198 TypeVector types; 176 TypeVector types;
199 MapVector maps; 177 MapVector maps;
200 ValueVector values; 178 ValueVector values;
201 179
202 TypeHandle Of(Handle<i::Object> value) { 180 TypeHandle Of(Handle<i::Object> value) {
203 return Type::Of(value, region_); 181 return Type::Of(value, region_);
204 } 182 }
205 183
206 TypeHandle NowOf(Handle<i::Object> value) { 184 TypeHandle NowOf(Handle<i::Object> value) {
207 return Type::NowOf(value, region_); 185 return Type::NowOf(value, region_);
208 } 186 }
209 187
210 TypeHandle Constant(Handle<i::Object> value) { 188 TypeHandle Constant(Handle<i::Object> value) {
211 return Type::Constant(value, region_); 189 return Type::Constant(value, region_);
212 } 190 }
213 191
214 TypeHandle Class(Handle<i::Map> map) { 192 TypeHandle Class(Handle<i::Map> map) {
215 return Type::Class(map, region_); 193 return Type::Class(map, region_);
216 } 194 }
217 195
218 TypeHandle Array1(TypeHandle element) {
219 return Type::Array(element, region_);
220 }
221
222 TypeHandle Function0(TypeHandle result, TypeHandle receiver) {
223 return Type::Function(result, receiver, 0, region_);
224 }
225
226 TypeHandle Function1(TypeHandle result, TypeHandle receiver, TypeHandle arg) {
227 TypeHandle type = Type::Function(result, receiver, 1, region_);
228 type->AsFunction()->InitParameter(0, arg);
229 return type;
230 }
231
232 TypeHandle Function2(TypeHandle result, TypeHandle arg1, TypeHandle arg2) {
233 return Type::Function(result, arg1, arg2, region_);
234 }
235
236 TypeHandle Union(TypeHandle t1, TypeHandle t2) { 196 TypeHandle Union(TypeHandle t1, TypeHandle t2) {
237 return Type::Union(t1, t2, region_); 197 return Type::Union(t1, t2, region_);
238 } 198 }
239 TypeHandle Intersect(TypeHandle t1, TypeHandle t2) { 199 TypeHandle Intersect(TypeHandle t1, TypeHandle t2) {
240 return Type::Intersect(t1, t2, region_); 200 return Type::Intersect(t1, t2, region_);
241 } 201 }
242 202
243 template<class Type2, class TypeHandle2> 203 template<class Type2, class TypeHandle2>
244 TypeHandle Convert(TypeHandle2 t) { 204 TypeHandle Convert(TypeHandle2 t) {
245 return Type::template Convert<Type2>(t, region_); 205 return Type::template Convert<Type2>(t, region_);
246 } 206 }
247 207
248 TypeHandle Random() {
249 return types[rng_.NextInt(static_cast<int>(types.size()))];
250 }
251
252 TypeHandle Fuzz(int depth = 5) { 208 TypeHandle Fuzz(int depth = 5) {
253 switch (rng_.NextInt(depth == 0 ? 3 : 20)) { 209 switch (rng_.NextInt(depth == 0 ? 3 : 20)) {
254 case 0: { // bitset 210 case 0: { // bitset
255 int n = 0 211 int n = 0
256 #define COUNT_BITSET_TYPES(type, value) + 1 212 #define COUNT_BITSET_TYPES(type, value) + 1
257 BITSET_TYPE_LIST(COUNT_BITSET_TYPES) 213 BITSET_TYPE_LIST(COUNT_BITSET_TYPES)
258 #undef COUNT_BITSET_TYPES 214 #undef COUNT_BITSET_TYPES
259 ; 215 ;
260 int i = rng_.NextInt(n); 216 int i = rng_.NextInt(n);
261 #define PICK_BITSET_TYPE(type, value) \ 217 #define PICK_BITSET_TYPE(type, value) \
262 if (i-- == 0) return Type::type(region_); 218 if (i-- == 0) return Type::type(region_);
263 BITSET_TYPE_LIST(PICK_BITSET_TYPE) 219 BITSET_TYPE_LIST(PICK_BITSET_TYPE)
264 #undef PICK_BITSET_TYPE 220 #undef PICK_BITSET_TYPE
265 UNREACHABLE(); 221 UNREACHABLE();
266 } 222 }
267 case 1: { // class 223 case 1: { // class
268 int i = rng_.NextInt(static_cast<int>(maps.size())); 224 int i = rng_.NextInt(static_cast<int>(maps.size()));
269 return Type::Class(maps[i], region_); 225 return Type::Class(maps[i], region_);
270 } 226 }
271 case 2: { // constant 227 case 2: { // constant
272 int i = rng_.NextInt(static_cast<int>(values.size())); 228 int i = rng_.NextInt(static_cast<int>(values.size()));
273 return Type::Constant(values[i], region_); 229 return Type::Constant(values[i], region_);
274 } 230 }
275 case 3: // array
276 return Type::Array(Fuzz(depth / 2), region_);
277 case 4:
278 case 5:
279 case 6: { // function
280 TypeHandle type = Type::Function(
281 Fuzz(depth / 2), Fuzz(depth / 2), rand() % 3, region_);
282 for (int i = 0; i < type->AsFunction()->Arity(); ++i) {
283 type->AsFunction()->InitParameter(i, Fuzz(depth - 1));
284 }
285 }
286 default: { // union 231 default: { // union
287 int n = rng_.NextInt(10); 232 int n = rng_.NextInt(10);
288 TypeHandle type = None; 233 TypeHandle type = None;
289 for (int i = 0; i < n; ++i) { 234 for (int i = 0; i < n; ++i) {
290 type = Type::Union(type, Fuzz(depth - 1), region_); 235 type = Type::Union(type, Fuzz(depth - 1), region_);
291 } 236 }
292 return type; 237 return type;
293 } 238 }
294 } 239 }
295 UNREACHABLE(); 240 UNREACHABLE();
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 399 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
455 Handle<i::Map> map = *mt; 400 Handle<i::Map> map = *mt;
456 TypeHandle type = T.Class(map); 401 TypeHandle type = T.Class(map);
457 CHECK(this->IsClass(type)); 402 CHECK(this->IsClass(type));
458 } 403 }
459 404
460 // Map attribute 405 // Map attribute
461 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) { 406 for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
462 Handle<i::Map> map = *mt; 407 Handle<i::Map> map = *mt;
463 TypeHandle type = T.Class(map); 408 TypeHandle type = T.Class(map);
464 CHECK(*map == *type->AsClass()->Map()); 409 CHECK(*map == *type->AsClass());
465 } 410 }
466 411
467 // Functionality & Injectivity: Class(M1) = Class(M2) iff M1 = M2 412 // Functionality & Injectivity: Class(M1) = Class(M2) iff M1 = M2
468 for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) { 413 for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) {
469 for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) { 414 for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) {
470 Handle<i::Map> map1 = *mt1; 415 Handle<i::Map> map1 = *mt1;
471 Handle<i::Map> map2 = *mt2; 416 Handle<i::Map> map2 = *mt2;
472 TypeHandle type1 = T.Class(map1); 417 TypeHandle type1 = T.Class(map1);
473 TypeHandle type2 = T.Class(map2); 418 TypeHandle type2 = T.Class(map2);
474 CHECK(Equal(type1, type2) == (*map1 == *map2)); 419 CHECK(Equal(type1, type2) == (*map1 == *map2));
475 } 420 }
476 } 421 }
477 } 422 }
478 423
479 void Constant() { 424 void Constant() {
480 // Constructor 425 // Constructor
481 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 426 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
482 Handle<i::Object> value = *vt; 427 Handle<i::Object> value = *vt;
483 TypeHandle type = T.Constant(value); 428 TypeHandle type = T.Constant(value);
484 CHECK(this->IsConstant(type)); 429 CHECK(this->IsConstant(type));
485 } 430 }
486 431
487 // Value attribute 432 // Value attribute
488 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 433 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
489 Handle<i::Object> value = *vt; 434 Handle<i::Object> value = *vt;
490 TypeHandle type = T.Constant(value); 435 TypeHandle type = T.Constant(value);
491 CHECK(*value == *type->AsConstant()->Value()); 436 CHECK(*value == *type->AsConstant());
492 } 437 }
493 438
494 // Functionality & Injectivity: Constant(V1) = Constant(V2) iff V1 = V2 439 // Functionality & Injectivity: Constant(V1) = Constant(v2) iff V1 = V2
495 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) { 440 for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) {
496 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) { 441 for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) {
497 Handle<i::Object> value1 = *vt1; 442 Handle<i::Object> value1 = *vt1;
498 Handle<i::Object> value2 = *vt2; 443 Handle<i::Object> value2 = *vt2;
499 TypeHandle type1 = T.Constant(value1); 444 TypeHandle type1 = T.Constant(value1);
500 TypeHandle type2 = T.Constant(value2); 445 TypeHandle type2 = T.Constant(value2);
501 CHECK(Equal(type1, type2) == (*value1 == *value2)); 446 CHECK(Equal(type1, type2) == (*value1 == *value2));
502 } 447 }
503 } 448 }
504 } 449 }
505 450
506 void Array() {
507 // Constructor
508 for (int i = 0; i < 20; ++i) {
509 TypeHandle type = T.Random();
510 TypeHandle array = T.Array1(type);
511 CHECK(this->IsArray(array));
512 }
513
514 // Attributes
515 for (int i = 0; i < 20; ++i) {
516 TypeHandle type = T.Random();
517 TypeHandle array = T.Array1(type);
518 CheckEqual(type, array->AsArray()->Element());
519 }
520
521 // Functionality & Injectivity: Array(T1) = Array(T2) iff T1 = T2
522 for (int i = 0; i < 20; ++i) {
523 for (int j = 0; j < 20; ++j) {
524 TypeHandle type1 = T.Random();
525 TypeHandle type2 = T.Random();
526 TypeHandle array1 = T.Array1(type1);
527 TypeHandle array2 = T.Array1(type2);
528 CHECK(Equal(array1, array2) == Equal(type1, type2));
529 }
530 }
531 }
532
533 void Function() {
534 // Constructors
535 for (int i = 0; i < 20; ++i) {
536 for (int j = 0; j < 20; ++j) {
537 for (int k = 0; k < 20; ++k) {
538 TypeHandle type1 = T.Random();
539 TypeHandle type2 = T.Random();
540 TypeHandle type3 = T.Random();
541 TypeHandle function0 = T.Function0(type1, type2);
542 TypeHandle function1 = T.Function1(type1, type2, type3);
543 TypeHandle function2 = T.Function2(type1, type2, type3);
544 CHECK(function0->IsFunction());
545 CHECK(function1->IsFunction());
546 CHECK(function2->IsFunction());
547 }
548 }
549 }
550
551 // Attributes
552 for (int i = 0; i < 20; ++i) {
553 for (int j = 0; j < 20; ++j) {
554 for (int k = 0; k < 20; ++k) {
555 TypeHandle type1 = T.Random();
556 TypeHandle type2 = T.Random();
557 TypeHandle type3 = T.Random();
558 TypeHandle function0 = T.Function0(type1, type2);
559 TypeHandle function1 = T.Function1(type1, type2, type3);
560 TypeHandle function2 = T.Function2(type1, type2, type3);
561 CHECK_EQ(0, function0->AsFunction()->Arity());
562 CHECK_EQ(1, function1->AsFunction()->Arity());
563 CHECK_EQ(2, function2->AsFunction()->Arity());
564 CheckEqual(type1, function0->AsFunction()->Result());
565 CheckEqual(type1, function1->AsFunction()->Result());
566 CheckEqual(type1, function2->AsFunction()->Result());
567 CheckEqual(type2, function0->AsFunction()->Receiver());
568 CheckEqual(type2, function1->AsFunction()->Receiver());
569 CheckEqual(T.Any, function2->AsFunction()->Receiver());
570 CheckEqual(type3, function1->AsFunction()->Parameter(0));
571 CheckEqual(type2, function2->AsFunction()->Parameter(0));
572 CheckEqual(type3, function2->AsFunction()->Parameter(1));
573 }
574 }
575 }
576
577 // Functionality & Injectivity: Function(Ts1) = Function(Ts2) iff Ts1 = Ts2
578 for (int i = 0; i < 20; ++i) {
579 for (int j = 0; j < 20; ++j) {
580 for (int k = 0; k < 20; ++k) {
581 TypeHandle type1 = T.Random();
582 TypeHandle type2 = T.Random();
583 TypeHandle type3 = T.Random();
584 TypeHandle function01 = T.Function0(type1, type2);
585 TypeHandle function02 = T.Function0(type1, type3);
586 TypeHandle function03 = T.Function0(type3, type2);
587 TypeHandle function11 = T.Function1(type1, type2, type2);
588 TypeHandle function12 = T.Function1(type1, type2, type3);
589 TypeHandle function21 = T.Function2(type1, type2, type2);
590 TypeHandle function22 = T.Function2(type1, type2, type3);
591 TypeHandle function23 = T.Function2(type1, type3, type2);
592 CHECK(Equal(function01, function02) == Equal(type2, type3));
593 CHECK(Equal(function01, function03) == Equal(type1, type3));
594 CHECK(Equal(function11, function12) == Equal(type2, type3));
595 CHECK(Equal(function21, function22) == Equal(type2, type3));
596 CHECK(Equal(function21, function23) == Equal(type2, type3));
597 }
598 }
599 }
600 }
601
602 void Of() { 451 void Of() {
603 // Constant(V)->Is(Of(V)) 452 // Constant(V)->Is(Of(V))
604 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { 453 for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
605 Handle<i::Object> value = *vt; 454 Handle<i::Object> value = *vt;
606 TypeHandle const_type = T.Constant(value); 455 TypeHandle const_type = T.Constant(value);
607 TypeHandle of_type = T.Of(value); 456 TypeHandle of_type = T.Of(value);
608 CHECK(const_type->Is(of_type)); 457 CHECK(const_type->Is(of_type));
609 } 458 }
610 459
611 // Constant(V)->Is(T) iff Of(V)->Is(T) or T->Maybe(Constant(V)) 460 // Constant(V)->Is(T) iff Of(V)->Is(T) or T->Maybe(Constant(V))
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 CheckSub(T.Object, T.Receiver); 634 CheckSub(T.Object, T.Receiver);
786 CheckSub(T.Array, T.Object); 635 CheckSub(T.Array, T.Object);
787 CheckSub(T.Function, T.Object); 636 CheckSub(T.Function, T.Object);
788 CheckSub(T.Proxy, T.Receiver); 637 CheckSub(T.Proxy, T.Receiver);
789 CheckUnordered(T.Object, T.Proxy); 638 CheckUnordered(T.Object, T.Proxy);
790 CheckUnordered(T.Array, T.Function); 639 CheckUnordered(T.Array, T.Function);
791 640
792 // Structural types 641 // Structural types
793 CheckSub(T.ObjectClass, T.Object); 642 CheckSub(T.ObjectClass, T.Object);
794 CheckSub(T.ArrayClass, T.Object); 643 CheckSub(T.ArrayClass, T.Object);
795 CheckSub(T.ArrayClass, T.Array);
796 CheckSub(T.UninitializedClass, T.Internal); 644 CheckSub(T.UninitializedClass, T.Internal);
797 CheckUnordered(T.ObjectClass, T.ArrayClass); 645 CheckUnordered(T.ObjectClass, T.ArrayClass);
798 CheckUnordered(T.UninitializedClass, T.Null); 646 CheckUnordered(T.UninitializedClass, T.Null);
799 CheckUnordered(T.UninitializedClass, T.Undefined); 647 CheckUnordered(T.UninitializedClass, T.Undefined);
800 648
801 CheckSub(T.SmiConstant, T.SignedSmall); 649 CheckSub(T.SmiConstant, T.SignedSmall);
802 CheckSub(T.SmiConstant, T.Signed32); 650 CheckSub(T.SmiConstant, T.Signed32);
803 CheckSub(T.SmiConstant, T.Number); 651 CheckSub(T.SmiConstant, T.Number);
804 CheckSub(T.ObjectConstant1, T.Object); 652 CheckSub(T.ObjectConstant1, T.Object);
805 CheckSub(T.ObjectConstant2, T.Object); 653 CheckSub(T.ObjectConstant2, T.Object);
806 CheckSub(T.ArrayConstant, T.Object); 654 CheckSub(T.ArrayConstant, T.Object);
807 CheckSub(T.ArrayConstant, T.Array); 655 CheckSub(T.ArrayConstant, T.Array);
808 CheckSub(T.UninitializedConstant, T.Internal); 656 CheckSub(T.UninitializedConstant, T.Internal);
809 CheckUnordered(T.ObjectConstant1, T.ObjectConstant2); 657 CheckUnordered(T.ObjectConstant1, T.ObjectConstant2);
810 CheckUnordered(T.ObjectConstant1, T.ArrayConstant); 658 CheckUnordered(T.ObjectConstant1, T.ArrayConstant);
811 CheckUnordered(T.UninitializedConstant, T.Null); 659 CheckUnordered(T.UninitializedConstant, T.Null);
812 CheckUnordered(T.UninitializedConstant, T.Undefined); 660 CheckUnordered(T.UninitializedConstant, T.Undefined);
813 661
814 CheckUnordered(T.ObjectConstant1, T.ObjectClass); 662 CheckUnordered(T.ObjectConstant1, T.ObjectClass);
815 CheckUnordered(T.ObjectConstant2, T.ObjectClass); 663 CheckUnordered(T.ObjectConstant2, T.ObjectClass);
816 CheckUnordered(T.ObjectConstant1, T.ArrayClass); 664 CheckUnordered(T.ObjectConstant1, T.ArrayClass);
817 CheckUnordered(T.ObjectConstant2, T.ArrayClass); 665 CheckUnordered(T.ObjectConstant2, T.ArrayClass);
818 CheckUnordered(T.ArrayConstant, T.ObjectClass); 666 CheckUnordered(T.ArrayConstant, T.ObjectClass);
819
820 CheckSub(T.FloatArray, T.Array);
821 CheckSub(T.FloatArray, T.Object);
822 CheckUnordered(T.StringArray, T.AnyArray);
823
824 CheckSub(T.MethodFunction, T.Function);
825 CheckSub(T.NumberFunction1, T.Object);
826 CheckUnordered(T.SignedFunction1, T.NumberFunction1);
827 CheckUnordered(T.NumberFunction1, T.NumberFunction2);
828 } 667 }
829 668
830 void NowIs() { 669 void NowIs() {
831 // Least Element (Bottom): None->NowIs(T) 670 // Least Element (Bottom): None->NowIs(T)
832 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 671 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
833 TypeHandle type = *it; 672 TypeHandle type = *it;
834 CHECK(T.None->NowIs(type)); 673 CHECK(T.None->NowIs(type));
835 } 674 }
836 675
837 // Greatest Element (Top): T->NowIs(Any) 676 // Greatest Element (Top): T->NowIs(Any)
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
1146 CheckOverlap(T.ArrayConstant, T.Array, T.Semantic); 985 CheckOverlap(T.ArrayConstant, T.Array, T.Semantic);
1147 CheckOverlap(T.ObjectConstant1, T.ObjectConstant1, T.Semantic); 986 CheckOverlap(T.ObjectConstant1, T.ObjectConstant1, T.Semantic);
1148 CheckDisjoint(T.ObjectConstant1, T.ObjectConstant2, T.Semantic); 987 CheckDisjoint(T.ObjectConstant1, T.ObjectConstant2, T.Semantic);
1149 CheckDisjoint(T.ObjectConstant1, T.ArrayConstant, T.Semantic); 988 CheckDisjoint(T.ObjectConstant1, T.ArrayConstant, T.Semantic);
1150 989
1151 CheckDisjoint(T.ObjectConstant1, T.ObjectClass, T.Semantic); 990 CheckDisjoint(T.ObjectConstant1, T.ObjectClass, T.Semantic);
1152 CheckDisjoint(T.ObjectConstant2, T.ObjectClass, T.Semantic); 991 CheckDisjoint(T.ObjectConstant2, T.ObjectClass, T.Semantic);
1153 CheckDisjoint(T.ObjectConstant1, T.ArrayClass, T.Semantic); 992 CheckDisjoint(T.ObjectConstant1, T.ArrayClass, T.Semantic);
1154 CheckDisjoint(T.ObjectConstant2, T.ArrayClass, T.Semantic); 993 CheckDisjoint(T.ObjectConstant2, T.ArrayClass, T.Semantic);
1155 CheckDisjoint(T.ArrayConstant, T.ObjectClass, T.Semantic); 994 CheckDisjoint(T.ArrayConstant, T.ObjectClass, T.Semantic);
1156
1157 CheckOverlap(T.FloatArray, T.Array, T.Semantic);
1158 CheckDisjoint(T.FloatArray, T.AnyArray, T.Semantic);
1159 CheckDisjoint(T.FloatArray, T.StringArray, T.Semantic);
1160
1161 CheckOverlap(T.MethodFunction, T.Function, T.Semantic);
1162 CheckDisjoint(T.SignedFunction1, T.NumberFunction1, T.Semantic);
1163 CheckDisjoint(T.SignedFunction1, T.NumberFunction2, T.Semantic);
1164 CheckDisjoint(T.NumberFunction1, T.NumberFunction2, T.Semantic);
1165 CheckDisjoint(T.SignedFunction1, T.MethodFunction, T.Semantic);
1166 } 995 }
1167 996
1168 void Union1() { 997 void Union() {
1169 // Identity: Union(T, None) = T 998 // Identity: Union(T, None) = T
1170 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 999 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1171 TypeHandle type = *it; 1000 TypeHandle type = *it;
1172 TypeHandle union_type = T.Union(type, T.None); 1001 TypeHandle union_type = T.Union(type, T.None);
1173 CheckEqual(union_type, type); 1002 CheckEqual(union_type, type);
1174 } 1003 }
1175 1004
1176 // Domination: Union(T, Any) = Any 1005 // Domination: Union(T, Any) = Any
1177 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1006 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1178 TypeHandle type = *it; 1007 TypeHandle type = *it;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1227 1056
1228 // Upper Boundedness: T1->Is(T2) implies Union(T1, T2) = T2 1057 // Upper Boundedness: T1->Is(T2) implies Union(T1, T2) = T2
1229 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1058 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1230 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1059 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1231 TypeHandle type1 = *it1; 1060 TypeHandle type1 = *it1;
1232 TypeHandle type2 = *it2; 1061 TypeHandle type2 = *it2;
1233 TypeHandle union12 = T.Union(type1, type2); 1062 TypeHandle union12 = T.Union(type1, type2);
1234 if (type1->Is(type2)) CheckEqual(union12, type2); 1063 if (type1->Is(type2)) CheckEqual(union12, type2);
1235 } 1064 }
1236 } 1065 }
1237 }
1238 1066
1239 void Union2() {
1240 // Monotonicity: T1->Is(T2) implies Union(T1, T3)->Is(Union(T2, T3)) 1067 // Monotonicity: T1->Is(T2) implies Union(T1, T3)->Is(Union(T2, T3))
1241 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1068 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1242 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1069 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1243 for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1070 for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1244 TypeHandle type1 = *it1; 1071 TypeHandle type1 = *it1;
1245 TypeHandle type2 = *it2; 1072 TypeHandle type2 = *it2;
1246 TypeHandle type3 = *it3; 1073 TypeHandle type3 = *it3;
1247 TypeHandle union13 = T.Union(type1, type3); 1074 TypeHandle union13 = T.Union(type1, type3);
1248 TypeHandle union23 = T.Union(type2, type3); 1075 TypeHandle union23 = T.Union(type2, type3);
1249 CHECK(!type1->Is(type2) || union13->Is(union23)); 1076 CHECK(!type1->Is(type2) || union13->Is(union23));
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array); 1115 CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array);
1289 CheckUnordered( 1116 CheckUnordered(
1290 T.Union(T.ObjectConstant1, T.ObjectConstant2), T.ObjectClass); 1117 T.Union(T.ObjectConstant1, T.ObjectConstant2), T.ObjectClass);
1291 CheckOverlap( 1118 CheckOverlap(
1292 T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array, T.Semantic); 1119 T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array, T.Semantic);
1293 CheckDisjoint( 1120 CheckDisjoint(
1294 T.Union(T.ObjectConstant1, T.ArrayConstant), T.Number, T.Semantic); 1121 T.Union(T.ObjectConstant1, T.ArrayConstant), T.Number, T.Semantic);
1295 CheckDisjoint( 1122 CheckDisjoint(
1296 T.Union(T.ObjectConstant1, T.ArrayConstant), T.ObjectClass, T.Semantic); 1123 T.Union(T.ObjectConstant1, T.ArrayConstant), T.ObjectClass, T.Semantic);
1297 1124
1298 // Bitset-array
1299 CHECK(this->IsBitset(T.Union(T.AnyArray, T.Array)));
1300 CHECK(this->IsUnion(T.Union(T.FloatArray, T.Number)));
1301
1302 CheckEqual(T.Union(T.AnyArray, T.Array), T.Array);
1303 CheckSub(T.None, T.Union(T.FloatArray, T.Number));
1304 CheckSub(T.Union(T.FloatArray, T.Number), T.Any);
1305 CheckUnordered(T.Union(T.AnyArray, T.String), T.Array);
1306 CheckOverlap(T.Union(T.FloatArray, T.String), T.Object, T.Semantic);
1307 CheckDisjoint(T.Union(T.FloatArray, T.String), T.Number, T.Semantic);
1308
1309 // Bitset-function
1310 CHECK(this->IsBitset(T.Union(T.MethodFunction, T.Function)));
1311 CHECK(this->IsUnion(T.Union(T.NumberFunction1, T.Number)));
1312
1313 CheckEqual(T.Union(T.MethodFunction, T.Function), T.Function);
1314 CheckSub(T.None, T.Union(T.MethodFunction, T.Number));
1315 CheckSub(T.Union(T.MethodFunction, T.Number), T.Any);
1316 CheckUnordered(T.Union(T.NumberFunction1, T.String), T.Function);
1317 CheckOverlap(T.Union(T.NumberFunction2, T.String), T.Object, T.Semantic);
1318 CheckDisjoint(T.Union(T.NumberFunction1, T.String), T.Number, T.Semantic);
1319
1320 // Bitset-class 1125 // Bitset-class
1321 CheckSub( 1126 CheckSub(
1322 T.Union(T.ObjectClass, T.SignedSmall), T.Union(T.Object, T.Number)); 1127 T.Union(T.ObjectClass, T.SignedSmall), T.Union(T.Object, T.Number));
1323 CheckSub(T.Union(T.ObjectClass, T.Array), T.Object); 1128 CheckSub(T.Union(T.ObjectClass, T.Array), T.Object);
1324 CheckUnordered(T.Union(T.ObjectClass, T.String), T.Array); 1129 CheckUnordered(T.Union(T.ObjectClass, T.String), T.Array);
1325 CheckOverlap(T.Union(T.ObjectClass, T.String), T.Object, T.Semantic); 1130 CheckOverlap(T.Union(T.ObjectClass, T.String), T.Object, T.Semantic);
1326 CheckDisjoint(T.Union(T.ObjectClass, T.String), T.Number, T.Semantic); 1131 CheckDisjoint(T.Union(T.ObjectClass, T.String), T.Number, T.Semantic);
1327 1132
1328 // Bitset-constant 1133 // Bitset-constant
1329 CheckSub( 1134 CheckSub(
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 CheckEqual( 1170 CheckEqual(
1366 T.Union( 1171 T.Union(
1367 T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)), 1172 T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)),
1368 T.Union(T.ObjectConstant2, T.ObjectConstant1)); 1173 T.Union(T.ObjectConstant2, T.ObjectConstant1));
1369 CheckEqual( 1174 CheckEqual(
1370 T.Union( 1175 T.Union(
1371 T.Union(T.ArrayConstant, T.ObjectConstant2), T.ObjectConstant1), 1176 T.Union(T.ArrayConstant, T.ObjectConstant2), T.ObjectConstant1),
1372 T.Union( 1177 T.Union(
1373 T.ObjectConstant2, T.Union(T.ArrayConstant, T.ObjectConstant1))); 1178 T.ObjectConstant2, T.Union(T.ArrayConstant, T.ObjectConstant1)));
1374 1179
1375 // Array-union
1376 CheckEqual(
1377 T.Union(T.AnyArray, T.Union(T.FloatArray, T.AnyArray)),
1378 T.Union(T.AnyArray, T.FloatArray));
1379 CheckSub(T.Union(T.AnyArray, T.FloatArray), T.Array);
1380
1381 // Function-union
1382 CheckEqual(
1383 T.Union(T.NumberFunction1, T.NumberFunction2),
1384 T.Union(T.NumberFunction2, T.NumberFunction1));
1385 CheckSub(T.Union(T.SignedFunction1, T.MethodFunction), T.Function);
1386
1387 // Union-union 1180 // Union-union
1388 CheckEqual( 1181 CheckEqual(
1389 T.Union( 1182 T.Union(
1390 T.Union(T.ObjectConstant2, T.ObjectConstant1), 1183 T.Union(T.ObjectConstant2, T.ObjectConstant1),
1391 T.Union(T.ObjectConstant1, T.ObjectConstant2)), 1184 T.Union(T.ObjectConstant1, T.ObjectConstant2)),
1392 T.Union(T.ObjectConstant2, T.ObjectConstant1)); 1185 T.Union(T.ObjectConstant2, T.ObjectConstant1));
1393 CheckEqual( 1186 CheckEqual(
1394 T.Union( 1187 T.Union(
1395 T.Union(T.Number, T.ArrayClass), 1188 T.Union(T.Number, T.ArrayClass),
1396 T.Union(T.SignedSmall, T.Array)), 1189 T.Union(T.SignedSmall, T.Array)),
1397 T.Union(T.Number, T.Array)); 1190 T.Union(T.Number, T.Array));
1398 } 1191 }
1399 1192
1400 void Intersect1() { 1193 void Intersect() {
1401 // Identity: Intersect(T, Any) = T 1194 // Identity: Intersect(T, Any) = T
1402 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1195 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1403 TypeHandle type = *it; 1196 TypeHandle type = *it;
1404 TypeHandle intersect_type = T.Intersect(type, T.Any); 1197 TypeHandle intersect_type = T.Intersect(type, T.Any);
1405 CheckEqual(intersect_type, type); 1198 CheckEqual(intersect_type, type);
1406 } 1199 }
1407 1200
1408 // Domination: Intersect(T, None) = None 1201 // Domination: Intersect(T, None) = None
1409 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 1202 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1410 TypeHandle type = *it; 1203 TypeHandle type = *it;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1460 1253
1461 // Lower Boundedness: T1->Is(T2) implies Intersect(T1, T2) = T1 1254 // Lower Boundedness: T1->Is(T2) implies Intersect(T1, T2) = T1
1462 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1255 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1463 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1256 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1464 TypeHandle type1 = *it1; 1257 TypeHandle type1 = *it1;
1465 TypeHandle type2 = *it2; 1258 TypeHandle type2 = *it2;
1466 TypeHandle intersect12 = T.Intersect(type1, type2); 1259 TypeHandle intersect12 = T.Intersect(type1, type2);
1467 if (type1->Is(type2)) CheckEqual(intersect12, type1); 1260 if (type1->Is(type2)) CheckEqual(intersect12, type1);
1468 } 1261 }
1469 } 1262 }
1470 }
1471 1263
1472 void Intersect2() {
1473 // Monotonicity: T1->Is(T2) implies Intersect(T1, T3)->Is(Intersect(T2, T3)) 1264 // Monotonicity: T1->Is(T2) implies Intersect(T1, T3)->Is(Intersect(T2, T3))
1474 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 1265 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1475 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 1266 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1476 for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { 1267 for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1477 TypeHandle type1 = *it1; 1268 TypeHandle type1 = *it1;
1478 TypeHandle type2 = *it2; 1269 TypeHandle type2 = *it2;
1479 TypeHandle type3 = *it3; 1270 TypeHandle type3 = *it3;
1480 TypeHandle intersect13 = T.Intersect(type1, type3); 1271 TypeHandle intersect13 = T.Intersect(type1, type3);
1481 TypeHandle intersect23 = T.Intersect(type2, type3); 1272 TypeHandle intersect23 = T.Intersect(type2, type3);
1482 CHECK(!type1->Is(type2) || intersect13->Is(intersect23)); 1273 CHECK(!type1->Is(type2) || intersect13->Is(intersect23));
(...skipping 27 matching lines...) Expand all
1510 type1->Is(intersect23)); 1301 type1->Is(intersect23));
1511 } 1302 }
1512 } 1303 }
1513 } 1304 }
1514 1305
1515 // Bitset-class 1306 // Bitset-class
1516 CheckEqual(T.Intersect(T.ObjectClass, T.Object), T.ObjectClass); 1307 CheckEqual(T.Intersect(T.ObjectClass, T.Object), T.ObjectClass);
1517 CheckSub(T.Intersect(T.ObjectClass, T.Array), T.Representation); 1308 CheckSub(T.Intersect(T.ObjectClass, T.Array), T.Representation);
1518 CheckSub(T.Intersect(T.ObjectClass, T.Number), T.Representation); 1309 CheckSub(T.Intersect(T.ObjectClass, T.Number), T.Representation);
1519 1310
1520 // Bitset-array 1311 // Class-constant
1521 CheckEqual(T.Intersect(T.FloatArray, T.Object), T.FloatArray); 1312 CheckEqual(T.Intersect(T.ObjectConstant1, T.ObjectClass), T.None);
1522 CheckSub(T.Intersect(T.AnyArray, T.Function), T.Representation); 1313 CheckEqual(T.Intersect(T.ArrayClass, T.ObjectConstant2), T.None);
1523
1524 // Bitset-function
1525 CheckEqual(T.Intersect(T.MethodFunction, T.Object), T.MethodFunction);
1526 CheckSub(T.Intersect(T.NumberFunction1, T.Array), T.Representation);
1527 1314
1528 // Bitset-union 1315 // Bitset-union
1529 CheckEqual( 1316 CheckEqual(
1530 T.Intersect(T.Object, T.Union(T.ObjectConstant1, T.ObjectClass)), 1317 T.Intersect(T.Object, T.Union(T.ObjectConstant1, T.ObjectClass)),
1531 T.Union(T.ObjectConstant1, T.ObjectClass)); 1318 T.Union(T.ObjectConstant1, T.ObjectClass));
1532 CheckEqual( 1319 CheckEqual(
1533 T.Intersect(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number), 1320 T.Intersect(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number),
1534 T.None); 1321 T.None);
1535 1322
1536 // Class-constant
1537 CheckEqual(T.Intersect(T.ObjectConstant1, T.ObjectClass), T.None);
1538 CheckEqual(T.Intersect(T.ArrayClass, T.ObjectConstant2), T.None);
1539
1540 // Array-union
1541 CheckEqual(
1542 T.Intersect(T.FloatArray, T.Union(T.FloatArray, T.ArrayClass)),
1543 T.FloatArray);
1544 CheckEqual(
1545 T.Intersect(T.AnyArray, T.Union(T.Object, T.SmiConstant)),
1546 T.AnyArray);
1547 CheckEqual(
1548 T.Intersect(T.Union(T.AnyArray, T.ArrayConstant), T.FloatArray),
1549 T.None);
1550
1551 // Function-union
1552 CheckEqual(
1553 T.Intersect(T.MethodFunction, T.Union(T.String, T.MethodFunction)),
1554 T.MethodFunction);
1555 CheckEqual(
1556 T.Intersect(T.NumberFunction1, T.Union(T.Object, T.SmiConstant)),
1557 T.NumberFunction1);
1558 CheckEqual(
1559 T.Intersect(T.Union(T.MethodFunction, T.Name), T.NumberFunction2),
1560 T.None);
1561
1562 // Class-union 1323 // Class-union
1563 CheckEqual( 1324 CheckEqual(
1564 T.Intersect(T.ArrayClass, T.Union(T.ObjectConstant2, T.ArrayClass)), 1325 T.Intersect(T.ArrayClass, T.Union(T.ObjectConstant2, T.ArrayClass)),
1565 T.ArrayClass); 1326 T.ArrayClass);
1566 CheckEqual( 1327 CheckEqual(
1567 T.Intersect(T.ArrayClass, T.Union(T.Object, T.SmiConstant)), 1328 T.Intersect(T.ArrayClass, T.Union(T.Object, T.SmiConstant)),
1568 T.ArrayClass); 1329 T.ArrayClass);
1569 CheckEqual( 1330 CheckEqual(
1570 T.Intersect(T.Union(T.ObjectClass, T.ArrayConstant), T.ArrayClass), 1331 T.Intersect(T.Union(T.ObjectClass, T.ArrayConstant), T.ArrayClass),
1571 T.None); 1332 T.None);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1619 TypeHandle type3 = T.template Convert<Type2>(type2); 1380 TypeHandle type3 = T.template Convert<Type2>(type2);
1620 CheckEqual(type1, type3); 1381 CheckEqual(type1, type3);
1621 } 1382 }
1622 } 1383 }
1623 }; 1384 };
1624 1385
1625 typedef Tests<Type, Type*, Zone, ZoneRep> ZoneTests; 1386 typedef Tests<Type, Type*, Zone, ZoneRep> ZoneTests;
1626 typedef Tests<HeapType, Handle<HeapType>, Isolate, HeapRep> HeapTests; 1387 typedef Tests<HeapType, Handle<HeapType>, Isolate, HeapRep> HeapTests;
1627 1388
1628 1389
1629 TEST(BitsetType) { 1390 TEST(Bitset) {
1630 CcTest::InitializeVM(); 1391 CcTest::InitializeVM();
1631 ZoneTests().Bitset(); 1392 ZoneTests().Bitset();
1632 HeapTests().Bitset(); 1393 HeapTests().Bitset();
1633 } 1394 }
1634 1395
1635 1396
1636 TEST(ClassType) { 1397 TEST(Class) {
1637 CcTest::InitializeVM(); 1398 CcTest::InitializeVM();
1638 ZoneTests().Class(); 1399 ZoneTests().Class();
1639 HeapTests().Class(); 1400 HeapTests().Class();
1640 } 1401 }
1641 1402
1642 1403
1643 TEST(ConstantType) { 1404 TEST(Constant) {
1644 CcTest::InitializeVM(); 1405 CcTest::InitializeVM();
1645 ZoneTests().Constant(); 1406 ZoneTests().Constant();
1646 HeapTests().Constant(); 1407 HeapTests().Constant();
1647 } 1408 }
1648 1409
1649 1410
1650 TEST(ArrayType) {
1651 CcTest::InitializeVM();
1652 ZoneTests().Array();
1653 HeapTests().Array();
1654 }
1655
1656
1657 TEST(FunctionType) {
1658 CcTest::InitializeVM();
1659 ZoneTests().Function();
1660 HeapTests().Function();
1661 }
1662
1663
1664 TEST(Of) { 1411 TEST(Of) {
1665 CcTest::InitializeVM(); 1412 CcTest::InitializeVM();
1666 ZoneTests().Of(); 1413 ZoneTests().Of();
1667 HeapTests().Of(); 1414 HeapTests().Of();
1668 } 1415 }
1669 1416
1670 1417
1671 TEST(NowOf) { 1418 TEST(NowOf) {
1672 CcTest::InitializeVM(); 1419 CcTest::InitializeVM();
1673 ZoneTests().NowOf(); 1420 ZoneTests().NowOf();
(...skipping 29 matching lines...) Expand all
1703 } 1450 }
1704 1451
1705 1452
1706 TEST(Maybe) { 1453 TEST(Maybe) {
1707 CcTest::InitializeVM(); 1454 CcTest::InitializeVM();
1708 ZoneTests().Maybe(); 1455 ZoneTests().Maybe();
1709 HeapTests().Maybe(); 1456 HeapTests().Maybe();
1710 } 1457 }
1711 1458
1712 1459
1713 TEST(Union1) { 1460 TEST(Union) {
1714 CcTest::InitializeVM(); 1461 CcTest::InitializeVM();
1715 ZoneTests().Union1(); 1462 ZoneTests().Union();
1716 HeapTests().Union1(); 1463 HeapTests().Union();
1717 } 1464 }
1718 1465
1719 1466
1720 TEST(Union2) { 1467 TEST(Intersect) {
1721 CcTest::InitializeVM(); 1468 CcTest::InitializeVM();
1722 ZoneTests().Union2(); 1469 ZoneTests().Intersect();
1723 HeapTests().Union2(); 1470 HeapTests().Intersect();
1724 } 1471 }
1725 1472
1726 1473
1727 TEST(Intersect1) {
1728 CcTest::InitializeVM();
1729 ZoneTests().Intersect1();
1730 HeapTests().Intersect1();
1731 }
1732
1733
1734 TEST(Intersect2) {
1735 CcTest::InitializeVM();
1736 ZoneTests().Intersect2();
1737 HeapTests().Intersect2();
1738 }
1739
1740
1741 TEST(Convert) { 1474 TEST(Convert) {
1742 CcTest::InitializeVM(); 1475 CcTest::InitializeVM();
1743 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); 1476 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>();
1744 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); 1477 HeapTests().Convert<Type, Type*, Zone, ZoneRep>();
1745 } 1478 }
OLDNEW
« no previous file with comments | « src/x64/stub-cache-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698