Index: src/bootstrapper.cc |
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
index 22e59534a29a3283412fc188976281c1ca3ce403..46ae4534b27c9c32cf5648a2faba911000d7b7f3 100644 |
--- a/src/bootstrapper.cc |
+++ b/src/bootstrapper.cc |
@@ -211,6 +211,8 @@ class Genesis BASE_EMBEDDED { |
// Used for creating a context from scratch. |
void InstallNativeFunctions(); |
void InstallExperimentalNativeFunctions(); |
+ // Typed arrays are not serializable and have to initialized afterwards. |
+ void InitializeBuiltinTypedArrays(); |
#define DECLARE_FEATURE_INITIALIZATION(id, descr) \ |
void InstallNativeFunctions_##id(); \ |
@@ -1576,6 +1578,60 @@ void Genesis::InstallExperimentalNativeFunctions() { |
} |
+template <typename Data> |
+Data* SetBuiltinTypedArray(Isolate* isolate, Handle<JSBuiltinsObject> builtins, |
+ ExternalArrayType type, Data* data, |
+ size_t num_elements, const char* name) { |
+ size_t byte_length = num_elements * sizeof(*data); |
+ Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); |
+ bool should_be_freed = false; |
+ if (data == NULL) { |
+ data = reinterpret_cast<Data*>(malloc(byte_length)); |
+ should_be_freed = true; |
+ } |
+ Runtime::SetupArrayBuffer(isolate, buffer, true, data, byte_length); |
+ buffer->set_should_be_freed(should_be_freed); |
+ |
+ Handle<JSTypedArray> typed_array = |
+ isolate->factory()->NewJSTypedArray(type, buffer, 0, num_elements); |
+ Handle<String> name_string = isolate->factory()->InternalizeUtf8String(name); |
+ // Reset property cell type before (re)initializing. |
+ JSBuiltinsObject::InvalidatePropertyCell(builtins, name_string); |
+ JSObject::SetOwnPropertyIgnoreAttributes(builtins, name_string, typed_array, |
+ DONT_DELETE).Assert(); |
+ return data; |
+} |
+ |
+ |
+void Genesis::InitializeBuiltinTypedArrays() { |
+ Handle<JSBuiltinsObject> builtins(native_context()->builtins()); |
+ { // Initially seed the per-context random number generator using the |
+ // per-isolate random number generator. |
+ const size_t num_elements = 2; |
+ const size_t num_bytes = num_elements * sizeof(uint32_t); |
+ uint32_t* state = SetBuiltinTypedArray<uint32_t>(isolate(), builtins, |
+ kExternalUint32Array, NULL, |
+ num_elements, "rngstate"); |
+ do { |
+ isolate()->random_number_generator()->NextBytes(state, num_bytes); |
+ } while (state[0] == 0 || state[1] == 0); |
+ } |
+ |
+ { // Initialize trigonometric lookup tables and constants. |
+ const size_t num_elements = arraysize(fdlibm::MathConstants::constants); |
+ double* data = const_cast<double*>(fdlibm::MathConstants::constants); |
+ SetBuiltinTypedArray<double>(isolate(), builtins, kExternalFloat64Array, |
+ data, num_elements, "kMath"); |
+ } |
+ |
+ { // Initialize a result array for rempio2 calculation |
+ const size_t num_elements = 2; |
+ SetBuiltinTypedArray<double>(isolate(), builtins, kExternalFloat64Array, |
+ NULL, num_elements, "rempio2result"); |
+ } |
+} |
+ |
+ |
#define EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(id) \ |
void Genesis::InstallNativeFunctions_##id() {} |
@@ -2809,46 +2865,7 @@ Genesis::Genesis(Isolate* isolate, |
// The serializer cannot serialize typed arrays. Reset those typed arrays |
// for each new context. |
- { |
- // Initially seed the per-context random number generator using the |
- // per-isolate random number generator. |
- const int num_elems = 2; |
- const int num_bytes = num_elems * sizeof(uint32_t); |
- uint32_t* state = reinterpret_cast<uint32_t*>(malloc(num_bytes)); |
- |
- do { |
- isolate->random_number_generator()->NextBytes(state, num_bytes); |
- } while (state[0] == 0 || state[1] == 0); |
- |
- v8::Local<v8::ArrayBuffer> buffer = v8::ArrayBuffer::New( |
- reinterpret_cast<v8::Isolate*>(isolate), state, num_bytes); |
- Utils::OpenHandle(*buffer)->set_should_be_freed(true); |
- v8::Local<v8::Uint32Array> ta = v8::Uint32Array::New(buffer, 0, num_elems); |
- Handle<JSBuiltinsObject> builtins(native_context()->builtins()); |
- |
- Handle<String> rngstate = |
- factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("rngstate")); |
- // Reset property cell type before (re)initializing. |
- JSBuiltinsObject::InvalidatePropertyCell(builtins, rngstate); |
- JSObject::SetOwnPropertyIgnoreAttributes( |
- builtins, rngstate, Utils::OpenHandle(*ta), DONT_DELETE).Assert(); |
- |
- // Initialize trigonometric lookup tables and constants. |
- const int constants_size = arraysize(fdlibm::MathConstants::constants); |
- const int table_num_bytes = constants_size * kDoubleSize; |
- v8::Local<v8::ArrayBuffer> trig_buffer = v8::ArrayBuffer::New( |
- reinterpret_cast<v8::Isolate*>(isolate), |
- const_cast<double*>(fdlibm::MathConstants::constants), table_num_bytes); |
- v8::Local<v8::Float64Array> trig_table = |
- v8::Float64Array::New(trig_buffer, 0, constants_size); |
- |
- Handle<String> kmath = |
- factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("kMath")); |
- // Reset property cell type before (re)initializing. |
- JSBuiltinsObject::InvalidatePropertyCell(builtins, kmath); |
- JSObject::SetOwnPropertyIgnoreAttributes( |
- builtins, kmath, Utils::OpenHandle(*trig_table), DONT_DELETE).Assert(); |
- } |
+ InitializeBuiltinTypedArrays(); |
result_ = native_context(); |
} |