Index: src/runtime/runtime-maths.cc |
diff --git a/src/runtime/runtime-maths.cc b/src/runtime/runtime-maths.cc |
index cb44c60113cc9c49469d39f86344627f0b8b8405..70c587d7454b401fbfe9f2fc61812b039a6a0531 100644 |
--- a/src/runtime/runtime-maths.cc |
+++ b/src/runtime/runtime-maths.cc |
@@ -247,48 +247,18 @@ |
} |
-RUNTIME_FUNCTION(Runtime_GenerateRandomNumbers) { |
- HandleScope scope(isolate); |
- DCHECK(args.length() == 1); |
- static const int kState0Offset = 0; |
- static const int kState1Offset = 1; |
- static const int kRandomBatchSize = 64; |
- CONVERT_ARG_HANDLE_CHECKED(Object, maybe_typed_array, 0); |
- Handle<JSTypedArray> typed_array; |
- // Allocate typed array if it does not yet exist. |
- if (maybe_typed_array->IsJSTypedArray()) { |
- typed_array = Handle<JSTypedArray>::cast(maybe_typed_array); |
- } else { |
- static const int kByteLength = kRandomBatchSize * kDoubleSize; |
- Handle<JSArrayBuffer> buffer = |
- isolate->factory()->NewJSArrayBuffer(SharedFlag::kNotShared, TENURED); |
- JSArrayBuffer::SetupAllocatingData(buffer, isolate, kByteLength, true, |
- SharedFlag::kNotShared); |
- typed_array = isolate->factory()->NewJSTypedArray( |
- kExternalFloat64Array, buffer, 0, kRandomBatchSize); |
- } |
- |
- DisallowHeapAllocation no_gc; |
- double* array = |
- reinterpret_cast<double*>(typed_array->GetBuffer()->backing_store()); |
- // Fetch existing state. |
- uint64_t state0 = double_to_uint64(array[kState0Offset]); |
- uint64_t state1 = double_to_uint64(array[kState1Offset]); |
- // Initialize state if not yet initialized. |
- while (state0 == 0 || state1 == 0) { |
- isolate->random_number_generator()->NextBytes(&state0, sizeof(state0)); |
- isolate->random_number_generator()->NextBytes(&state1, sizeof(state1)); |
- } |
- // Create random numbers. |
- for (int i = kState1Offset + 1; i < kRandomBatchSize; i++) { |
- // Generate random numbers using xorshift128+. |
- base::RandomNumberGenerator::XorShift128(&state0, &state1); |
- array[i] = base::RandomNumberGenerator::ToDouble(state0, state1); |
- } |
- // Persist current state. |
- array[kState0Offset] = uint64_to_double(state0); |
- array[kState1Offset] = uint64_to_double(state1); |
- return *typed_array; |
+RUNTIME_FUNCTION(Runtime_InitializeRNG) { |
+ HandleScope scope(isolate); |
+ DCHECK(args.length() == 0); |
+ static const int kSize = 4; |
+ Handle<FixedArray> array = isolate->factory()->NewFixedArray(kSize); |
+ uint16_t seeds[kSize]; |
+ do { |
+ isolate->random_number_generator()->NextBytes(seeds, |
+ kSize * sizeof(*seeds)); |
+ } while (!(seeds[0] && seeds[1] && seeds[2] && seeds[3])); |
+ for (int i = 0; i < kSize; i++) array->set(i, Smi::FromInt(seeds[i])); |
+ return *isolate->factory()->NewJSArrayWithElements(array); |
} |
} // namespace internal |
} // namespace v8 |