| 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();
 | 
|  }
 | 
| 
 |