Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 Handle<Context> global_context() { return global_context_; } | 165 Handle<Context> global_context() { return global_context_; } |
| 166 | 166 |
| 167 // Creates some basic objects. Used for creating a context from scratch. | 167 // Creates some basic objects. Used for creating a context from scratch. |
| 168 void CreateRoots(); | 168 void CreateRoots(); |
| 169 // Creates the empty function. Used for creating a context from scratch. | 169 // Creates the empty function. Used for creating a context from scratch. |
| 170 Handle<JSFunction> CreateEmptyFunction(Isolate* isolate); | 170 Handle<JSFunction> CreateEmptyFunction(Isolate* isolate); |
| 171 // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3 | 171 // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3 |
| 172 Handle<JSFunction> GetThrowTypeErrorFunction(); | 172 Handle<JSFunction> GetThrowTypeErrorFunction(); |
| 173 | 173 |
| 174 void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); | 174 void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); |
| 175 | |
| 176 // Make the "arguments" and "caller" properties throw a TypeError on access. | |
| 177 void InitArgumentsAndCaller(Handle<Map> map); | |
|
Michael Starzinger
2012/02/17 13:33:28
In ECMA-Script speak this method should better be
Sven Panne
2012/02/20 08:26:03
Done.
| |
| 178 | |
| 175 // Creates the global objects using the global and the template passed in | 179 // Creates the global objects using the global and the template passed in |
| 176 // through the API. We call this regardless of whether we are building a | 180 // through the API. We call this regardless of whether we are building a |
| 177 // context from scratch or using a deserialized one from the partial snapshot | 181 // context from scratch or using a deserialized one from the partial snapshot |
| 178 // but in the latter case we don't use the objects it produces directly, as | 182 // but in the latter case we don't use the objects it produces directly, as |
| 179 // we have to used the deserialized ones that are linked together with the | 183 // we have to used the deserialized ones that are linked together with the |
| 180 // rest of the context snapshot. | 184 // rest of the context snapshot. |
| 181 Handle<JSGlobalProxy> CreateNewGlobals( | 185 Handle<JSGlobalProxy> CreateNewGlobals( |
| 182 v8::Handle<v8::ObjectTemplate> global_template, | 186 v8::Handle<v8::ObjectTemplate> global_template, |
| 183 Handle<Object> global_object, | 187 Handle<Object> global_object, |
| 184 Handle<GlobalObject>* global_proxy_out); | 188 Handle<GlobalObject>* global_proxy_out); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 249 }; | 253 }; |
| 250 | 254 |
| 251 Handle<Map> CreateFunctionMap(PrototypePropertyMode prototype_mode); | 255 Handle<Map> CreateFunctionMap(PrototypePropertyMode prototype_mode); |
| 252 | 256 |
| 253 Handle<DescriptorArray> ComputeFunctionInstanceDescriptor( | 257 Handle<DescriptorArray> ComputeFunctionInstanceDescriptor( |
| 254 PrototypePropertyMode prototypeMode); | 258 PrototypePropertyMode prototypeMode); |
| 255 void MakeFunctionInstancePrototypeWritable(); | 259 void MakeFunctionInstancePrototypeWritable(); |
| 256 | 260 |
| 257 Handle<Map> CreateStrictModeFunctionMap( | 261 Handle<Map> CreateStrictModeFunctionMap( |
| 258 PrototypePropertyMode prototype_mode, | 262 PrototypePropertyMode prototype_mode, |
| 259 Handle<JSFunction> empty_function, | 263 Handle<JSFunction> empty_function); |
| 260 Handle<AccessorPair> arguments_callbacks, | |
| 261 Handle<AccessorPair> caller_callbacks); | |
| 262 | 264 |
| 263 Handle<DescriptorArray> ComputeStrictFunctionInstanceDescriptor( | 265 Handle<DescriptorArray> ComputeStrictFunctionInstanceDescriptor( |
| 264 PrototypePropertyMode propertyMode, | 266 PrototypePropertyMode propertyMode); |
| 265 Handle<AccessorPair> arguments, | |
| 266 Handle<AccessorPair> caller); | |
| 267 | 267 |
| 268 static bool CompileBuiltin(Isolate* isolate, int index); | 268 static bool CompileBuiltin(Isolate* isolate, int index); |
| 269 static bool CompileExperimentalBuiltin(Isolate* isolate, int index); | 269 static bool CompileExperimentalBuiltin(Isolate* isolate, int index); |
| 270 static bool CompileNative(Vector<const char> name, Handle<String> source); | 270 static bool CompileNative(Vector<const char> name, Handle<String> source); |
| 271 static bool CompileScriptCached(Vector<const char> name, | 271 static bool CompileScriptCached(Vector<const char> name, |
| 272 Handle<String> source, | 272 Handle<String> source, |
| 273 SourceCodeCache* cache, | 273 SourceCodeCache* cache, |
| 274 v8::Extension* extension, | 274 v8::Extension* extension, |
| 275 Handle<Context> top_context, | 275 Handle<Context> top_context, |
| 276 bool use_runtime_context); | 276 bool use_runtime_context); |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 525 function_without_prototype_map); | 525 function_without_prototype_map); |
| 526 empty_fm->set_instance_descriptors( | 526 empty_fm->set_instance_descriptors( |
| 527 function_without_prototype_map->instance_descriptors()); | 527 function_without_prototype_map->instance_descriptors()); |
| 528 empty_fm->set_prototype(global_context()->object_function()->prototype()); | 528 empty_fm->set_prototype(global_context()->object_function()->prototype()); |
| 529 empty_function->set_map(*empty_fm); | 529 empty_function->set_map(*empty_fm); |
| 530 return empty_function; | 530 return empty_function; |
| 531 } | 531 } |
| 532 | 532 |
| 533 | 533 |
| 534 Handle<DescriptorArray> Genesis::ComputeStrictFunctionInstanceDescriptor( | 534 Handle<DescriptorArray> Genesis::ComputeStrictFunctionInstanceDescriptor( |
| 535 PrototypePropertyMode prototypeMode, | 535 PrototypePropertyMode prototypeMode) { |
| 536 Handle<AccessorPair> arguments, | |
| 537 Handle<AccessorPair> caller) { | |
| 538 Handle<DescriptorArray> descriptors = | 536 Handle<DescriptorArray> descriptors = |
| 539 factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE | 537 factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE |
| 540 ? 4 | 538 ? 4 |
| 541 : 5); | 539 : 5); |
| 542 PropertyAttributes attributes = static_cast<PropertyAttributes>( | 540 PropertyAttributes attributes = static_cast<PropertyAttributes>( |
| 543 DONT_ENUM | DONT_DELETE); | 541 DONT_ENUM | DONT_DELETE); |
| 544 | 542 |
| 545 DescriptorArray::WhitenessWitness witness(*descriptors); | 543 DescriptorArray::WhitenessWitness witness(*descriptors); |
| 546 | 544 |
| 547 { // length | 545 { // length |
| 548 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionLength); | 546 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionLength); |
| 549 CallbacksDescriptor d(*factory()->length_symbol(), *foreign, attributes); | 547 CallbacksDescriptor d(*factory()->length_symbol(), *foreign, attributes); |
| 550 descriptors->Set(0, &d, witness); | 548 descriptors->Set(0, &d, witness); |
| 551 } | 549 } |
| 552 { // name | 550 { // name |
| 553 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionName); | 551 Handle<Foreign> foreign = factory()->NewForeign(&Accessors::FunctionName); |
| 554 CallbacksDescriptor d(*factory()->name_symbol(), *foreign, attributes); | 552 CallbacksDescriptor d(*factory()->name_symbol(), *foreign, attributes); |
| 555 descriptors->Set(1, &d, witness); | 553 descriptors->Set(1, &d, witness); |
| 556 } | 554 } |
| 557 { // arguments | 555 { // arguments |
| 556 Handle<AccessorPair> arguments(factory()->NewAccessorPair()); | |
|
Michael Starzinger
2012/02/17 13:33:28
Could you rewrite this as using the assignment ope
Sven Panne
2012/02/20 08:26:03
As discussed offline, I'll do it the other way rou
Kevin Millikin (Chromium)
2012/02/20 09:30:19
The existing V8 style is to prefer '=' notation fo
| |
| 558 CallbacksDescriptor d(*factory()->arguments_symbol(), | 557 CallbacksDescriptor d(*factory()->arguments_symbol(), |
| 559 *arguments, | 558 *arguments, |
| 560 attributes); | 559 attributes); |
| 561 descriptors->Set(2, &d, witness); | 560 descriptors->Set(2, &d, witness); |
| 562 } | 561 } |
| 563 { // caller | 562 { // caller |
| 563 Handle<AccessorPair> caller(factory()->NewAccessorPair()); | |
|
Michael Starzinger
2012/02/17 13:33:28
Likewise.
Sven Panne
2012/02/20 08:26:03
See above.
| |
| 564 CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attributes); | 564 CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attributes); |
| 565 descriptors->Set(3, &d, witness); | 565 descriptors->Set(3, &d, witness); |
| 566 } | 566 } |
| 567 | 567 |
| 568 // prototype | 568 // prototype |
| 569 if (prototypeMode != DONT_ADD_PROTOTYPE) { | 569 if (prototypeMode != DONT_ADD_PROTOTYPE) { |
| 570 if (prototypeMode != ADD_WRITEABLE_PROTOTYPE) { | 570 if (prototypeMode != ADD_WRITEABLE_PROTOTYPE) { |
| 571 attributes = static_cast<PropertyAttributes>(attributes | READ_ONLY); | 571 attributes = static_cast<PropertyAttributes>(attributes | READ_ONLY); |
| 572 } | 572 } |
| 573 Handle<Foreign> foreign = | 573 Handle<Foreign> foreign = |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 596 throw_type_error_function->shared()->DontAdaptArguments(); | 596 throw_type_error_function->shared()->DontAdaptArguments(); |
| 597 | 597 |
| 598 JSObject::PreventExtensions(throw_type_error_function); | 598 JSObject::PreventExtensions(throw_type_error_function); |
| 599 } | 599 } |
| 600 return throw_type_error_function; | 600 return throw_type_error_function; |
| 601 } | 601 } |
| 602 | 602 |
| 603 | 603 |
| 604 Handle<Map> Genesis::CreateStrictModeFunctionMap( | 604 Handle<Map> Genesis::CreateStrictModeFunctionMap( |
| 605 PrototypePropertyMode prototype_mode, | 605 PrototypePropertyMode prototype_mode, |
| 606 Handle<JSFunction> empty_function, | 606 Handle<JSFunction> empty_function) { |
| 607 Handle<AccessorPair> arguments_callbacks, | |
| 608 Handle<AccessorPair> caller_callbacks) { | |
| 609 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | 607 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
| 610 Handle<DescriptorArray> descriptors = | 608 Handle<DescriptorArray> descriptors = |
| 611 ComputeStrictFunctionInstanceDescriptor(prototype_mode, | 609 ComputeStrictFunctionInstanceDescriptor(prototype_mode); |
| 612 arguments_callbacks, | |
| 613 caller_callbacks); | |
| 614 map->set_instance_descriptors(*descriptors); | 610 map->set_instance_descriptors(*descriptors); |
| 615 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); | 611 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); |
| 616 map->set_prototype(*empty_function); | 612 map->set_prototype(*empty_function); |
| 617 return map; | 613 return map; |
| 618 } | 614 } |
| 619 | 615 |
| 620 | 616 |
| 621 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { | 617 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { |
| 622 // Create the callbacks arrays for ThrowTypeError functions. | |
| 623 // The get/set callacks are filled in after the maps are created below. | |
| 624 Factory* factory = empty->GetIsolate()->factory(); | |
| 625 Handle<AccessorPair> arguments(factory->NewAccessorPair()); | |
| 626 Handle<AccessorPair> caller(factory->NewAccessorPair()); | |
| 627 | |
| 628 // Allocate map for the strict mode function instances. | 618 // Allocate map for the strict mode function instances. |
| 629 Handle<Map> strict_mode_function_instance_map = | 619 Handle<Map> strict_mode_function_instance_map = |
| 630 CreateStrictModeFunctionMap( | 620 CreateStrictModeFunctionMap(ADD_WRITEABLE_PROTOTYPE, empty); |
| 631 ADD_WRITEABLE_PROTOTYPE, empty, arguments, caller); | |
| 632 global_context()->set_strict_mode_function_instance_map( | 621 global_context()->set_strict_mode_function_instance_map( |
| 633 *strict_mode_function_instance_map); | 622 *strict_mode_function_instance_map); |
| 634 | 623 |
| 635 // Allocate map for the prototype-less strict mode instances. | 624 // Allocate map for the prototype-less strict mode instances. |
| 636 Handle<Map> strict_mode_function_without_prototype_map = | 625 Handle<Map> strict_mode_function_without_prototype_map = |
| 637 CreateStrictModeFunctionMap( | 626 CreateStrictModeFunctionMap(DONT_ADD_PROTOTYPE, empty); |
| 638 DONT_ADD_PROTOTYPE, empty, arguments, caller); | |
| 639 global_context()->set_strict_mode_function_without_prototype_map( | 627 global_context()->set_strict_mode_function_without_prototype_map( |
| 640 *strict_mode_function_without_prototype_map); | 628 *strict_mode_function_without_prototype_map); |
| 641 | 629 |
| 642 // Allocate map for the strict mode functions. This map is temporary, used | 630 // Allocate map for the strict mode functions. This map is temporary, used |
| 643 // only for processing of builtins. | 631 // only for processing of builtins. |
| 644 // Later the map is replaced with writable prototype map, allocated below. | 632 // Later the map is replaced with writable prototype map, allocated below. |
| 645 Handle<Map> strict_mode_function_map = | 633 Handle<Map> strict_mode_function_map = |
| 646 CreateStrictModeFunctionMap( | 634 CreateStrictModeFunctionMap(ADD_READONLY_PROTOTYPE, empty); |
| 647 ADD_READONLY_PROTOTYPE, empty, arguments, caller); | |
| 648 global_context()->set_strict_mode_function_map( | 635 global_context()->set_strict_mode_function_map( |
| 649 *strict_mode_function_map); | 636 *strict_mode_function_map); |
| 650 | 637 |
| 651 // The final map for the strict mode functions. Writeable prototype. | 638 // The final map for the strict mode functions. Writeable prototype. |
| 652 // This map is installed in MakeFunctionInstancePrototypeWritable. | 639 // This map is installed in MakeFunctionInstancePrototypeWritable. |
| 653 strict_mode_function_instance_map_writable_prototype_ = | 640 strict_mode_function_instance_map_writable_prototype_ = |
| 654 CreateStrictModeFunctionMap( | 641 CreateStrictModeFunctionMap(ADD_WRITEABLE_PROTOTYPE, empty); |
| 655 ADD_WRITEABLE_PROTOTYPE, empty, arguments, caller); | |
| 656 | 642 |
| 657 // Create the ThrowTypeError function instance. | 643 // Create the ThrowTypeError function instance. |
| 658 Handle<JSFunction> throw_function = | 644 Handle<JSFunction> throw_function = |
|
Michael Starzinger
2012/02/17 13:33:28
This is now unused, remove it.
Sven Panne
2012/02/20 08:26:03
Done.
| |
| 659 GetThrowTypeErrorFunction(); | 645 GetThrowTypeErrorFunction(); |
| 660 | 646 |
| 661 // Complete the callbacks. | 647 // Complete the callbacks. |
| 662 arguments->set_getter(*throw_function); | 648 InitArgumentsAndCaller(strict_mode_function_instance_map); |
| 663 arguments->set_setter(*throw_function); | 649 InitArgumentsAndCaller(strict_mode_function_without_prototype_map); |
| 664 caller->set_getter(*throw_function); | 650 InitArgumentsAndCaller(strict_mode_function_map); |
| 665 caller->set_setter(*throw_function); | 651 InitArgumentsAndCaller(strict_mode_function_instance_map_writable_prototype_); |
| 666 } | 652 } |
| 667 | 653 |
| 668 | 654 |
| 655 static void SetAccessors(Handle<Map> map, | |
| 656 Handle<String> name, | |
| 657 Handle<JSFunction> func) { | |
| 658 DescriptorArray* descs = map->instance_descriptors(); | |
| 659 int number = descs->Search(*name); | |
| 660 AccessorPair* accessors = AccessorPair::cast(descs->GetValue(number)); | |
| 661 accessors->set_getter(*func); | |
| 662 accessors->set_setter(*func); | |
| 663 } | |
| 664 | |
| 665 | |
| 666 void Genesis::InitArgumentsAndCaller(Handle<Map> map) { | |
| 667 SetAccessors(map, factory()->arguments_symbol(), GetThrowTypeErrorFunction()); | |
| 668 SetAccessors(map, factory()->caller_symbol(), GetThrowTypeErrorFunction()); | |
| 669 } | |
| 670 | |
| 671 | |
| 669 static void AddToWeakGlobalContextList(Context* context) { | 672 static void AddToWeakGlobalContextList(Context* context) { |
| 670 ASSERT(context->IsGlobalContext()); | 673 ASSERT(context->IsGlobalContext()); |
| 671 Heap* heap = context->GetIsolate()->heap(); | 674 Heap* heap = context->GetIsolate()->heap(); |
| 672 #ifdef DEBUG | 675 #ifdef DEBUG |
| 673 { // NOLINT | 676 { // NOLINT |
| 674 ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined()); | 677 ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined()); |
| 675 // Check that context is not in the list yet. | 678 // Check that context is not in the list yet. |
| 676 for (Object* current = heap->global_contexts_list(); | 679 for (Object* current = heap->global_contexts_list(); |
| 677 !current->IsUndefined(); | 680 !current->IsUndefined(); |
| 678 current = Context::cast(current)->get(Context::NEXT_CONTEXT_LINK)) { | 681 current = Context::cast(current)->get(Context::NEXT_CONTEXT_LINK)) { |
| (...skipping 1685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2364 return from + sizeof(NestingCounterType); | 2367 return from + sizeof(NestingCounterType); |
| 2365 } | 2368 } |
| 2366 | 2369 |
| 2367 | 2370 |
| 2368 // Called when the top-level V8 mutex is destroyed. | 2371 // Called when the top-level V8 mutex is destroyed. |
| 2369 void Bootstrapper::FreeThreadResources() { | 2372 void Bootstrapper::FreeThreadResources() { |
| 2370 ASSERT(!IsActive()); | 2373 ASSERT(!IsActive()); |
| 2371 } | 2374 } |
| 2372 | 2375 |
| 2373 } } // namespace v8::internal | 2376 } } // namespace v8::internal |
| OLD | NEW |