| Index: src/bootstrapper.cc
|
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
|
| index af99932a85872738be1b064a5dbda382a17004a7..ba032a8a6f651de808e1ce1f8da94df757b53d3d 100644
|
| --- a/src/bootstrapper.cc
|
| +++ b/src/bootstrapper.cc
|
| @@ -199,7 +199,7 @@ class Genesis BASE_EMBEDDED {
|
| ContextType context_type);
|
| void InitializeExperimentalGlobal();
|
| // Typed arrays are not serializable and have to initialized afterwards.
|
| - void InitializeBuiltinTypedArrays();
|
| + bool InitializeBuiltinTypedArrays();
|
| // Depending on the situation, expose and/or get rid of the utils object.
|
| void ConfigureUtilsObject(ContextType context_type);
|
|
|
| @@ -1790,42 +1790,36 @@ static Handle<JSObject> ResolveBuiltinIdHolder(Handle<Context> native_context,
|
|
|
|
|
| template <typename Data>
|
| -Data* SetBuiltinTypedArray(Isolate* isolate, Handle<JSBuiltinsObject> builtins,
|
| - ExternalArrayType type, Data* data,
|
| - size_t num_elements, const char* name,
|
| - const SharedFlag shared = SharedFlag::kNotShared,
|
| - const PretenureFlag pretenure = TENURED) {
|
| - size_t byte_length = num_elements * sizeof(*data);
|
| +Handle<JSTypedArray> CreateTypedArray(Isolate* isolate, ExternalArrayType type,
|
| + size_t num_elements, Data** data) {
|
| + size_t byte_length = num_elements * sizeof(**data);
|
| Handle<JSArrayBuffer> buffer =
|
| - isolate->factory()->NewJSArrayBuffer(shared, pretenure);
|
| - bool is_external = data != nullptr;
|
| + isolate->factory()->NewJSArrayBuffer(SharedFlag::kNotShared, TENURED);
|
| + bool is_external = (*data != nullptr);
|
| if (!is_external) {
|
| - data = reinterpret_cast<Data*>(
|
| + *data = reinterpret_cast<Data*>(
|
| isolate->array_buffer_allocator()->Allocate(byte_length));
|
| }
|
| - JSArrayBuffer::Setup(buffer, isolate, is_external, data, byte_length, shared);
|
| -
|
| - Handle<JSTypedArray> typed_array = isolate->factory()->NewJSTypedArray(
|
| - type, buffer, 0, num_elements, pretenure);
|
| - 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,
|
| - FROZEN)
|
| - .Assert();
|
| - return data;
|
| + JSArrayBuffer::Setup(buffer, isolate, is_external, *data, byte_length,
|
| + SharedFlag::kNotShared);
|
| + return isolate->factory()->NewJSTypedArray(type, buffer, 0, num_elements,
|
| + TENURED);
|
| }
|
|
|
|
|
| -void Genesis::InitializeBuiltinTypedArrays() {
|
| - Handle<JSBuiltinsObject> builtins(native_context()->builtins());
|
| - { // Initially seed the per-context random number generator using the
|
| - // per-isolate random number generator.
|
| +bool Genesis::InitializeBuiltinTypedArrays() {
|
| + HandleScope scope(isolate());
|
| + Handle<JSTypedArray> rng_state;
|
| + Handle<JSTypedArray> math_constants;
|
| + Handle<JSTypedArray> rempio2result;
|
| +
|
| + {
|
| + // Seed the per-context RNG using the per-isolate RNG.
|
| 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");
|
| + uint32_t* state = NULL;
|
| + rng_state =
|
| + CreateTypedArray(isolate(), kExternalUint32Array, num_elements, &state);
|
| do {
|
| isolate()->random_number_generator()->NextBytes(state, num_bytes);
|
| } while (state[0] == 0 || state[1] == 0);
|
| @@ -1833,18 +1827,28 @@ void Genesis::InitializeBuiltinTypedArrays() {
|
|
|
| { // 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");
|
| + double* constants = const_cast<double*>(fdlibm::MathConstants::constants);
|
| + math_constants = CreateTypedArray(isolate(), kExternalFloat64Array,
|
| + num_elements, &constants);
|
| }
|
|
|
| { // Initialize a result array for rempio2 calculation
|
| const size_t num_elements = 2;
|
| - double* data =
|
| - SetBuiltinTypedArray<double>(isolate(), builtins, kExternalFloat64Array,
|
| - NULL, num_elements, "rempio2result");
|
| + double* data = NULL;
|
| + rempio2result =
|
| + CreateTypedArray(isolate(), kExternalFloat64Array, num_elements, &data);
|
| for (size_t i = 0; i < num_elements; i++) data[i] = 0;
|
| }
|
| +
|
| + Handle<JSObject> utils =
|
| + Handle<JSObject>::cast(isolate()->natives_utils_object());
|
| + Handle<String> name_string = isolate()->factory()->NewStringFromAsciiChecked(
|
| + "InitializeBuiltinTypedArrays");
|
| + Handle<Object> fun = JSObject::GetDataProperty(utils, name_string);
|
| + Handle<Object> receiver = isolate()->factory()->undefined_value();
|
| + Handle<Object> args[] = {utils, rng_state, math_constants, rempio2result};
|
| + return !Execution::Call(isolate(), fun, receiver, arraysize(args), args)
|
| + .is_null();
|
| }
|
|
|
|
|
| @@ -3261,6 +3265,7 @@ Genesis::Genesis(Isolate* isolate,
|
| // snapshot as we should be able to turn them off at runtime. Re-installing
|
| // them after they have already been deserialized would also fail.
|
| if (context_type == FULL_CONTEXT) {
|
| + if (!InitializeBuiltinTypedArrays()) return;
|
| if (!isolate->serializer_enabled()) {
|
| InitializeExperimentalGlobal();
|
| if (!InstallExperimentalNatives()) return;
|
| @@ -3271,9 +3276,9 @@ Genesis::Genesis(Isolate* isolate,
|
| }
|
| // The serializer cannot serialize typed arrays. Reset those typed arrays
|
| // for each new context.
|
| - InitializeBuiltinTypedArrays();
|
| } else if (context_type == DEBUG_CONTEXT) {
|
| DCHECK(!isolate->serializer_enabled());
|
| + if (!InitializeBuiltinTypedArrays()) return;
|
| InitializeExperimentalGlobal();
|
| if (!InstallDebuggerNatives()) return;
|
| }
|
|
|