1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved.
2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Redistribution and use in source and binary forms, with or without
3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// modification, are permitted provided that the following conditions are
4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// met:
5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//
6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//     * Redistributions of source code must retain the above copyright
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//       notice, this list of conditions and the following disclaimer.
8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//     * Redistributions in binary form must reproduce the above
9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//       copyright notice, this list of conditions and the following
10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//       disclaimer in the documentation and/or other materials provided
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//       with the distribution.
12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//     * Neither the name of Google Inc. nor the names of its
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//       contributors may be used to endorse or promote products derived
14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//       from this software without specific prior written permission.
15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifndef V8_TEST_CCTEST_TYPES_H_
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define V8_TEST_CCTEST_TYPES_H_
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/utils/random-number-generator.h"
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/v8.h"
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace v8 {
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace internal {
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate<class Type, class TypeHandle, class Region>
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass Types {
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Types(Region* region, Isolate* isolate, v8::base::RandomNumberGenerator* rng)
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : region_(region), isolate_(isolate), rng_(rng) {
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    #define DECLARE_TYPE(name, value) \
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      name = Type::name(region);      \
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      types.push_back(name);
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    PROPER_BITSET_TYPE_LIST(DECLARE_TYPE)
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    #undef DECLARE_TYPE
48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    SignedSmall = Type::SignedSmall(region);
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UnsignedSmall = Type::UnsignedSmall(region);
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    object_map = isolate->factory()->NewMap(
53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        JS_OBJECT_TYPE, JSObject::kHeaderSize);
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    array_map = isolate->factory()->NewMap(
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        JS_ARRAY_TYPE, JSArray::kSize);
56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    number_map = isolate->factory()->NewMap(
57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        HEAP_NUMBER_TYPE, HeapNumber::kSize);
58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    uninitialized_map = isolate->factory()->uninitialized_map();
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    ObjectClass = Type::Class(object_map, region);
60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    ArrayClass = Type::Class(array_map, region);
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    NumberClass = Type::Class(number_map, region);
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    UninitializedClass = Type::Class(uninitialized_map, region);
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    maps.push_back(object_map);
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    maps.push_back(array_map);
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    maps.push_back(uninitialized_map);
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    for (MapVector::iterator it = maps.begin(); it != maps.end(); ++it) {
68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      types.push_back(Type::Class(*it, region));
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    smi = handle(Smi::FromInt(666), isolate);
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    signed32 = isolate->factory()->NewHeapNumber(0x40000000);
73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    object1 = isolate->factory()->NewJSObjectFromMap(object_map);
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    object2 = isolate->factory()->NewJSObjectFromMap(object_map);
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    array = isolate->factory()->NewJSArray(20);
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    uninitialized = isolate->factory()->uninitialized_value();
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    SmiConstant = Type::Constant(smi, region);
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Signed32Constant = Type::Constant(signed32, region);
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    ObjectConstant1 = Type::Constant(object1, region);
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    ObjectConstant2 = Type::Constant(object2, region);
82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    ArrayConstant = Type::Constant(array, region);
83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    UninitializedConstant = Type::Constant(uninitialized, region);
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    values.push_back(smi);
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    values.push_back(signed32);
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    values.push_back(object1);
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    values.push_back(object2);
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    values.push_back(array);
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    values.push_back(uninitialized);
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    for (ValueVector::iterator it = values.begin(); it != values.end(); ++it) {
92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      types.push_back(Type::Constant(*it, region));
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    integers.push_back(isolate->factory()->NewNumber(-V8_INFINITY));
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    integers.push_back(isolate->factory()->NewNumber(+V8_INFINITY));
97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    integers.push_back(isolate->factory()->NewNumber(-rng_->NextInt(10)));
98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    integers.push_back(isolate->factory()->NewNumber(+rng_->NextInt(10)));
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    for (int i = 0; i < 10; ++i) {
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      double x = rng_->NextInt();
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      integers.push_back(isolate->factory()->NewNumber(x));
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      x *= rng_->NextInt();
103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (!IsMinusZero(x)) integers.push_back(isolate->factory()->NewNumber(x));
104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Integer = Type::Range(-V8_INFINITY, +V8_INFINITY, region);
107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    NumberArray = Type::Array(Number, region);
109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    StringArray = Type::Array(String, region);
110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    AnyArray = Type::Array(Any, region);
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region);
113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    NumberFunction1 = Type::Function(Number, Number, region);
114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    NumberFunction2 = Type::Function(Number, Number, Number, region);
115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    MethodFunction = Type::Function(String, Object, 0, region);
116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    for (int i = 0; i < 30; ++i) {
118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      types.push_back(Fuzz());
119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::Map> object_map;
123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::Map> array_map;
124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::Map> number_map;
125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::Map> uninitialized_map;
126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::Smi> smi;
128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::HeapNumber> signed32;
129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::JSObject> object1;
130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::JSObject> object2;
131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::JSArray> array;
132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<i::Oddball> uninitialized;
133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  #define DECLARE_TYPE(name, value) TypeHandle name;
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PROPER_BITSET_TYPE_LIST(DECLARE_TYPE)
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  #undef DECLARE_TYPE
137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECLARE_TYPE(name, value) TypeHandle Mask##name##ForTesting;
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MASK_BITSET_TYPE_LIST(DECLARE_TYPE)
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DECLARE_TYPE
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TypeHandle SignedSmall;
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TypeHandle UnsignedSmall;
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle ObjectClass;
145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle ArrayClass;
146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle NumberClass;
147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle UninitializedClass;
148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle SmiConstant;
150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Signed32Constant;
151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle ObjectConstant1;
152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle ObjectConstant2;
153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle ArrayConstant;
154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle UninitializedConstant;
155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Integer;
157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle NumberArray;
159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle StringArray;
160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle AnyArray;
161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle SignedFunction1;
163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle NumberFunction1;
164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle NumberFunction2;
165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle MethodFunction;
166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef std::vector<TypeHandle> TypeVector;
168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef std::vector<Handle<i::Map> > MapVector;
169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef std::vector<Handle<i::Object> > ValueVector;
170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeVector types;
172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  MapVector maps;
173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ValueVector values;
174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ValueVector integers;  // "Integer" values used for range limits.
175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Of(Handle<i::Object> value) {
177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Of(value, region_);
178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle NowOf(Handle<i::Object> value) {
181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::NowOf(value, region_);
182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Class(Handle<i::Map> map) {
185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Class(map, region_);
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Constant(Handle<i::Object> value) {
189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Constant(value, region_);
190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TypeHandle Range(double min, double max) {
193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Range(min, max, region_);
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Context(TypeHandle outer) {
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Context(outer, region_);
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Array1(TypeHandle element) {
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Array(element, region_);
202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Function0(TypeHandle result, TypeHandle receiver) {
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Function(result, receiver, 0, region_);
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Function1(TypeHandle result, TypeHandle receiver, TypeHandle arg) {
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    TypeHandle type = Type::Function(result, receiver, 1, region_);
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    type->AsFunction()->InitParameter(0, arg);
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return type;
212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Function2(TypeHandle result, TypeHandle arg1, TypeHandle arg2) {
215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Function(result, arg1, arg2, region_);
216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Union(TypeHandle t1, TypeHandle t2) {
219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Union(t1, t2, region_);
220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Intersect(TypeHandle t1, TypeHandle t2) {
223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::Intersect(t1, t2, region_);
224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TypeHandle Representation(TypeHandle t) {
227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Type::Representation(t, region_);
228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // TypeHandle Semantic(TypeHandle t) { return Intersect(t,
231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // MaskSemanticForTesting); }
232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TypeHandle Semantic(TypeHandle t) { return Type::Semantic(t, region_); }
233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  template<class Type2, class TypeHandle2>
235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Convert(TypeHandle2 t) {
236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return Type::template Convert<Type2>(t, region_);
237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Random() {
240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return types[rng_->NextInt(static_cast<int>(types.size()))];
241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  TypeHandle Fuzz(int depth = 4) {
244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    switch (rng_->NextInt(depth == 0 ? 3 : 20)) {
245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 0: {  // bitset
246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        #define COUNT_BITSET_TYPES(type, value) + 1
247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int n = 0 PROPER_BITSET_TYPE_LIST(COUNT_BITSET_TYPES);
248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        #undef COUNT_BITSET_TYPES
249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        // Pick a bunch of named bitsets and return their intersection.
250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        TypeHandle result = Type::Any(region_);
251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        for (int i = 0, m = 1 + rng_->NextInt(3); i < m; ++i) {
252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          int j = rng_->NextInt(n);
253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          #define PICK_BITSET_TYPE(type, value) \
254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            if (j-- == 0) { \
255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              TypeHandle tmp = Type::Intersect( \
256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                  result, Type::type(region_), region_); \
257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              if (tmp->Is(Type::None()) && i != 0) { \
258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                break; \
259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              } else { \
260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                result = tmp; \
261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                continue; \
262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier              } \
263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            }
264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          PROPER_BITSET_TYPE_LIST(PICK_BITSET_TYPE)
265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          #undef PICK_BITSET_TYPE
266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return result;
268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 1: {  // class
270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int i = rng_->NextInt(static_cast<int>(maps.size()));
271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return Type::Class(maps[i], region_);
272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 2: {  // constant
274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int i = rng_->NextInt(static_cast<int>(values.size()));
275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return Type::Constant(values[i], region_);
276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 3: {  // range
278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int i = rng_->NextInt(static_cast<int>(integers.size()));
279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int j = rng_->NextInt(static_cast<int>(integers.size()));
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        double min = integers[i]->Number();
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        double max = integers[j]->Number();
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (min > max) std::swap(min, max);
283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return Type::Range(min, max, region_);
284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 4: {  // context
286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int depth = rng_->NextInt(3);
287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        TypeHandle type = Type::Internal(region_);
288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        for (int i = 0; i < depth; ++i) type = Type::Context(type, region_);
289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return type;
290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 5: {  // array
292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        TypeHandle element = Fuzz(depth / 2);
293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return Type::Array(element, region_);
294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 6:
296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 7: {  // function
297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        TypeHandle result = Fuzz(depth / 2);
298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        TypeHandle receiver = Fuzz(depth / 2);
299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int arity = rng_->NextInt(3);
300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        TypeHandle type = Type::Function(result, receiver, arity, region_);
301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        for (int i = 0; i < type->AsFunction()->Arity(); ++i) {
302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          TypeHandle parameter = Fuzz(depth / 2);
303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          type->AsFunction()->InitParameter(i, parameter);
304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return type;
306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case 8: {  // simd
308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        static const int num_simd_types =
309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            #define COUNT_SIMD_TYPE(NAME, Name, name, lane_count, lane_type) +1
310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            SIMD128_TYPES(COUNT_SIMD_TYPE);
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            #undef COUNT_SIMD_TYPE
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        TypeHandle (*simd_constructors[num_simd_types])(Isolate*, Region*) = {
313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          #define COUNT_SIMD_TYPE(NAME, Name, name, lane_count, lane_type) \
314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          &Type::Name,
315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          SIMD128_TYPES(COUNT_SIMD_TYPE)
316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          #undef COUNT_SIMD_TYPE
317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        };
318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return simd_constructors[rng_->NextInt(num_simd_types)](
319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            isolate_, region_);
320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      default: {  // union
322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int n = rng_->NextInt(10);
323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        TypeHandle type = None;
324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        for (int i = 0; i < n; ++i) {
325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          TypeHandle operand = Fuzz(depth - 1);
326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          type = Type::Union(type, operand, region_);
327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return type;
329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    UNREACHABLE();
332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Region* region() { return region_; }
335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Region* region_;
338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate_;
339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  v8::base::RandomNumberGenerator* rng_;
340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
347