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 24 matching lines...) Expand all Loading... |
35 #include "frames-inl.h" | 35 #include "frames-inl.h" |
36 #include "isolate.h" | 36 #include "isolate.h" |
37 #include "list-inl.h" | 37 #include "list-inl.h" |
38 #include "property-details.h" | 38 #include "property-details.h" |
39 | 39 |
40 namespace v8 { | 40 namespace v8 { |
41 namespace internal { | 41 namespace internal { |
42 | 42 |
43 | 43 |
44 template <class C> | 44 template <class C> |
45 static C* FindInstanceOf(Object* obj) { | 45 static C* FindInstanceOf(Isolate* isolate, Object* obj) { |
46 for (Object* cur = obj; !cur->IsNull(); cur = cur->GetPrototype()) { | 46 for (Object* cur = obj; !cur->IsNull(); cur = cur->GetPrototype(isolate)) { |
47 if (Is<C>(cur)) return C::cast(cur); | 47 if (Is<C>(cur)) return C::cast(cur); |
48 } | 48 } |
49 return NULL; | 49 return NULL; |
50 } | 50 } |
51 | 51 |
52 | 52 |
53 // Entry point that never should be called. | 53 // Entry point that never should be called. |
54 MaybeObject* Accessors::IllegalSetter(JSObject*, Object*, void*) { | 54 MaybeObject* Accessors::IllegalSetter(JSObject*, Object*, void*) { |
55 UNREACHABLE(); | 55 UNREACHABLE(); |
56 return NULL; | 56 return NULL; |
(...skipping 13 matching lines...) Expand all Loading... |
70 } | 70 } |
71 | 71 |
72 | 72 |
73 // | 73 // |
74 // Accessors::ArrayLength | 74 // Accessors::ArrayLength |
75 // | 75 // |
76 | 76 |
77 | 77 |
78 MaybeObject* Accessors::ArrayGetLength(Object* object, void*) { | 78 MaybeObject* Accessors::ArrayGetLength(Object* object, void*) { |
79 // Traverse the prototype chain until we reach an array. | 79 // Traverse the prototype chain until we reach an array. |
80 JSArray* holder = FindInstanceOf<JSArray>(object); | 80 JSArray* holder = FindInstanceOf<JSArray>(Isolate::Current(), object); |
81 return holder == NULL ? Smi::FromInt(0) : holder->length(); | 81 return holder == NULL ? Smi::FromInt(0) : holder->length(); |
82 } | 82 } |
83 | 83 |
84 | 84 |
85 // The helper function will 'flatten' Number objects. | 85 // The helper function will 'flatten' Number objects. |
86 Object* Accessors::FlattenNumber(Object* value) { | 86 Object* Accessors::FlattenNumber(Object* value) { |
87 if (value->IsNumber() || !value->IsJSValue()) return value; | 87 if (value->IsNumber() || !value->IsJSValue()) return value; |
88 JSValue* wrapper = JSValue::cast(value); | 88 JSValue* wrapper = JSValue::cast(value); |
89 ASSERT(Isolate::Current()->context()->native_context()->number_function()-> | 89 ASSERT(Isolate::Current()->context()->native_context()->number_function()-> |
90 has_initial_map()); | 90 has_initial_map()); |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 0 | 435 0 |
436 }; | 436 }; |
437 | 437 |
438 | 438 |
439 // | 439 // |
440 // Accessors::FunctionPrototype | 440 // Accessors::FunctionPrototype |
441 // | 441 // |
442 | 442 |
443 | 443 |
444 MaybeObject* Accessors::FunctionGetPrototype(Object* object, void*) { | 444 MaybeObject* Accessors::FunctionGetPrototype(Object* object, void*) { |
445 Heap* heap = Isolate::Current()->heap(); | 445 Isolate* isolate = Isolate::Current(); |
446 JSFunction* function = FindInstanceOf<JSFunction>(object); | 446 JSFunction* function = FindInstanceOf<JSFunction>(isolate, object); |
447 if (function == NULL) return heap->undefined_value(); | 447 if (function == NULL) return isolate->heap()->undefined_value(); |
448 while (!function->should_have_prototype()) { | 448 while (!function->should_have_prototype()) { |
449 function = FindInstanceOf<JSFunction>(function->GetPrototype()); | 449 function = FindInstanceOf<JSFunction>(isolate, function->GetPrototype()); |
450 // There has to be one because we hit the getter. | 450 // There has to be one because we hit the getter. |
451 ASSERT(function != NULL); | 451 ASSERT(function != NULL); |
452 } | 452 } |
453 | 453 |
454 if (!function->has_prototype()) { | 454 if (!function->has_prototype()) { |
455 Object* prototype; | 455 Object* prototype; |
456 { MaybeObject* maybe_prototype = heap->AllocateFunctionPrototype(function); | 456 { MaybeObject* maybe_prototype |
| 457 = isolate->heap()->AllocateFunctionPrototype(function); |
457 if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype; | 458 if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype; |
458 } | 459 } |
459 Object* result; | 460 Object* result; |
460 { MaybeObject* maybe_result = function->SetPrototype(prototype); | 461 { MaybeObject* maybe_result = function->SetPrototype(prototype); |
461 if (!maybe_result->ToObject(&result)) return maybe_result; | 462 if (!maybe_result->ToObject(&result)) return maybe_result; |
462 } | 463 } |
463 } | 464 } |
464 return function->prototype(); | 465 return function->prototype(); |
465 } | 466 } |
466 | 467 |
467 | 468 |
468 MaybeObject* Accessors::FunctionSetPrototype(JSObject* object, | 469 MaybeObject* Accessors::FunctionSetPrototype(JSObject* object, |
469 Object* value_raw, | 470 Object* value_raw, |
470 void*) { | 471 void*) { |
471 Isolate* isolate = object->GetIsolate(); | 472 Isolate* isolate = object->GetIsolate(); |
472 Heap* heap = isolate->heap(); | 473 Heap* heap = isolate->heap(); |
473 JSFunction* function_raw = FindInstanceOf<JSFunction>(object); | 474 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object); |
474 if (function_raw == NULL) return heap->undefined_value(); | 475 if (function_raw == NULL) return heap->undefined_value(); |
475 if (!function_raw->should_have_prototype()) { | 476 if (!function_raw->should_have_prototype()) { |
476 // Since we hit this accessor, object will have no prototype property. | 477 // Since we hit this accessor, object will have no prototype property. |
477 return object->SetLocalPropertyIgnoreAttributes(heap->prototype_symbol(), | 478 return object->SetLocalPropertyIgnoreAttributes(heap->prototype_symbol(), |
478 value_raw, | 479 value_raw, |
479 NONE); | 480 NONE); |
480 } | 481 } |
481 | 482 |
482 HandleScope scope(isolate); | 483 HandleScope scope(isolate); |
483 Handle<JSFunction> function(function_raw, isolate); | 484 Handle<JSFunction> function(function_raw, isolate); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 0 | 516 0 |
516 }; | 517 }; |
517 | 518 |
518 | 519 |
519 // | 520 // |
520 // Accessors::FunctionLength | 521 // Accessors::FunctionLength |
521 // | 522 // |
522 | 523 |
523 | 524 |
524 MaybeObject* Accessors::FunctionGetLength(Object* object, void*) { | 525 MaybeObject* Accessors::FunctionGetLength(Object* object, void*) { |
525 JSFunction* function = FindInstanceOf<JSFunction>(object); | 526 Isolate* isolate = Isolate::Current(); |
| 527 JSFunction* function = FindInstanceOf<JSFunction>(isolate, object); |
526 if (function == NULL) return Smi::FromInt(0); | 528 if (function == NULL) return Smi::FromInt(0); |
527 // Check if already compiled. | 529 // Check if already compiled. |
528 if (function->shared()->is_compiled()) { | 530 if (function->shared()->is_compiled()) { |
529 return Smi::FromInt(function->shared()->length()); | 531 return Smi::FromInt(function->shared()->length()); |
530 } | 532 } |
531 // If the function isn't compiled yet, the length is not computed correctly | 533 // If the function isn't compiled yet, the length is not computed correctly |
532 // yet. Compile it now and return the right length. | 534 // yet. Compile it now and return the right length. |
533 HandleScope scope(function->GetIsolate()); | 535 HandleScope scope(isolate); |
534 Handle<JSFunction> handle(function); | 536 Handle<JSFunction> handle(function); |
535 if (JSFunction::CompileLazy(handle, KEEP_EXCEPTION)) { | 537 if (JSFunction::CompileLazy(handle, KEEP_EXCEPTION)) { |
536 return Smi::FromInt(handle->shared()->length()); | 538 return Smi::FromInt(handle->shared()->length()); |
537 } | 539 } |
538 return Failure::Exception(); | 540 return Failure::Exception(); |
539 } | 541 } |
540 | 542 |
541 | 543 |
542 const AccessorDescriptor Accessors::FunctionLength = { | 544 const AccessorDescriptor Accessors::FunctionLength = { |
543 FunctionGetLength, | 545 FunctionGetLength, |
544 ReadOnlySetAccessor, | 546 ReadOnlySetAccessor, |
545 0 | 547 0 |
546 }; | 548 }; |
547 | 549 |
548 | 550 |
549 // | 551 // |
550 // Accessors::FunctionName | 552 // Accessors::FunctionName |
551 // | 553 // |
552 | 554 |
553 | 555 |
554 MaybeObject* Accessors::FunctionGetName(Object* object, void*) { | 556 MaybeObject* Accessors::FunctionGetName(Object* object, void*) { |
555 JSFunction* holder = FindInstanceOf<JSFunction>(object); | 557 Isolate* isolate = Isolate::Current(); |
556 return holder == NULL ? HEAP->undefined_value() : holder->shared()->name(); | 558 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); |
| 559 return holder == NULL |
| 560 ? isolate->heap()->undefined_value() |
| 561 : holder->shared()->name(); |
557 } | 562 } |
558 | 563 |
559 | 564 |
560 const AccessorDescriptor Accessors::FunctionName = { | 565 const AccessorDescriptor Accessors::FunctionName = { |
561 FunctionGetName, | 566 FunctionGetName, |
562 ReadOnlySetAccessor, | 567 ReadOnlySetAccessor, |
563 0 | 568 0 |
564 }; | 569 }; |
565 | 570 |
566 | 571 |
(...skipping 25 matching lines...) Expand all Loading... |
592 args_slots.Dispose(); | 597 args_slots.Dispose(); |
593 | 598 |
594 // Return the freshly allocated arguments object. | 599 // Return the freshly allocated arguments object. |
595 return *arguments; | 600 return *arguments; |
596 } | 601 } |
597 | 602 |
598 | 603 |
599 MaybeObject* Accessors::FunctionGetArguments(Object* object, void*) { | 604 MaybeObject* Accessors::FunctionGetArguments(Object* object, void*) { |
600 Isolate* isolate = Isolate::Current(); | 605 Isolate* isolate = Isolate::Current(); |
601 HandleScope scope(isolate); | 606 HandleScope scope(isolate); |
602 JSFunction* holder = FindInstanceOf<JSFunction>(object); | 607 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); |
603 if (holder == NULL) return isolate->heap()->undefined_value(); | 608 if (holder == NULL) return isolate->heap()->undefined_value(); |
604 Handle<JSFunction> function(holder, isolate); | 609 Handle<JSFunction> function(holder, isolate); |
605 | 610 |
606 if (function->shared()->native()) return isolate->heap()->null_value(); | 611 if (function->shared()->native()) return isolate->heap()->null_value(); |
607 // Find the top invocation of the function by traversing frames. | 612 // Find the top invocation of the function by traversing frames. |
608 List<JSFunction*> functions(2); | 613 List<JSFunction*> functions(2); |
609 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { | 614 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { |
610 JavaScriptFrame* frame = it.frame(); | 615 JavaScriptFrame* frame = it.frame(); |
611 frame->GetFunctions(&functions); | 616 frame->GetFunctions(&functions); |
612 for (int i = functions.length() - 1; i >= 0; i--) { | 617 for (int i = functions.length() - 1; i >= 0; i--) { |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 JavaScriptFrameIterator frame_iterator_; | 721 JavaScriptFrameIterator frame_iterator_; |
717 List<JSFunction*> functions_; | 722 List<JSFunction*> functions_; |
718 int index_; | 723 int index_; |
719 }; | 724 }; |
720 | 725 |
721 | 726 |
722 MaybeObject* Accessors::FunctionGetCaller(Object* object, void*) { | 727 MaybeObject* Accessors::FunctionGetCaller(Object* object, void*) { |
723 Isolate* isolate = Isolate::Current(); | 728 Isolate* isolate = Isolate::Current(); |
724 HandleScope scope(isolate); | 729 HandleScope scope(isolate); |
725 AssertNoAllocation no_alloc; | 730 AssertNoAllocation no_alloc; |
726 JSFunction* holder = FindInstanceOf<JSFunction>(object); | 731 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); |
727 if (holder == NULL) return isolate->heap()->undefined_value(); | 732 if (holder == NULL) return isolate->heap()->undefined_value(); |
728 if (holder->shared()->native()) return isolate->heap()->null_value(); | 733 if (holder->shared()->native()) return isolate->heap()->null_value(); |
729 Handle<JSFunction> function(holder, isolate); | 734 Handle<JSFunction> function(holder, isolate); |
730 | 735 |
731 FrameFunctionIterator it(isolate, no_alloc); | 736 FrameFunctionIterator it(isolate, no_alloc); |
732 | 737 |
733 // Find the function from the frames. | 738 // Find the function from the frames. |
734 if (!it.Find(*function)) { | 739 if (!it.Find(*function)) { |
735 // No frame corresponding to the given function found. Return null. | 740 // No frame corresponding to the given function found. Return null. |
736 return isolate->heap()->null_value(); | 741 return isolate->heap()->null_value(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 ReadOnlySetAccessor, | 780 ReadOnlySetAccessor, |
776 0 | 781 0 |
777 }; | 782 }; |
778 | 783 |
779 | 784 |
780 // | 785 // |
781 // Accessors::ObjectPrototype | 786 // Accessors::ObjectPrototype |
782 // | 787 // |
783 | 788 |
784 | 789 |
785 static inline Object* GetPrototypeSkipHiddenPrototypes(Object* receiver) { | 790 static inline Object* GetPrototypeSkipHiddenPrototypes(Isolate* isolate, |
786 Object* current = receiver->GetPrototype(); | 791 Object* receiver) { |
| 792 Object* current = receiver->GetPrototype(isolate); |
787 while (current->IsJSObject() && | 793 while (current->IsJSObject() && |
788 JSObject::cast(current)->map()->is_hidden_prototype()) { | 794 JSObject::cast(current)->map()->is_hidden_prototype()) { |
789 current = current->GetPrototype(); | 795 current = current->GetPrototype(isolate); |
790 } | 796 } |
791 return current; | 797 return current; |
792 } | 798 } |
793 | 799 |
794 | 800 |
795 MaybeObject* Accessors::ObjectGetPrototype(Object* receiver, void*) { | 801 MaybeObject* Accessors::ObjectGetPrototype(Object* receiver, void*) { |
796 return GetPrototypeSkipHiddenPrototypes(receiver); | 802 return GetPrototypeSkipHiddenPrototypes(Isolate::Current(), receiver); |
797 } | 803 } |
798 | 804 |
799 | 805 |
800 MaybeObject* Accessors::ObjectSetPrototype(JSObject* receiver_raw, | 806 MaybeObject* Accessors::ObjectSetPrototype(JSObject* receiver_raw, |
801 Object* value_raw, | 807 Object* value_raw, |
802 void*) { | 808 void*) { |
803 const bool kSkipHiddenPrototypes = true; | 809 const bool kSkipHiddenPrototypes = true; |
804 // To be consistent with other Set functions, return the value. | 810 // To be consistent with other Set functions, return the value. |
805 if (!(FLAG_harmony_observation && receiver_raw->map()->is_observed())) | 811 if (!(FLAG_harmony_observation && receiver_raw->map()->is_observed())) |
806 return receiver_raw->SetPrototype(value_raw, kSkipHiddenPrototypes); | 812 return receiver_raw->SetPrototype(value_raw, kSkipHiddenPrototypes); |
807 | 813 |
808 Isolate* isolate = receiver_raw->GetIsolate(); | 814 Isolate* isolate = receiver_raw->GetIsolate(); |
809 HandleScope scope(isolate); | 815 HandleScope scope(isolate); |
810 Handle<JSObject> receiver(receiver_raw); | 816 Handle<JSObject> receiver(receiver_raw); |
811 Handle<Object> value(value_raw, isolate); | 817 Handle<Object> value(value_raw, isolate); |
812 Handle<Object> old_value(GetPrototypeSkipHiddenPrototypes(*receiver), | 818 Handle<Object> old_value(GetPrototypeSkipHiddenPrototypes(isolate, *receiver), |
813 isolate); | 819 isolate); |
814 | 820 |
815 MaybeObject* result = receiver->SetPrototype(*value, kSkipHiddenPrototypes); | 821 MaybeObject* result = receiver->SetPrototype(*value, kSkipHiddenPrototypes); |
816 Handle<Object> hresult; | 822 Handle<Object> hresult; |
817 if (!result->ToHandle(&hresult, isolate)) return result; | 823 if (!result->ToHandle(&hresult, isolate)) return result; |
818 | 824 |
819 Handle<Object> new_value(GetPrototypeSkipHiddenPrototypes(*receiver), | 825 Handle<Object> new_value(GetPrototypeSkipHiddenPrototypes(isolate, *receiver), |
820 isolate); | 826 isolate); |
821 if (!new_value->SameValue(*old_value)) { | 827 if (!new_value->SameValue(*old_value)) { |
822 JSObject::EnqueueChangeRecord(receiver, "prototype", | 828 JSObject::EnqueueChangeRecord(receiver, "prototype", |
823 isolate->factory()->Proto_symbol(), | 829 isolate->factory()->Proto_symbol(), |
824 old_value); | 830 old_value); |
825 } | 831 } |
826 return *hresult; | 832 return *hresult; |
827 } | 833 } |
828 | 834 |
829 | 835 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
892 info->set_data(Smi::FromInt(index)); | 898 info->set_data(Smi::FromInt(index)); |
893 Handle<Object> getter = v8::FromCData(&ModuleGetExport); | 899 Handle<Object> getter = v8::FromCData(&ModuleGetExport); |
894 Handle<Object> setter = v8::FromCData(&ModuleSetExport); | 900 Handle<Object> setter = v8::FromCData(&ModuleSetExport); |
895 info->set_getter(*getter); | 901 info->set_getter(*getter); |
896 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 902 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
897 return info; | 903 return info; |
898 } | 904 } |
899 | 905 |
900 | 906 |
901 } } // namespace v8::internal | 907 } } // namespace v8::internal |
OLD | NEW |