OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api-natives.h" | 8 #include "src/api-natives.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/extensions/externalize-string-extension.h" | 10 #include "src/extensions/externalize-string-extension.h" |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 // The native context has a ScriptContextTable that store declarative bindings | 190 // The native context has a ScriptContextTable that store declarative bindings |
191 // made in script scopes. Add a "this" binding to that table pointing to the | 191 // made in script scopes. Add a "this" binding to that table pointing to the |
192 // global proxy. | 192 // global proxy. |
193 void InstallGlobalThisBinding(); | 193 void InstallGlobalThisBinding(); |
194 void HookUpGlobalThisBinding(Handle<FixedArray> outdated_contexts); | 194 void HookUpGlobalThisBinding(Handle<FixedArray> outdated_contexts); |
195 // New context initialization. Used for creating a context from scratch. | 195 // New context initialization. Used for creating a context from scratch. |
196 void InitializeGlobal(Handle<GlobalObject> global_object, | 196 void InitializeGlobal(Handle<GlobalObject> global_object, |
197 Handle<JSFunction> empty_function, | 197 Handle<JSFunction> empty_function, |
198 ContextType context_type); | 198 ContextType context_type); |
199 void InitializeExperimentalGlobal(); | 199 void InitializeExperimentalGlobal(); |
| 200 // Typed arrays are not serializable and have to initialized afterwards. |
| 201 bool InitializeBuiltinTypedArrays(); |
200 // Depending on the situation, expose and/or get rid of the utils object. | 202 // Depending on the situation, expose and/or get rid of the utils object. |
201 void ConfigureUtilsObject(ContextType context_type); | 203 void ConfigureUtilsObject(ContextType context_type); |
202 | 204 |
203 #define DECLARE_FEATURE_INITIALIZATION(id, descr) \ | 205 #define DECLARE_FEATURE_INITIALIZATION(id, descr) \ |
204 void InitializeGlobal_##id(); | 206 void InitializeGlobal_##id(); |
205 | 207 |
206 HARMONY_INPROGRESS(DECLARE_FEATURE_INITIALIZATION) | 208 HARMONY_INPROGRESS(DECLARE_FEATURE_INITIALIZATION) |
207 HARMONY_STAGED(DECLARE_FEATURE_INITIALIZATION) | 209 HARMONY_STAGED(DECLARE_FEATURE_INITIALIZATION) |
208 HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION) | 210 HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION) |
209 #undef DECLARE_FEATURE_INITIALIZATION | 211 #undef DECLARE_FEATURE_INITIALIZATION |
(...skipping 1570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1780 *data = reinterpret_cast<Data*>( | 1782 *data = reinterpret_cast<Data*>( |
1781 isolate->array_buffer_allocator()->Allocate(byte_length)); | 1783 isolate->array_buffer_allocator()->Allocate(byte_length)); |
1782 } | 1784 } |
1783 JSArrayBuffer::Setup(buffer, isolate, is_external, *data, byte_length, | 1785 JSArrayBuffer::Setup(buffer, isolate, is_external, *data, byte_length, |
1784 SharedFlag::kNotShared); | 1786 SharedFlag::kNotShared); |
1785 return isolate->factory()->NewJSTypedArray(type, buffer, 0, num_elements, | 1787 return isolate->factory()->NewJSTypedArray(type, buffer, 0, num_elements, |
1786 TENURED); | 1788 TENURED); |
1787 } | 1789 } |
1788 | 1790 |
1789 | 1791 |
| 1792 bool Genesis::InitializeBuiltinTypedArrays() { |
| 1793 HandleScope scope(isolate()); |
| 1794 const size_t num_elements = 2; |
| 1795 double* data = NULL; |
| 1796 Handle<JSTypedArray> rempio2result = |
| 1797 CreateTypedArray(isolate(), kExternalFloat64Array, num_elements, &data); |
| 1798 for (size_t i = 0; i < num_elements; i++) data[i] = 0; |
| 1799 |
| 1800 Handle<JSObject> utils = |
| 1801 Handle<JSObject>::cast(isolate()->natives_utils_object()); |
| 1802 Handle<String> name_string = isolate()->factory()->NewStringFromAsciiChecked( |
| 1803 "InitializeBuiltinTypedArrays"); |
| 1804 Handle<Object> fun = JSObject::GetDataProperty(utils, name_string); |
| 1805 Handle<Object> receiver = isolate()->factory()->undefined_value(); |
| 1806 Handle<Object> args[] = {utils, rempio2result}; |
| 1807 return !Execution::Call(isolate(), fun, receiver, arraysize(args), args) |
| 1808 .is_null(); |
| 1809 } |
| 1810 |
| 1811 |
1790 void Genesis::ConfigureUtilsObject(ContextType context_type) { | 1812 void Genesis::ConfigureUtilsObject(ContextType context_type) { |
1791 switch (context_type) { | 1813 switch (context_type) { |
1792 // We still need the utils object to find debug functions. | 1814 // We still need the utils object to find debug functions. |
1793 case DEBUG_CONTEXT: | 1815 case DEBUG_CONTEXT: |
1794 return; | 1816 return; |
1795 // Expose the natives in global if a valid name for it is specified. | 1817 // Expose the natives in global if a valid name for it is specified. |
1796 case FULL_CONTEXT: { | 1818 case FULL_CONTEXT: { |
1797 // We still need the utils object after deserialization. | 1819 // We still need the utils object after deserialization. |
1798 if (isolate()->serializer_enabled()) return; | 1820 if (isolate()->serializer_enabled()) return; |
1799 if (FLAG_expose_natives_as == NULL) break; | 1821 if (FLAG_expose_natives_as == NULL) break; |
(...skipping 1424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3224 if (!InstallExtraNatives()) return; | 3246 if (!InstallExtraNatives()) return; |
3225 if (!ConfigureGlobalObjects(global_proxy_template)) return; | 3247 if (!ConfigureGlobalObjects(global_proxy_template)) return; |
3226 } | 3248 } |
3227 isolate->counters()->contexts_created_from_scratch()->Increment(); | 3249 isolate->counters()->contexts_created_from_scratch()->Increment(); |
3228 } | 3250 } |
3229 | 3251 |
3230 // Install experimental natives. Do not include them into the | 3252 // Install experimental natives. Do not include them into the |
3231 // snapshot as we should be able to turn them off at runtime. Re-installing | 3253 // snapshot as we should be able to turn them off at runtime. Re-installing |
3232 // them after they have already been deserialized would also fail. | 3254 // them after they have already been deserialized would also fail. |
3233 if (context_type == FULL_CONTEXT) { | 3255 if (context_type == FULL_CONTEXT) { |
| 3256 if (!InitializeBuiltinTypedArrays()) return; |
3234 if (!isolate->serializer_enabled()) { | 3257 if (!isolate->serializer_enabled()) { |
3235 InitializeExperimentalGlobal(); | 3258 InitializeExperimentalGlobal(); |
3236 if (!InstallExperimentalNatives()) return; | 3259 if (!InstallExperimentalNatives()) return; |
3237 | 3260 |
3238 if (FLAG_experimental_extras) { | 3261 if (FLAG_experimental_extras) { |
3239 if (!InstallExperimentalExtraNatives()) return; | 3262 if (!InstallExperimentalExtraNatives()) return; |
3240 } | 3263 } |
3241 } | 3264 } |
3242 // The serializer cannot serialize typed arrays. Reset those typed arrays | 3265 // The serializer cannot serialize typed arrays. Reset those typed arrays |
3243 // for each new context. | 3266 // for each new context. |
3244 } else if (context_type == DEBUG_CONTEXT) { | 3267 } else if (context_type == DEBUG_CONTEXT) { |
3245 DCHECK(!isolate->serializer_enabled()); | 3268 DCHECK(!isolate->serializer_enabled()); |
| 3269 if (!InitializeBuiltinTypedArrays()) return; |
3246 InitializeExperimentalGlobal(); | 3270 InitializeExperimentalGlobal(); |
3247 if (!InstallDebuggerNatives()) return; | 3271 if (!InstallDebuggerNatives()) return; |
3248 } | 3272 } |
3249 | 3273 |
3250 ConfigureUtilsObject(context_type); | 3274 ConfigureUtilsObject(context_type); |
3251 | 3275 |
3252 // Check that the script context table is empty except for the 'this' binding. | 3276 // Check that the script context table is empty except for the 'this' binding. |
3253 // We do not need script contexts for native scripts. | 3277 // We do not need script contexts for native scripts. |
3254 if (!FLAG_global_var_shortcuts) { | 3278 if (!FLAG_global_var_shortcuts) { |
3255 DCHECK_EQ(1, native_context()->script_context_table()->used()); | 3279 DCHECK_EQ(1, native_context()->script_context_table()->used()); |
(...skipping 26 matching lines...) Expand all Loading... |
3282 } | 3306 } |
3283 | 3307 |
3284 | 3308 |
3285 // Called when the top-level V8 mutex is destroyed. | 3309 // Called when the top-level V8 mutex is destroyed. |
3286 void Bootstrapper::FreeThreadResources() { | 3310 void Bootstrapper::FreeThreadResources() { |
3287 DCHECK(!IsActive()); | 3311 DCHECK(!IsActive()); |
3288 } | 3312 } |
3289 | 3313 |
3290 } // namespace internal | 3314 } // namespace internal |
3291 } // namespace v8 | 3315 } // namespace v8 |
OLD | NEW |