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

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

Issue 370973002: Properly seed the RNG for cctest/test-types. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 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/arguments.h ('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 // Use of this source code is governed by a BSD-style license that can be
3 // modification, are permitted provided that the following conditions are 3 // found in the LICENSE file.
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 4
28 #include <vector> 5 #include <vector>
29 6
30 #include "src/base/utils/random-number-generator.h"
31 #include "src/hydrogen-types.h" 7 #include "src/hydrogen-types.h"
8 #include "src/isolate-inl.h"
32 #include "src/types.h" 9 #include "src/types.h"
33 #include "test/cctest/cctest.h" 10 #include "test/cctest/cctest.h"
34 11
35 using namespace v8::internal; 12 using namespace v8::internal;
36 13
37 // Testing auxiliaries (breaking the Type abstraction). 14 // Testing auxiliaries (breaking the Type abstraction).
38 struct ZoneRep { 15 struct ZoneRep {
39 typedef void* Struct; 16 typedef void* Struct;
40 17
41 static bool IsStruct(Type* t, int tag) { 18 static bool IsStruct(Type* t, int tag) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 static int Glb(Handle<HeapType> type) { return Glb(*type); } 97 static int Glb(Handle<HeapType> type) { return Glb(*type); }
121 static int Lub(Handle<HeapType> type) { return Lub(*type); } 98 static int Lub(Handle<HeapType> type) { return Lub(*type); }
122 static int InherentLub(Handle<HeapType> type) { return InherentLub(*type); } 99 static int InherentLub(Handle<HeapType> type) { return InherentLub(*type); }
123 }; 100 };
124 }; 101 };
125 102
126 103
127 template<class Type, class TypeHandle, class Region> 104 template<class Type, class TypeHandle, class Region>
128 class Types { 105 class Types {
129 public: 106 public:
130 Types(Region* region, Isolate* isolate) : region_(region) { 107 Types(Region* region, Isolate* isolate)
108 : region_(region), rng_(isolate->random_number_generator()) {
131 #define DECLARE_TYPE(name, value) \ 109 #define DECLARE_TYPE(name, value) \
132 name = Type::name(region); \ 110 name = Type::name(region); \
133 types.push_back(name); 111 types.push_back(name);
134 BITSET_TYPE_LIST(DECLARE_TYPE) 112 BITSET_TYPE_LIST(DECLARE_TYPE)
135 #undef DECLARE_TYPE 113 #undef DECLARE_TYPE
136 114
137 object_map = isolate->factory()->NewMap(JS_OBJECT_TYPE, 3 * kPointerSize); 115 object_map = isolate->factory()->NewMap(JS_OBJECT_TYPE, 3 * kPointerSize);
138 array_map = isolate->factory()->NewMap(JS_ARRAY_TYPE, 4 * kPointerSize); 116 array_map = isolate->factory()->NewMap(JS_ARRAY_TYPE, 4 * kPointerSize);
139 uninitialized_map = isolate->factory()->uninitialized_map(); 117 uninitialized_map = isolate->factory()->uninitialized_map();
140 ObjectClass = Type::Class(object_map, region); 118 ObjectClass = Type::Class(object_map, region);
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 TypeHandle Intersect(TypeHandle t1, TypeHandle t2) { 245 TypeHandle Intersect(TypeHandle t1, TypeHandle t2) {
268 return Type::Intersect(t1, t2, region_); 246 return Type::Intersect(t1, t2, region_);
269 } 247 }
270 248
271 template<class Type2, class TypeHandle2> 249 template<class Type2, class TypeHandle2>
272 TypeHandle Convert(TypeHandle2 t) { 250 TypeHandle Convert(TypeHandle2 t) {
273 return Type::template Convert<Type2>(t, region_); 251 return Type::template Convert<Type2>(t, region_);
274 } 252 }
275 253
276 TypeHandle Random() { 254 TypeHandle Random() {
277 return types[rng_.NextInt(static_cast<int>(types.size()))]; 255 return types[rng_->NextInt(static_cast<int>(types.size()))];
278 } 256 }
279 257
280 TypeHandle Fuzz(int depth = 5) { 258 TypeHandle Fuzz(int depth = 5) {
281 switch (rng_.NextInt(depth == 0 ? 3 : 20)) { 259 switch (rng_->NextInt(depth == 0 ? 3 : 20)) {
282 case 0: { // bitset 260 case 0: { // bitset
283 int n = 0 261 int n = 0
284 #define COUNT_BITSET_TYPES(type, value) + 1 262 #define COUNT_BITSET_TYPES(type, value) + 1
285 BITSET_TYPE_LIST(COUNT_BITSET_TYPES) 263 BITSET_TYPE_LIST(COUNT_BITSET_TYPES)
286 #undef COUNT_BITSET_TYPES 264 #undef COUNT_BITSET_TYPES
287 ; 265 ;
288 int i = rng_.NextInt(n); 266 int i = rng_->NextInt(n);
289 #define PICK_BITSET_TYPE(type, value) \ 267 #define PICK_BITSET_TYPE(type, value) \
290 if (i-- == 0) return Type::type(region_); 268 if (i-- == 0) return Type::type(region_);
291 BITSET_TYPE_LIST(PICK_BITSET_TYPE) 269 BITSET_TYPE_LIST(PICK_BITSET_TYPE)
292 #undef PICK_BITSET_TYPE 270 #undef PICK_BITSET_TYPE
293 UNREACHABLE(); 271 UNREACHABLE();
294 } 272 }
295 case 1: { // class 273 case 1: { // class
296 int i = rng_.NextInt(static_cast<int>(maps.size())); 274 int i = rng_->NextInt(static_cast<int>(maps.size()));
297 return Type::Class(maps[i], region_); 275 return Type::Class(maps[i], region_);
298 } 276 }
299 case 2: { // constant 277 case 2: { // constant
300 int i = rng_.NextInt(static_cast<int>(values.size())); 278 int i = rng_->NextInt(static_cast<int>(values.size()));
301 return Type::Constant(values[i], region_); 279 return Type::Constant(values[i], region_);
302 } 280 }
303 case 3: { // context 281 case 3: { // context
304 int depth = rng_.NextInt(3); 282 int depth = rng_->NextInt(3);
305 TypeHandle type = Type::Internal(region_); 283 TypeHandle type = Type::Internal(region_);
306 for (int i = 0; i < depth; ++i) type = Type::Context(type, region_); 284 for (int i = 0; i < depth; ++i) type = Type::Context(type, region_);
307 return type; 285 return type;
308 } 286 }
309 case 4: { // array 287 case 4: { // array
310 TypeHandle element = Fuzz(depth / 2); 288 TypeHandle element = Fuzz(depth / 2);
311 return Type::Array(element, region_); 289 return Type::Array(element, region_);
312 } 290 }
313 case 5: 291 case 5:
314 case 6: 292 case 6:
315 case 7: { // function 293 case 7: { // function
316 TypeHandle result = Fuzz(depth / 2); 294 TypeHandle result = Fuzz(depth / 2);
317 TypeHandle receiver = Fuzz(depth / 2); 295 TypeHandle receiver = Fuzz(depth / 2);
318 int arity = rng_.NextInt(3); 296 int arity = rng_->NextInt(3);
319 TypeHandle type = Type::Function(result, receiver, arity, region_); 297 TypeHandle type = Type::Function(result, receiver, arity, region_);
320 for (int i = 0; i < type->AsFunction()->Arity(); ++i) { 298 for (int i = 0; i < type->AsFunction()->Arity(); ++i) {
321 TypeHandle parameter = Fuzz(depth - 1); 299 TypeHandle parameter = Fuzz(depth - 1);
322 type->AsFunction()->InitParameter(i, parameter); 300 type->AsFunction()->InitParameter(i, parameter);
323 } 301 }
324 } 302 }
325 default: { // union 303 default: { // union
326 int n = rng_.NextInt(10); 304 int n = rng_->NextInt(10);
327 TypeHandle type = None; 305 TypeHandle type = None;
328 for (int i = 0; i < n; ++i) { 306 for (int i = 0; i < n; ++i) {
329 TypeHandle operand = Fuzz(depth - 1); 307 TypeHandle operand = Fuzz(depth - 1);
330 type = Type::Union(type, operand, region_); 308 type = Type::Union(type, operand, region_);
331 } 309 }
332 return type; 310 return type;
333 } 311 }
334 } 312 }
335 UNREACHABLE(); 313 UNREACHABLE();
336 } 314 }
337 315
338 Region* region() { return region_; } 316 Region* region() { return region_; }
339 317
340 private: 318 private:
341 Region* region_; 319 Region* region_;
342 v8::base::RandomNumberGenerator rng_; 320 v8::base::RandomNumberGenerator* rng_;
343 }; 321 };
344 322
345 323
346 template<class Type, class TypeHandle, class Region, class Rep> 324 template<class Type, class TypeHandle, class Region, class Rep>
347 struct Tests : Rep { 325 struct Tests : Rep {
348 typedef Types<Type, TypeHandle, Region> TypesInstance; 326 typedef Types<Type, TypeHandle, Region> TypesInstance;
349 typedef typename TypesInstance::TypeVector::iterator TypeIterator; 327 typedef typename TypesInstance::TypeVector::iterator TypeIterator;
350 typedef typename TypesInstance::MapVector::iterator MapIterator; 328 typedef typename TypesInstance::MapVector::iterator MapIterator;
351 typedef typename TypesInstance::ValueVector::iterator ValueIterator; 329 typedef typename TypesInstance::ValueVector::iterator ValueIterator;
352 330
(...skipping 1580 matching lines...) Expand 10 before | Expand all | Expand 10 after
1933 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); 1911 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>();
1934 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); 1912 HeapTests().Convert<Type, Type*, Zone, ZoneRep>();
1935 } 1913 }
1936 1914
1937 1915
1938 TEST(HTypeFromType) { 1916 TEST(HTypeFromType) {
1939 CcTest::InitializeVM(); 1917 CcTest::InitializeVM();
1940 ZoneTests().HTypeFromType(); 1918 ZoneTests().HTypeFromType();
1941 HeapTests().HTypeFromType(); 1919 HeapTests().HTypeFromType();
1942 } 1920 }
OLDNEW
« no previous file with comments | « src/arguments.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698