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(); | |
202 // Depending on the situation, expose and/or get rid of the utils object. | 200 // Depending on the situation, expose and/or get rid of the utils object. |
203 void ConfigureUtilsObject(ContextType context_type); | 201 void ConfigureUtilsObject(ContextType context_type); |
204 | 202 |
205 #define DECLARE_FEATURE_INITIALIZATION(id, descr) \ | 203 #define DECLARE_FEATURE_INITIALIZATION(id, descr) \ |
206 void InitializeGlobal_##id(); | 204 void InitializeGlobal_##id(); |
207 | 205 |
208 HARMONY_INPROGRESS(DECLARE_FEATURE_INITIALIZATION) | 206 HARMONY_INPROGRESS(DECLARE_FEATURE_INITIALIZATION) |
209 HARMONY_STAGED(DECLARE_FEATURE_INITIALIZATION) | 207 HARMONY_STAGED(DECLARE_FEATURE_INITIALIZATION) |
210 HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION) | 208 HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION) |
211 #undef DECLARE_FEATURE_INITIALIZATION | 209 #undef DECLARE_FEATURE_INITIALIZATION |
(...skipping 1570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1782 *data = reinterpret_cast<Data*>( | 1780 *data = reinterpret_cast<Data*>( |
1783 isolate->array_buffer_allocator()->Allocate(byte_length)); | 1781 isolate->array_buffer_allocator()->Allocate(byte_length)); |
1784 } | 1782 } |
1785 JSArrayBuffer::Setup(buffer, isolate, is_external, *data, byte_length, | 1783 JSArrayBuffer::Setup(buffer, isolate, is_external, *data, byte_length, |
1786 SharedFlag::kNotShared); | 1784 SharedFlag::kNotShared); |
1787 return isolate->factory()->NewJSTypedArray(type, buffer, 0, num_elements, | 1785 return isolate->factory()->NewJSTypedArray(type, buffer, 0, num_elements, |
1788 TENURED); | 1786 TENURED); |
1789 } | 1787 } |
1790 | 1788 |
1791 | 1789 |
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 | |
1812 void Genesis::ConfigureUtilsObject(ContextType context_type) { | 1790 void Genesis::ConfigureUtilsObject(ContextType context_type) { |
1813 switch (context_type) { | 1791 switch (context_type) { |
1814 // We still need the utils object to find debug functions. | 1792 // We still need the utils object to find debug functions. |
1815 case DEBUG_CONTEXT: | 1793 case DEBUG_CONTEXT: |
1816 return; | 1794 return; |
1817 // Expose the natives in global if a valid name for it is specified. | 1795 // Expose the natives in global if a valid name for it is specified. |
1818 case FULL_CONTEXT: { | 1796 case FULL_CONTEXT: { |
1819 // We still need the utils object after deserialization. | 1797 // We still need the utils object after deserialization. |
1820 if (isolate()->serializer_enabled()) return; | 1798 if (isolate()->serializer_enabled()) return; |
1821 if (FLAG_expose_natives_as == NULL) break; | 1799 if (FLAG_expose_natives_as == NULL) break; |
(...skipping 1424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3246 if (!InstallExtraNatives()) return; | 3224 if (!InstallExtraNatives()) return; |
3247 if (!ConfigureGlobalObjects(global_proxy_template)) return; | 3225 if (!ConfigureGlobalObjects(global_proxy_template)) return; |
3248 } | 3226 } |
3249 isolate->counters()->contexts_created_from_scratch()->Increment(); | 3227 isolate->counters()->contexts_created_from_scratch()->Increment(); |
3250 } | 3228 } |
3251 | 3229 |
3252 // Install experimental natives. Do not include them into the | 3230 // Install experimental natives. Do not include them into the |
3253 // snapshot as we should be able to turn them off at runtime. Re-installing | 3231 // snapshot as we should be able to turn them off at runtime. Re-installing |
3254 // them after they have already been deserialized would also fail. | 3232 // them after they have already been deserialized would also fail. |
3255 if (context_type == FULL_CONTEXT) { | 3233 if (context_type == FULL_CONTEXT) { |
3256 if (!InitializeBuiltinTypedArrays()) return; | |
3257 if (!isolate->serializer_enabled()) { | 3234 if (!isolate->serializer_enabled()) { |
3258 InitializeExperimentalGlobal(); | 3235 InitializeExperimentalGlobal(); |
3259 if (!InstallExperimentalNatives()) return; | 3236 if (!InstallExperimentalNatives()) return; |
3260 | 3237 |
3261 if (FLAG_experimental_extras) { | 3238 if (FLAG_experimental_extras) { |
3262 if (!InstallExperimentalExtraNatives()) return; | 3239 if (!InstallExperimentalExtraNatives()) return; |
3263 } | 3240 } |
3264 } | 3241 } |
3265 // The serializer cannot serialize typed arrays. Reset those typed arrays | 3242 // The serializer cannot serialize typed arrays. Reset those typed arrays |
3266 // for each new context. | 3243 // for each new context. |
3267 } else if (context_type == DEBUG_CONTEXT) { | 3244 } else if (context_type == DEBUG_CONTEXT) { |
3268 DCHECK(!isolate->serializer_enabled()); | 3245 DCHECK(!isolate->serializer_enabled()); |
3269 if (!InitializeBuiltinTypedArrays()) return; | |
3270 InitializeExperimentalGlobal(); | 3246 InitializeExperimentalGlobal(); |
3271 if (!InstallDebuggerNatives()) return; | 3247 if (!InstallDebuggerNatives()) return; |
3272 } | 3248 } |
3273 | 3249 |
3274 ConfigureUtilsObject(context_type); | 3250 ConfigureUtilsObject(context_type); |
3275 | 3251 |
3276 // Check that the script context table is empty except for the 'this' binding. | 3252 // Check that the script context table is empty except for the 'this' binding. |
3277 // We do not need script contexts for native scripts. | 3253 // We do not need script contexts for native scripts. |
3278 if (!FLAG_global_var_shortcuts) { | 3254 if (!FLAG_global_var_shortcuts) { |
3279 DCHECK_EQ(1, native_context()->script_context_table()->used()); | 3255 DCHECK_EQ(1, native_context()->script_context_table()->used()); |
(...skipping 26 matching lines...) Expand all Loading... |
3306 } | 3282 } |
3307 | 3283 |
3308 | 3284 |
3309 // Called when the top-level V8 mutex is destroyed. | 3285 // Called when the top-level V8 mutex is destroyed. |
3310 void Bootstrapper::FreeThreadResources() { | 3286 void Bootstrapper::FreeThreadResources() { |
3311 DCHECK(!IsActive()); | 3287 DCHECK(!IsActive()); |
3312 } | 3288 } |
3313 | 3289 |
3314 } // namespace internal | 3290 } // namespace internal |
3315 } // namespace v8 | 3291 } // namespace v8 |
OLD | NEW |