| 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/isolate-inl.h" | 8 #include "src/isolate-inl.h" |
| 9 #include "src/natives.h" | 9 #include "src/natives.h" |
| 10 #include "src/snapshot.h" | 10 #include "src/snapshot.h" |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 Handle<ObjectTemplateInfo> object_template); | 255 Handle<ObjectTemplateInfo> object_template); |
| 256 bool ConfigureGlobalObjects(v8::Handle<v8::ObjectTemplate> global_template); | 256 bool ConfigureGlobalObjects(v8::Handle<v8::ObjectTemplate> global_template); |
| 257 | 257 |
| 258 // Migrates all properties from the 'from' object to the 'to' | 258 // Migrates all properties from the 'from' object to the 'to' |
| 259 // object and overrides the prototype in 'to' with the one from | 259 // object and overrides the prototype in 'to' with the one from |
| 260 // 'from'. | 260 // 'from'. |
| 261 void TransferObject(Handle<JSObject> from, Handle<JSObject> to); | 261 void TransferObject(Handle<JSObject> from, Handle<JSObject> to); |
| 262 void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to); | 262 void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to); |
| 263 void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to); | 263 void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to); |
| 264 | 264 |
| 265 enum PrototypePropertyMode { | 265 enum FunctionMode { |
| 266 DONT_ADD_PROTOTYPE, | 266 // With prototype. |
| 267 ADD_READONLY_PROTOTYPE, | 267 FUNCTION_WITH_WRITEABLE_PROTOTYPE, |
| 268 ADD_WRITEABLE_PROTOTYPE | 268 FUNCTION_WITH_READONLY_PROTOTYPE, |
| 269 // Without prototype. |
| 270 FUNCTION_WITHOUT_PROTOTYPE, |
| 271 BOUND_FUNCTION |
| 269 }; | 272 }; |
| 270 | 273 |
| 271 Handle<Map> CreateFunctionMap(PrototypePropertyMode prototype_mode); | 274 static bool IsFunctionModeWithPrototype(FunctionMode function_mode) { |
| 275 return (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || |
| 276 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE); |
| 277 } |
| 278 |
| 279 Handle<Map> CreateFunctionMap(FunctionMode function_mode); |
| 272 | 280 |
| 273 void SetFunctionInstanceDescriptor(Handle<Map> map, | 281 void SetFunctionInstanceDescriptor(Handle<Map> map, |
| 274 PrototypePropertyMode prototypeMode); | 282 FunctionMode function_mode); |
| 275 void MakeFunctionInstancePrototypeWritable(); | 283 void MakeFunctionInstancePrototypeWritable(); |
| 276 | 284 |
| 277 Handle<Map> CreateStrictFunctionMap( | 285 Handle<Map> CreateStrictFunctionMap( |
| 278 PrototypePropertyMode prototype_mode, | 286 FunctionMode function_mode, |
| 279 Handle<JSFunction> empty_function); | 287 Handle<JSFunction> empty_function); |
| 280 | 288 |
| 281 void SetStrictFunctionInstanceDescriptor(Handle<Map> map, | 289 void SetStrictFunctionInstanceDescriptor(Handle<Map> map, |
| 282 PrototypePropertyMode propertyMode); | 290 FunctionMode function_mode); |
| 283 | 291 |
| 284 static bool CompileBuiltin(Isolate* isolate, int index); | 292 static bool CompileBuiltin(Isolate* isolate, int index); |
| 285 static bool CompileExperimentalBuiltin(Isolate* isolate, int index); | 293 static bool CompileExperimentalBuiltin(Isolate* isolate, int index); |
| 286 static bool CompileNative(Isolate* isolate, | 294 static bool CompileNative(Isolate* isolate, |
| 287 Vector<const char> name, | 295 Vector<const char> name, |
| 288 Handle<String> source); | 296 Handle<String> source); |
| 289 static bool CompileScriptCached(Isolate* isolate, | 297 static bool CompileScriptCached(Isolate* isolate, |
| 290 Vector<const char> name, | 298 Vector<const char> name, |
| 291 Handle<String> source, | 299 Handle<String> source, |
| 292 SourceCodeCache* cache, | 300 SourceCodeCache* cache, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 target, internalized_name, function, attributes).Check(); | 383 target, internalized_name, function, attributes).Check(); |
| 376 if (target->IsJSGlobalObject()) { | 384 if (target->IsJSGlobalObject()) { |
| 377 function->shared()->set_instance_class_name(*internalized_name); | 385 function->shared()->set_instance_class_name(*internalized_name); |
| 378 } | 386 } |
| 379 function->shared()->set_native(true); | 387 function->shared()->set_native(true); |
| 380 return function; | 388 return function; |
| 381 } | 389 } |
| 382 | 390 |
| 383 | 391 |
| 384 void Genesis::SetFunctionInstanceDescriptor( | 392 void Genesis::SetFunctionInstanceDescriptor( |
| 385 Handle<Map> map, PrototypePropertyMode prototypeMode) { | 393 Handle<Map> map, FunctionMode function_mode) { |
| 386 int size = (prototypeMode == DONT_ADD_PROTOTYPE) ? 4 : 5; | 394 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; |
| 387 Map::EnsureDescriptorSlack(map, size); | 395 Map::EnsureDescriptorSlack(map, size); |
| 388 | 396 |
| 389 PropertyAttributes attribs = static_cast<PropertyAttributes>( | 397 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
| 390 DONT_ENUM | DONT_DELETE | READ_ONLY); | 398 DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 391 | 399 |
| 392 Handle<AccessorInfo> length = | 400 Handle<AccessorInfo> length = |
| 393 Accessors::FunctionLengthInfo(isolate(), attribs); | 401 Accessors::FunctionLengthInfo(isolate(), attribs); |
| 394 { // Add length. | 402 { // Add length. |
| 395 CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())), | 403 CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())), |
| 396 length, attribs); | 404 length, attribs); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 410 args, attribs); | 418 args, attribs); |
| 411 map->AppendDescriptor(&d); | 419 map->AppendDescriptor(&d); |
| 412 } | 420 } |
| 413 Handle<AccessorInfo> caller = | 421 Handle<AccessorInfo> caller = |
| 414 Accessors::FunctionCallerInfo(isolate(), attribs); | 422 Accessors::FunctionCallerInfo(isolate(), attribs); |
| 415 { // Add caller. | 423 { // Add caller. |
| 416 CallbacksDescriptor d(Handle<Name>(Name::cast(caller->name())), | 424 CallbacksDescriptor d(Handle<Name>(Name::cast(caller->name())), |
| 417 caller, attribs); | 425 caller, attribs); |
| 418 map->AppendDescriptor(&d); | 426 map->AppendDescriptor(&d); |
| 419 } | 427 } |
| 420 if (prototypeMode != DONT_ADD_PROTOTYPE) { | 428 if (IsFunctionModeWithPrototype(function_mode)) { |
| 421 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { | 429 if (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE) { |
| 422 attribs = static_cast<PropertyAttributes>(attribs & ~READ_ONLY); | 430 attribs = static_cast<PropertyAttributes>(attribs & ~READ_ONLY); |
| 423 } | 431 } |
| 424 Handle<AccessorInfo> prototype = | 432 Handle<AccessorInfo> prototype = |
| 425 Accessors::FunctionPrototypeInfo(isolate(), attribs); | 433 Accessors::FunctionPrototypeInfo(isolate(), attribs); |
| 426 CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())), | 434 CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())), |
| 427 prototype, attribs); | 435 prototype, attribs); |
| 428 map->AppendDescriptor(&d); | 436 map->AppendDescriptor(&d); |
| 429 } | 437 } |
| 430 } | 438 } |
| 431 | 439 |
| 432 | 440 |
| 433 Handle<Map> Genesis::CreateFunctionMap(PrototypePropertyMode prototype_mode) { | 441 Handle<Map> Genesis::CreateFunctionMap(FunctionMode function_mode) { |
| 434 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | 442 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
| 435 SetFunctionInstanceDescriptor(map, prototype_mode); | 443 SetFunctionInstanceDescriptor(map, function_mode); |
| 436 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); | 444 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); |
| 437 return map; | 445 return map; |
| 438 } | 446 } |
| 439 | 447 |
| 440 | 448 |
| 441 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { | 449 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { |
| 442 // Allocate the map for function instances. Maps are allocated first and their | 450 // Allocate the map for function instances. Maps are allocated first and their |
| 443 // prototypes patched later, once empty function is created. | 451 // prototypes patched later, once empty function is created. |
| 444 | 452 |
| 445 // Functions with this map will not have a 'prototype' property, and | 453 // Functions with this map will not have a 'prototype' property, and |
| 446 // can not be used as constructors. | 454 // can not be used as constructors. |
| 447 Handle<Map> function_without_prototype_map = | 455 Handle<Map> function_without_prototype_map = |
| 448 CreateFunctionMap(DONT_ADD_PROTOTYPE); | 456 CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); |
| 449 native_context()->set_sloppy_function_without_prototype_map( | 457 native_context()->set_sloppy_function_without_prototype_map( |
| 450 *function_without_prototype_map); | 458 *function_without_prototype_map); |
| 451 | 459 |
| 452 // Allocate the function map. This map is temporary, used only for processing | 460 // Allocate the function map. This map is temporary, used only for processing |
| 453 // of builtins. | 461 // of builtins. |
| 454 // Later the map is replaced with writable prototype map, allocated below. | 462 // Later the map is replaced with writable prototype map, allocated below. |
| 455 Handle<Map> function_map = CreateFunctionMap(ADD_READONLY_PROTOTYPE); | 463 Handle<Map> function_map = |
| 464 CreateFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE); |
| 456 native_context()->set_sloppy_function_map(*function_map); | 465 native_context()->set_sloppy_function_map(*function_map); |
| 457 native_context()->set_sloppy_function_with_readonly_prototype_map( | 466 native_context()->set_sloppy_function_with_readonly_prototype_map( |
| 458 *function_map); | 467 *function_map); |
| 459 | 468 |
| 460 // The final map for functions. Writeable prototype. | 469 // The final map for functions. Writeable prototype. |
| 461 // This map is installed in MakeFunctionInstancePrototypeWritable. | 470 // This map is installed in MakeFunctionInstancePrototypeWritable. |
| 462 sloppy_function_map_writable_prototype_ = | 471 sloppy_function_map_writable_prototype_ = |
| 463 CreateFunctionMap(ADD_WRITEABLE_PROTOTYPE); | 472 CreateFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE); |
| 464 | 473 |
| 465 Factory* factory = isolate->factory(); | 474 Factory* factory = isolate->factory(); |
| 466 | 475 |
| 467 Handle<String> object_name = factory->Object_string(); | 476 Handle<String> object_name = factory->Object_string(); |
| 468 | 477 |
| 469 { // --- O b j e c t --- | 478 { // --- O b j e c t --- |
| 470 Handle<JSFunction> object_fun = factory->NewFunction(object_name); | 479 Handle<JSFunction> object_fun = factory->NewFunction(object_name); |
| 471 Handle<Map> object_function_map = | 480 Handle<Map> object_function_map = |
| 472 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 481 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 473 object_fun->set_initial_map(*object_function_map); | 482 object_fun->set_initial_map(*object_function_map); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 empty_function->shared()->set_end_position(source->length()); | 516 empty_function->shared()->set_end_position(source->length()); |
| 508 empty_function->shared()->DontAdaptArguments(); | 517 empty_function->shared()->DontAdaptArguments(); |
| 509 | 518 |
| 510 // Set prototypes for the function maps. | 519 // Set prototypes for the function maps. |
| 511 native_context()->sloppy_function_map()->set_prototype(*empty_function); | 520 native_context()->sloppy_function_map()->set_prototype(*empty_function); |
| 512 native_context()->sloppy_function_without_prototype_map()-> | 521 native_context()->sloppy_function_without_prototype_map()-> |
| 513 set_prototype(*empty_function); | 522 set_prototype(*empty_function); |
| 514 sloppy_function_map_writable_prototype_->set_prototype(*empty_function); | 523 sloppy_function_map_writable_prototype_->set_prototype(*empty_function); |
| 515 | 524 |
| 516 // Allocate the function map first and then patch the prototype later | 525 // Allocate the function map first and then patch the prototype later |
| 517 Handle<Map> empty_function_map = CreateFunctionMap(DONT_ADD_PROTOTYPE); | 526 Handle<Map> empty_function_map = |
| 527 CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); |
| 518 empty_function_map->set_prototype( | 528 empty_function_map->set_prototype( |
| 519 native_context()->object_function()->prototype()); | 529 native_context()->object_function()->prototype()); |
| 520 empty_function->set_map(*empty_function_map); | 530 empty_function->set_map(*empty_function_map); |
| 521 return empty_function; | 531 return empty_function; |
| 522 } | 532 } |
| 523 | 533 |
| 524 | 534 |
| 525 void Genesis::SetStrictFunctionInstanceDescriptor( | 535 void Genesis::SetStrictFunctionInstanceDescriptor( |
| 526 Handle<Map> map, PrototypePropertyMode prototypeMode) { | 536 Handle<Map> map, FunctionMode function_mode) { |
| 527 int size = (prototypeMode == DONT_ADD_PROTOTYPE) ? 4 : 5; | 537 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; |
| 528 Map::EnsureDescriptorSlack(map, size); | 538 Map::EnsureDescriptorSlack(map, size); |
| 529 | 539 |
| 530 Handle<AccessorPair> arguments(factory()->NewAccessorPair()); | 540 Handle<AccessorPair> arguments(factory()->NewAccessorPair()); |
| 531 Handle<AccessorPair> caller(factory()->NewAccessorPair()); | 541 Handle<AccessorPair> caller(factory()->NewAccessorPair()); |
| 532 PropertyAttributes rw_attribs = | 542 PropertyAttributes rw_attribs = |
| 533 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 543 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); |
| 534 PropertyAttributes ro_attribs = | 544 PropertyAttributes ro_attribs = |
| 535 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 545 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 536 | 546 |
| 537 Handle<AccessorInfo> length = | 547 // Add length. |
| 538 Accessors::FunctionLengthInfo(isolate(), ro_attribs); | 548 if (function_mode == BOUND_FUNCTION) { |
| 539 { // Add length. | 549 Handle<String> length_string = isolate()->factory()->length_string(); |
| 550 FieldDescriptor d(length_string, 0, ro_attribs, Representation::Tagged()); |
| 551 map->AppendDescriptor(&d); |
| 552 } else { |
| 553 ASSERT(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || |
| 554 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE || |
| 555 function_mode == FUNCTION_WITHOUT_PROTOTYPE); |
| 556 Handle<AccessorInfo> length = |
| 557 Accessors::FunctionLengthInfo(isolate(), ro_attribs); |
| 540 CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())), | 558 CallbacksDescriptor d(Handle<Name>(Name::cast(length->name())), |
| 541 length, ro_attribs); | 559 length, ro_attribs); |
| 542 map->AppendDescriptor(&d); | 560 map->AppendDescriptor(&d); |
| 543 } | 561 } |
| 544 Handle<AccessorInfo> name = | 562 Handle<AccessorInfo> name = |
| 545 Accessors::FunctionNameInfo(isolate(), ro_attribs); | 563 Accessors::FunctionNameInfo(isolate(), ro_attribs); |
| 546 { // Add name. | 564 { // Add name. |
| 547 CallbacksDescriptor d(Handle<Name>(Name::cast(name->name())), | 565 CallbacksDescriptor d(Handle<Name>(Name::cast(name->name())), |
| 548 name, ro_attribs); | 566 name, ro_attribs); |
| 549 map->AppendDescriptor(&d); | 567 map->AppendDescriptor(&d); |
| 550 } | 568 } |
| 551 { // Add arguments. | 569 { // Add arguments. |
| 552 CallbacksDescriptor d(factory()->arguments_string(), arguments, | 570 CallbacksDescriptor d(factory()->arguments_string(), arguments, |
| 553 rw_attribs); | 571 rw_attribs); |
| 554 map->AppendDescriptor(&d); | 572 map->AppendDescriptor(&d); |
| 555 } | 573 } |
| 556 { // Add caller. | 574 { // Add caller. |
| 557 CallbacksDescriptor d(factory()->caller_string(), caller, rw_attribs); | 575 CallbacksDescriptor d(factory()->caller_string(), caller, rw_attribs); |
| 558 map->AppendDescriptor(&d); | 576 map->AppendDescriptor(&d); |
| 559 } | 577 } |
| 560 if (prototypeMode != DONT_ADD_PROTOTYPE) { | 578 if (IsFunctionModeWithPrototype(function_mode)) { |
| 561 // Add prototype. | 579 // Add prototype. |
| 562 PropertyAttributes attribs = | 580 PropertyAttributes attribs = |
| 563 prototypeMode == ADD_WRITEABLE_PROTOTYPE ? rw_attribs : ro_attribs; | 581 function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs |
| 582 : ro_attribs; |
| 564 Handle<AccessorInfo> prototype = | 583 Handle<AccessorInfo> prototype = |
| 565 Accessors::FunctionPrototypeInfo(isolate(), attribs); | 584 Accessors::FunctionPrototypeInfo(isolate(), attribs); |
| 566 CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())), | 585 CallbacksDescriptor d(Handle<Name>(Name::cast(prototype->name())), |
| 567 prototype, attribs); | 586 prototype, attribs); |
| 568 map->AppendDescriptor(&d); | 587 map->AppendDescriptor(&d); |
| 569 } | 588 } |
| 570 } | 589 } |
| 571 | 590 |
| 572 | 591 |
| 573 // ECMAScript 5th Edition, 13.2.3 | 592 // ECMAScript 5th Edition, 13.2.3 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 598 generator_poison_function->set_map(native_context()->sloppy_function_map()); | 617 generator_poison_function->set_map(native_context()->sloppy_function_map()); |
| 599 generator_poison_function->shared()->DontAdaptArguments(); | 618 generator_poison_function->shared()->DontAdaptArguments(); |
| 600 | 619 |
| 601 JSObject::PreventExtensions(generator_poison_function).Assert(); | 620 JSObject::PreventExtensions(generator_poison_function).Assert(); |
| 602 } | 621 } |
| 603 return generator_poison_function; | 622 return generator_poison_function; |
| 604 } | 623 } |
| 605 | 624 |
| 606 | 625 |
| 607 Handle<Map> Genesis::CreateStrictFunctionMap( | 626 Handle<Map> Genesis::CreateStrictFunctionMap( |
| 608 PrototypePropertyMode prototype_mode, | 627 FunctionMode function_mode, |
| 609 Handle<JSFunction> empty_function) { | 628 Handle<JSFunction> empty_function) { |
| 610 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | 629 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
| 611 SetStrictFunctionInstanceDescriptor(map, prototype_mode); | 630 SetStrictFunctionInstanceDescriptor(map, function_mode); |
| 612 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); | 631 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); |
| 613 map->set_prototype(*empty_function); | 632 map->set_prototype(*empty_function); |
| 614 return map; | 633 return map; |
| 615 } | 634 } |
| 616 | 635 |
| 617 | 636 |
| 618 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { | 637 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { |
| 619 // Allocate map for the prototype-less strict mode instances. | 638 // Allocate map for the prototype-less strict mode instances. |
| 620 Handle<Map> strict_function_without_prototype_map = | 639 Handle<Map> strict_function_without_prototype_map = |
| 621 CreateStrictFunctionMap(DONT_ADD_PROTOTYPE, empty); | 640 CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty); |
| 622 native_context()->set_strict_function_without_prototype_map( | 641 native_context()->set_strict_function_without_prototype_map( |
| 623 *strict_function_without_prototype_map); | 642 *strict_function_without_prototype_map); |
| 624 | 643 |
| 625 // Allocate map for the strict mode functions. This map is temporary, used | 644 // Allocate map for the strict mode functions. This map is temporary, used |
| 626 // only for processing of builtins. | 645 // only for processing of builtins. |
| 627 // Later the map is replaced with writable prototype map, allocated below. | 646 // Later the map is replaced with writable prototype map, allocated below. |
| 628 Handle<Map> strict_function_map = | 647 Handle<Map> strict_function_map = |
| 629 CreateStrictFunctionMap(ADD_READONLY_PROTOTYPE, empty); | 648 CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty); |
| 630 native_context()->set_strict_function_map(*strict_function_map); | 649 native_context()->set_strict_function_map(*strict_function_map); |
| 631 | 650 |
| 632 // The final map for the strict mode functions. Writeable prototype. | 651 // The final map for the strict mode functions. Writeable prototype. |
| 633 // This map is installed in MakeFunctionInstancePrototypeWritable. | 652 // This map is installed in MakeFunctionInstancePrototypeWritable. |
| 634 strict_function_map_writable_prototype_ = | 653 strict_function_map_writable_prototype_ = |
| 635 CreateStrictFunctionMap(ADD_WRITEABLE_PROTOTYPE, empty); | 654 CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty); |
| 655 // Special map for bound functions. |
| 656 Handle<Map> bound_function_map = |
| 657 CreateStrictFunctionMap(BOUND_FUNCTION, empty); |
| 658 native_context()->set_bound_function_map(*bound_function_map); |
| 636 | 659 |
| 637 // Complete the callbacks. | 660 // Complete the callbacks. |
| 638 PoisonArgumentsAndCaller(strict_function_without_prototype_map); | 661 PoisonArgumentsAndCaller(strict_function_without_prototype_map); |
| 639 PoisonArgumentsAndCaller(strict_function_map); | 662 PoisonArgumentsAndCaller(strict_function_map); |
| 640 PoisonArgumentsAndCaller(strict_function_map_writable_prototype_); | 663 PoisonArgumentsAndCaller(strict_function_map_writable_prototype_); |
| 664 PoisonArgumentsAndCaller(bound_function_map); |
| 641 } | 665 } |
| 642 | 666 |
| 643 | 667 |
| 644 static void SetAccessors(Handle<Map> map, | 668 static void SetAccessors(Handle<Map> map, |
| 645 Handle<String> name, | 669 Handle<String> name, |
| 646 Handle<JSFunction> func) { | 670 Handle<JSFunction> func) { |
| 647 DescriptorArray* descs = map->instance_descriptors(); | 671 DescriptorArray* descs = map->instance_descriptors(); |
| 648 int number = descs->SearchWithCache(*name, *map); | 672 int number = descs->SearchWithCache(*name, *map); |
| 649 AccessorPair* accessors = AccessorPair::cast(descs->GetValue(number)); | 673 AccessorPair* accessors = AccessorPair::cast(descs->GetValue(number)); |
| 650 accessors->set_getter(*func); | 674 accessors->set_getter(*func); |
| (...skipping 2067 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2718 return from + sizeof(NestingCounterType); | 2742 return from + sizeof(NestingCounterType); |
| 2719 } | 2743 } |
| 2720 | 2744 |
| 2721 | 2745 |
| 2722 // Called when the top-level V8 mutex is destroyed. | 2746 // Called when the top-level V8 mutex is destroyed. |
| 2723 void Bootstrapper::FreeThreadResources() { | 2747 void Bootstrapper::FreeThreadResources() { |
| 2724 ASSERT(!IsActive()); | 2748 ASSERT(!IsActive()); |
| 2725 } | 2749 } |
| 2726 | 2750 |
| 2727 } } // namespace v8::internal | 2751 } } // namespace v8::internal |
| OLD | NEW |