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