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 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 void Genesis::SetFunctionInstanceDescriptor(Handle<Map> map, | 461 void Genesis::SetFunctionInstanceDescriptor(Handle<Map> map, |
462 FunctionMode function_mode) { | 462 FunctionMode function_mode) { |
463 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; | 463 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; |
464 Map::EnsureDescriptorSlack(map, size); | 464 Map::EnsureDescriptorSlack(map, size); |
465 | 465 |
466 PropertyAttributes ro_attribs = | 466 PropertyAttributes ro_attribs = |
467 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 467 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
468 PropertyAttributes roc_attribs = | 468 PropertyAttributes roc_attribs = |
469 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); | 469 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); |
470 | 470 |
| 471 STATIC_ASSERT(JSFunction::kLengthDescriptorIndex == 0); |
471 Handle<AccessorInfo> length = | 472 Handle<AccessorInfo> length = |
472 Accessors::FunctionLengthInfo(isolate(), roc_attribs); | 473 Accessors::FunctionLengthInfo(isolate(), roc_attribs); |
473 { // Add length. | 474 { // Add length. |
474 AccessorConstantDescriptor d(Handle<Name>(Name::cast(length->name())), | 475 AccessorConstantDescriptor d(Handle<Name>(Name::cast(length->name())), |
475 length, roc_attribs); | 476 length, roc_attribs); |
476 map->AppendDescriptor(&d); | 477 map->AppendDescriptor(&d); |
477 } | 478 } |
| 479 |
| 480 STATIC_ASSERT(JSFunction::kNameDescriptorIndex == 1); |
478 Handle<AccessorInfo> name = | 481 Handle<AccessorInfo> name = |
479 Accessors::FunctionNameInfo(isolate(), ro_attribs); | 482 Accessors::FunctionNameInfo(isolate(), ro_attribs); |
480 { // Add name. | 483 { // Add name. |
481 AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name, | 484 AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name, |
482 roc_attribs); | 485 roc_attribs); |
483 map->AppendDescriptor(&d); | 486 map->AppendDescriptor(&d); |
484 } | 487 } |
485 Handle<AccessorInfo> args = | 488 Handle<AccessorInfo> args = |
486 Accessors::FunctionArgumentsInfo(isolate(), ro_attribs); | 489 Accessors::FunctionArgumentsInfo(isolate(), ro_attribs); |
487 { // Add arguments. | 490 { // Add arguments. |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 PropertyAttributes rw_attribs = | 625 PropertyAttributes rw_attribs = |
623 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 626 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); |
624 PropertyAttributes ro_attribs = | 627 PropertyAttributes ro_attribs = |
625 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 628 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
626 PropertyAttributes roc_attribs = | 629 PropertyAttributes roc_attribs = |
627 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); | 630 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); |
628 | 631 |
629 DCHECK(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || | 632 DCHECK(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || |
630 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE || | 633 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE || |
631 function_mode == FUNCTION_WITHOUT_PROTOTYPE); | 634 function_mode == FUNCTION_WITHOUT_PROTOTYPE); |
| 635 STATIC_ASSERT(JSFunction::kLengthDescriptorIndex == 0); |
632 { // Add length. | 636 { // Add length. |
633 Handle<AccessorInfo> length = | 637 Handle<AccessorInfo> length = |
634 Accessors::FunctionLengthInfo(isolate(), roc_attribs); | 638 Accessors::FunctionLengthInfo(isolate(), roc_attribs); |
635 AccessorConstantDescriptor d(Handle<Name>(Name::cast(length->name())), | 639 AccessorConstantDescriptor d(handle(Name::cast(length->name())), length, |
636 length, roc_attribs); | 640 roc_attribs); |
637 map->AppendDescriptor(&d); | 641 map->AppendDescriptor(&d); |
638 } | 642 } |
| 643 |
| 644 STATIC_ASSERT(JSFunction::kNameDescriptorIndex == 1); |
639 { // Add name. | 645 { // Add name. |
640 Handle<AccessorInfo> name = | 646 Handle<AccessorInfo> name = |
641 Accessors::FunctionNameInfo(isolate(), roc_attribs); | 647 Accessors::FunctionNameInfo(isolate(), roc_attribs); |
642 AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name, | 648 AccessorConstantDescriptor d(handle(Name::cast(name->name())), name, |
643 roc_attribs); | 649 roc_attribs); |
644 map->AppendDescriptor(&d); | 650 map->AppendDescriptor(&d); |
645 } | 651 } |
646 if (IsFunctionModeWithPrototype(function_mode)) { | 652 if (IsFunctionModeWithPrototype(function_mode)) { |
647 // Add prototype. | 653 // Add prototype. |
648 PropertyAttributes attribs = | 654 PropertyAttributes attribs = |
649 function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs | 655 function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs |
650 : ro_attribs; | 656 : ro_attribs; |
651 Handle<AccessorInfo> prototype = | 657 Handle<AccessorInfo> prototype = |
652 Accessors::FunctionPrototypeInfo(isolate(), attribs); | 658 Accessors::FunctionPrototypeInfo(isolate(), attribs); |
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 function_fun->shared()->DontAdaptArguments(); | 1182 function_fun->shared()->DontAdaptArguments(); |
1177 function_fun->shared()->set_construct_stub( | 1183 function_fun->shared()->set_construct_stub( |
1178 *isolate->builtins()->FunctionConstructor()); | 1184 *isolate->builtins()->FunctionConstructor()); |
1179 function_fun->shared()->set_length(1); | 1185 function_fun->shared()->set_length(1); |
1180 InstallWithIntrinsicDefaultProto(isolate, function_fun, | 1186 InstallWithIntrinsicDefaultProto(isolate, function_fun, |
1181 Context::FUNCTION_FUNCTION_INDEX); | 1187 Context::FUNCTION_FUNCTION_INDEX); |
1182 | 1188 |
1183 // Setup the methods on the %FunctionPrototype%. | 1189 // Setup the methods on the %FunctionPrototype%. |
1184 SimpleInstallFunction(prototype, factory->apply_string(), | 1190 SimpleInstallFunction(prototype, factory->apply_string(), |
1185 Builtins::kFunctionPrototypeApply, 2, false); | 1191 Builtins::kFunctionPrototypeApply, 2, false); |
1186 SimpleInstallFunction(prototype, factory->bind_string(), | 1192 |
1187 Builtins::kFunctionPrototypeBind, 1, false); | 1193 FastFunctionBindStub bind_stub(isolate); |
| 1194 Handle<JSFunction> bind_function = factory->NewFunctionWithoutPrototype( |
| 1195 factory->bind_string(), bind_stub.GetCode(), false); |
| 1196 bind_function->shared()->DontAdaptArguments(); |
| 1197 bind_function->shared()->set_length(1); |
| 1198 InstallFunction(prototype, bind_function, factory->bind_string(), |
| 1199 DONT_ENUM); |
| 1200 |
1188 SimpleInstallFunction(prototype, factory->call_string(), | 1201 SimpleInstallFunction(prototype, factory->call_string(), |
1189 Builtins::kFunctionPrototypeCall, 1, false); | 1202 Builtins::kFunctionPrototypeCall, 1, false); |
1190 SimpleInstallFunction(prototype, factory->toString_string(), | 1203 SimpleInstallFunction(prototype, factory->toString_string(), |
1191 Builtins::kFunctionPrototypeToString, 0, false); | 1204 Builtins::kFunctionPrototypeToString, 0, false); |
1192 | 1205 |
1193 // Install the @@hasInstance function. | 1206 // Install the @@hasInstance function. |
1194 Handle<JSFunction> has_instance = InstallFunction( | 1207 Handle<JSFunction> has_instance = InstallFunction( |
1195 prototype, factory->has_instance_symbol(), JS_OBJECT_TYPE, | 1208 prototype, factory->has_instance_symbol(), JS_OBJECT_TYPE, |
1196 JSObject::kHeaderSize, MaybeHandle<JSObject>(), | 1209 JSObject::kHeaderSize, MaybeHandle<JSObject>(), |
1197 Builtins::kFunctionPrototypeHasInstance, | 1210 Builtins::kFunctionPrototypeHasInstance, |
(...skipping 2619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3817 } | 3830 } |
3818 | 3831 |
3819 | 3832 |
3820 // Called when the top-level V8 mutex is destroyed. | 3833 // Called when the top-level V8 mutex is destroyed. |
3821 void Bootstrapper::FreeThreadResources() { | 3834 void Bootstrapper::FreeThreadResources() { |
3822 DCHECK(!IsActive()); | 3835 DCHECK(!IsActive()); |
3823 } | 3836 } |
3824 | 3837 |
3825 } // namespace internal | 3838 } // namespace internal |
3826 } // namespace v8 | 3839 } // namespace v8 |
OLD | NEW |