OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 // triggered during environment creation there may be weak handle | 200 // triggered during environment creation there may be weak handle |
201 // processing callbacks which may create new environments. | 201 // processing callbacks which may create new environments. |
202 Genesis* previous_; | 202 Genesis* previous_; |
203 | 203 |
204 Handle<Context> global_context() { return global_context_; } | 204 Handle<Context> global_context() { return global_context_; } |
205 | 205 |
206 // Creates some basic objects. Used for creating a context from scratch. | 206 // Creates some basic objects. Used for creating a context from scratch. |
207 void CreateRoots(); | 207 void CreateRoots(); |
208 // Creates the empty function. Used for creating a context from scratch. | 208 // Creates the empty function. Used for creating a context from scratch. |
209 Handle<JSFunction> CreateEmptyFunction(); | 209 Handle<JSFunction> CreateEmptyFunction(); |
210 void CreateThrowTypeErrorCallbacks( | |
211 Handle<FixedArray> callbacks, | |
212 Builtins::Name builtin); | |
213 void CreateThrowTypeError(Handle<JSFunction> empty); | |
214 // Creates the global objects using the global and the template passed in | 210 // Creates the global objects using the global and the template passed in |
215 // through the API. We call this regardless of whether we are building a | 211 // through the API. We call this regardless of whether we are building a |
216 // context from scratch or using a deserialized one from the partial snapshot | 212 // context from scratch or using a deserialized one from the partial snapshot |
217 // but in the latter case we don't use the objects it produces directly, as | 213 // but in the latter case we don't use the objects it produces directly, as |
218 // we have to used the deserialized ones that are linked together with the | 214 // we have to used the deserialized ones that are linked together with the |
219 // rest of the context snapshot. | 215 // rest of the context snapshot. |
220 Handle<JSGlobalProxy> CreateNewGlobals( | 216 Handle<JSGlobalProxy> CreateNewGlobals( |
221 v8::Handle<v8::ObjectTemplate> global_template, | 217 v8::Handle<v8::ObjectTemplate> global_template, |
222 Handle<Object> global_object, | 218 Handle<Object> global_object, |
223 Handle<GlobalObject>* global_proxy_out); | 219 Handle<GlobalObject>* global_proxy_out); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to); | 256 void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to); |
261 | 257 |
262 enum PrototypePropertyMode { | 258 enum PrototypePropertyMode { |
263 DONT_ADD_PROTOTYPE, | 259 DONT_ADD_PROTOTYPE, |
264 ADD_READONLY_PROTOTYPE, | 260 ADD_READONLY_PROTOTYPE, |
265 ADD_WRITEABLE_PROTOTYPE | 261 ADD_WRITEABLE_PROTOTYPE |
266 }; | 262 }; |
267 Handle<DescriptorArray> ComputeFunctionInstanceDescriptor( | 263 Handle<DescriptorArray> ComputeFunctionInstanceDescriptor( |
268 PrototypePropertyMode prototypeMode); | 264 PrototypePropertyMode prototypeMode); |
269 void MakeFunctionInstancePrototypeWritable(); | 265 void MakeFunctionInstancePrototypeWritable(); |
270 Handle<DescriptorArray> ComputeStrictFunctionDescriptor( | |
271 PrototypePropertyMode propertyMode, | |
272 Handle<FixedArray> arguments, | |
273 Handle<FixedArray> caller); | |
274 | 266 |
275 static bool CompileBuiltin(int index); | 267 static bool CompileBuiltin(int index); |
276 static bool CompileNative(Vector<const char> name, Handle<String> source); | 268 static bool CompileNative(Vector<const char> name, Handle<String> source); |
277 static bool CompileScriptCached(Vector<const char> name, | 269 static bool CompileScriptCached(Vector<const char> name, |
278 Handle<String> source, | 270 Handle<String> source, |
279 SourceCodeCache* cache, | 271 SourceCodeCache* cache, |
280 v8::Extension* extension, | 272 v8::Extension* extension, |
281 Handle<Context> top_context, | 273 Handle<Context> top_context, |
282 bool use_runtime_context); | 274 bool use_runtime_context); |
283 | 275 |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 Handle<Map> empty_fm = Factory::CopyMapDropDescriptors( | 492 Handle<Map> empty_fm = Factory::CopyMapDropDescriptors( |
501 function_without_prototype_map); | 493 function_without_prototype_map); |
502 empty_fm->set_instance_descriptors( | 494 empty_fm->set_instance_descriptors( |
503 *function_without_prototype_map_descriptors); | 495 *function_without_prototype_map_descriptors); |
504 empty_fm->set_prototype(global_context()->object_function()->prototype()); | 496 empty_fm->set_prototype(global_context()->object_function()->prototype()); |
505 empty_function->set_map(*empty_fm); | 497 empty_function->set_map(*empty_fm); |
506 return empty_function; | 498 return empty_function; |
507 } | 499 } |
508 | 500 |
509 | 501 |
510 Handle<DescriptorArray> Genesis::ComputeStrictFunctionDescriptor( | |
511 PrototypePropertyMode prototypeMode, | |
512 Handle<FixedArray> arguments, | |
513 Handle<FixedArray> caller) { | |
514 Handle<DescriptorArray> descriptors = | |
515 Factory::NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE ? 4 : 5); | |
516 PropertyAttributes attributes = static_cast<PropertyAttributes>( | |
517 DONT_ENUM | DONT_DELETE | READ_ONLY); | |
518 | |
519 { // length | |
520 Handle<Proxy> proxy = Factory::NewProxy(&Accessors::FunctionLength); | |
521 CallbacksDescriptor d(*Factory::length_symbol(), *proxy, attributes); | |
522 descriptors->Set(0, &d); | |
523 } | |
524 { // name | |
525 Handle<Proxy> proxy = Factory::NewProxy(&Accessors::FunctionName); | |
526 CallbacksDescriptor d(*Factory::name_symbol(), *proxy, attributes); | |
527 descriptors->Set(1, &d); | |
528 } | |
529 { // arguments | |
530 CallbacksDescriptor d(*Factory::arguments_symbol(), *arguments, attributes); | |
531 descriptors->Set(2, &d); | |
532 } | |
533 { // caller | |
534 CallbacksDescriptor d(*Factory::caller_symbol(), *caller, attributes); | |
535 descriptors->Set(3, &d); | |
536 } | |
537 | |
538 // prototype | |
539 if (prototypeMode != DONT_ADD_PROTOTYPE) { | |
540 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { | |
541 attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY); | |
542 } | |
543 CallbacksDescriptor d( | |
544 *Factory::prototype_symbol(), | |
545 *Factory::NewProxy(&Accessors::FunctionPrototype), | |
546 attributes); | |
547 descriptors->Set(4, &d); | |
548 } | |
549 | |
550 descriptors->Sort(); | |
551 return descriptors; | |
552 } | |
553 | |
554 | |
555 void Genesis::CreateThrowTypeErrorCallbacks( | |
556 Handle<FixedArray> callbacks, | |
557 Builtins::Name builtin) { | |
558 // Create the ThrowTypeError function. | |
559 Handle<String> name = Factory::LookupAsciiSymbol("ThrowTypeError"); | |
560 Handle<JSFunction> pill = Factory::NewFunctionWithoutPrototypeStrict(name); | |
561 Handle<Code> code = Handle<Code>(Builtins::builtin(builtin)); | |
562 pill->set_map(global_context()->function_map_strict()); | |
563 pill->set_code(*code); | |
564 pill->shared()->set_code(*code); | |
565 pill->shared()->DontAdaptArguments(); | |
566 | |
567 // Install the poison pills into the calbacks array. | |
568 callbacks->set(0, *pill); | |
569 callbacks->set(1, *pill); | |
570 | |
571 PreventExtensions(pill); | |
572 } | |
573 | |
574 | |
575 // ECMAScript 5th Edition, 13.2.3 | |
576 void Genesis::CreateThrowTypeError(Handle<JSFunction> empty) { | |
577 // Create the pill callbacks arrays. The get/set callacks are installed | |
578 // after the maps get created below. | |
579 Handle<FixedArray> arguments = Factory::NewFixedArray(2, TENURED); | |
580 Handle<FixedArray> caller = Factory::NewFixedArray(2, TENURED); | |
581 | |
582 { // Allocate map for the strict mode function instances. | |
583 Handle<Map> map = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | |
584 global_context()->set_function_instance_map_strict(*map); | |
585 Handle<DescriptorArray> descriptors = ComputeStrictFunctionDescriptor( | |
586 ADD_WRITEABLE_PROTOTYPE, arguments, caller); | |
587 map->set_instance_descriptors(*descriptors); | |
588 map->set_function_with_prototype(true); | |
589 map->set_prototype(*empty); | |
590 } | |
591 | |
592 { // Allocate map for the prototype-less strict mode instances. | |
593 Handle<Map> map = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | |
594 global_context()->set_function_without_prototype_map_strict(*map); | |
595 Handle<DescriptorArray> descriptors = ComputeStrictFunctionDescriptor( | |
596 DONT_ADD_PROTOTYPE, arguments, caller); | |
597 map->set_instance_descriptors(*descriptors); | |
598 map->set_function_with_prototype(false); | |
599 map->set_prototype(*empty); | |
600 } | |
601 | |
602 { // Allocate map for the strict mode functions. | |
603 Handle<Map> map = Factory::NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | |
604 global_context()->set_function_map_strict(*map); | |
605 Handle<DescriptorArray> descriptors = ComputeStrictFunctionDescriptor( | |
606 ADD_READONLY_PROTOTYPE, arguments, caller); | |
607 map->set_instance_descriptors(*descriptors); | |
608 map->set_function_with_prototype(true); | |
609 map->set_prototype(*empty); | |
610 } | |
611 | |
612 CreateThrowTypeErrorCallbacks(arguments, Builtins::StrictFunctionArguments); | |
613 CreateThrowTypeErrorCallbacks(caller, Builtins::StrictFunctionCaller); | |
614 } | |
615 | |
616 | |
617 static void AddToWeakGlobalContextList(Context* context) { | 502 static void AddToWeakGlobalContextList(Context* context) { |
618 ASSERT(context->IsGlobalContext()); | 503 ASSERT(context->IsGlobalContext()); |
619 #ifdef DEBUG | 504 #ifdef DEBUG |
620 { // NOLINT | 505 { // NOLINT |
621 ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined()); | 506 ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined()); |
622 // Check that context is not in the list yet. | 507 // Check that context is not in the list yet. |
623 for (Object* current = Heap::global_contexts_list(); | 508 for (Object* current = Heap::global_contexts_list(); |
624 !current->IsUndefined(); | 509 !current->IsUndefined(); |
625 current = Context::cast(current)->get(Context::NEXT_CONTEXT_LINK)) { | 510 current = Context::cast(current)->get(Context::NEXT_CONTEXT_LINK)) { |
626 ASSERT(current != context); | 511 ASSERT(current != context); |
(...skipping 1339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1966 &inner_global); | 1851 &inner_global); |
1967 | 1852 |
1968 HookUpGlobalProxy(inner_global, global_proxy); | 1853 HookUpGlobalProxy(inner_global, global_proxy); |
1969 HookUpInnerGlobal(inner_global); | 1854 HookUpInnerGlobal(inner_global); |
1970 | 1855 |
1971 if (!ConfigureGlobalObjects(global_template)) return; | 1856 if (!ConfigureGlobalObjects(global_template)) return; |
1972 } else { | 1857 } else { |
1973 // We get here if there was no context snapshot. | 1858 // We get here if there was no context snapshot. |
1974 CreateRoots(); | 1859 CreateRoots(); |
1975 Handle<JSFunction> empty_function = CreateEmptyFunction(); | 1860 Handle<JSFunction> empty_function = CreateEmptyFunction(); |
1976 CreateThrowTypeError(empty_function); | |
1977 Handle<GlobalObject> inner_global; | 1861 Handle<GlobalObject> inner_global; |
1978 Handle<JSGlobalProxy> global_proxy = | 1862 Handle<JSGlobalProxy> global_proxy = |
1979 CreateNewGlobals(global_template, global_object, &inner_global); | 1863 CreateNewGlobals(global_template, global_object, &inner_global); |
1980 HookUpGlobalProxy(inner_global, global_proxy); | 1864 HookUpGlobalProxy(inner_global, global_proxy); |
1981 InitializeGlobal(inner_global, empty_function); | 1865 InitializeGlobal(inner_global, empty_function); |
1982 InstallJSFunctionResultCaches(); | 1866 InstallJSFunctionResultCaches(); |
1983 InitializeNormalizedMapCaches(); | 1867 InitializeNormalizedMapCaches(); |
1984 if (!InstallNatives()) return; | 1868 if (!InstallNatives()) return; |
1985 | 1869 |
1986 MakeFunctionInstancePrototypeWritable(); | 1870 MakeFunctionInstancePrototypeWritable(); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2033 } | 1917 } |
2034 | 1918 |
2035 | 1919 |
2036 // Restore statics that are thread local. | 1920 // Restore statics that are thread local. |
2037 char* BootstrapperActive::RestoreState(char* from) { | 1921 char* BootstrapperActive::RestoreState(char* from) { |
2038 nesting_ = *reinterpret_cast<int*>(from); | 1922 nesting_ = *reinterpret_cast<int*>(from); |
2039 return from + sizeof(nesting_); | 1923 return from + sizeof(nesting_); |
2040 } | 1924 } |
2041 | 1925 |
2042 } } // namespace v8::internal | 1926 } } // namespace v8::internal |
OLD | NEW |