Untangle RNG from v8 core
authorjochen@chromium.org <jochen@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 17 Jun 2014 16:27:19 +0000 (16:27 +0000)
committerjochen@chromium.org <jochen@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 17 Jun 2014 16:27:19 +0000 (16:27 +0000)
This will allow for using the RNG from platform files without depending on
isolates.

BUG=none
R=bmeurer@chromium.org
LOG=n

Review URL: https://codereview.chromium.org/333053002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21879 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/base/macros.h
src/globals.h
src/isolate-inl.h
src/utils.h
src/utils/DEPS [new file with mode: 0644]
src/utils/random-number-generator.cc
src/utils/random-number-generator.h
test/cctest/test-random-number-generator.cc

index 57191edcfebb36090821f546bb53071e94e7842e..736a656ed9f11e09ce217a6bf7b4a479f0b034d9 100644 (file)
@@ -109,4 +109,12 @@ template <int> class StaticAssertionHelper { };
 template <typename T>
 inline void USE(T) { }
 
+
+#define IS_POWER_OF_TWO(x) ((x) != 0 && (((x) & ((x) - 1)) == 0))
+
+// The following macro works on both 32 and 64-bit platforms.
+// Usage: instead of writing 0x1234567890123456
+//      write V8_2PART_UINT64_C(0x12345678,90123456);
+#define V8_2PART_UINT64_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
+
 #endif   // V8_BASE_MACROS_H_
index dde23fe8847ec903f3307feb54d13a5caf4e2a68..595ecc37cfea7645dce1508889e1f5afad5f2456 100644 (file)
@@ -101,11 +101,6 @@ typedef byte* Address;
 # define V8_PTR_PREFIX    ""
 #endif
 
-// The following macro works on both 32 and 64-bit platforms.
-// Usage: instead of writing 0x1234567890123456
-//      write V8_2PART_UINT64_C(0x12345678,90123456);
-#define V8_2PART_UINT64_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
-
 #define V8PRIxPTR V8_PTR_PREFIX "x"
 #define V8PRIdPTR V8_PTR_PREFIX "d"
 #define V8PRIuPTR V8_PTR_PREFIX "u"
index c33e61d41777618478bb66cf71ed83913f2d3e4f..12a861f2b8961653c63566bef388735739c2db83 100644 (file)
@@ -32,7 +32,11 @@ bool Isolate::DebuggerHasBreakPoints() {
 
 RandomNumberGenerator* Isolate::random_number_generator() {
   if (random_number_generator_ == NULL) {
-    random_number_generator_ = new RandomNumberGenerator;
+    if (FLAG_random_seed != 0) {
+      random_number_generator_ = new RandomNumberGenerator(FLAG_random_seed);
+    } else {
+      random_number_generator_ = new RandomNumberGenerator();
+    }
   }
   return random_number_generator_;
 }
index a0553d266c5b2b045a6e25f9ed34ba388b16f2b3..7ab58ce3bc75160c677d934acfad7ffd96aa2a95 100644 (file)
@@ -10,6 +10,7 @@
 #include <string.h>
 
 #include "src/allocation.h"
+#include "src/base/macros.h"
 #include "src/checks.h"
 #include "src/globals.h"
 #include "src/list.h"
@@ -22,8 +23,6 @@ namespace internal {
 // ----------------------------------------------------------------------------
 // General helper functions
 
-#define IS_POWER_OF_TWO(x) ((x) != 0 && (((x) & ((x) - 1)) == 0))
-
 // Returns true iff x is a power of 2. Cannot be used with the maximally
 // negative value of the type T (the -1 overflows).
 template <typename T>
diff --git a/src/utils/DEPS b/src/utils/DEPS
new file mode 100644 (file)
index 0000000..3da1ce1
--- /dev/null
@@ -0,0 +1,5 @@
+include_rules = [
+  "-src",
+  "+src/base",
+  "+src/platform",
+]
index cf71c6aa66497ad10b4ae7b582c83d6b777c2320..3da6a5aa4ac3e99d786a44a0a3a93580eaa61bbf 100644 (file)
@@ -7,10 +7,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "src/flags.h"
+#include <new>
+
+#include "src/base/macros.h"
 #include "src/platform/mutex.h"
 #include "src/platform/time.h"
-#include "src/utils.h"
 
 namespace v8 {
 namespace internal {
@@ -27,12 +28,6 @@ void RandomNumberGenerator::SetEntropySource(EntropySource source) {
 
 
 RandomNumberGenerator::RandomNumberGenerator() {
-  // Check --random-seed flag first.
-  if (FLAG_random_seed != 0) {
-    SetSeed(FLAG_random_seed);
-    return;
-  }
-
   // Check if embedder supplied an entropy source.
   { LockGuard<Mutex> lock_guard(entropy_mutex.Pointer());
     if (entropy_source != NULL) {
@@ -87,7 +82,7 @@ int RandomNumberGenerator::NextInt(int max) {
   ASSERT_LE(0, max);
 
   // Fast path if max is a power of 2.
-  if (IsPowerOf2(max)) {
+  if (IS_POWER_OF_TWO(max)) {
     return static_cast<int>((max * static_cast<int64_t>(Next(31))) >> 31);
   }
 
index 86375738d6bd73656f7ab6aa1f09857f13572f4c..54075716c48c2f4c024600b4ee38cef0d834b2d9 100644 (file)
@@ -5,7 +5,7 @@
 #ifndef V8_UTILS_RANDOM_NUMBER_GENERATOR_H_
 #define V8_UTILS_RANDOM_NUMBER_GENERATOR_H_
 
-#include "src/globals.h"
+#include "src/base/macros.h"
 
 namespace v8 {
 namespace internal {
index b8cf860d19edebdc31050be9d7fce7fd2225a4e3..db7ec758200c1840137e3be7e3de561c77978f15 100644 (file)
@@ -28,6 +28,7 @@
 #include "src/v8.h"
 
 #include "src/utils/random-number-generator.h"
+#include "src/isolate-inl.h"
 #include "test/cctest/cctest.h"
 
 using namespace v8::internal;
@@ -77,7 +78,9 @@ TEST(NextDoubleRange) {
 TEST(RandomSeedFlagIsUsed) {
   for (unsigned n = 0; n < ARRAY_SIZE(kRandomSeeds); ++n) {
     FLAG_random_seed = kRandomSeeds[n];
-    RandomNumberGenerator rng1;
+    v8::Isolate* i = v8::Isolate::New();
+    RandomNumberGenerator& rng1 =
+        *reinterpret_cast<Isolate*>(i)->random_number_generator();
     RandomNumberGenerator rng2(kRandomSeeds[n]);
     for (int k = 1; k <= kMaxRuns; ++k) {
       int64_t i1, i2;
@@ -88,5 +91,6 @@ TEST(RandomSeedFlagIsUsed) {
       CHECK_EQ(rng2.NextInt(k), rng1.NextInt(k));
       CHECK_EQ(rng2.NextDouble(), rng1.NextDouble());
     }
+    i->Dispose();
   }
 }