OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
738 } | 738 } |
739 } | 739 } |
740 } | 740 } |
741 | 741 |
742 // Use recursive implementation to also traverse hidden prototypes | 742 // Use recursive implementation to also traverse hidden prototypes |
743 GetOwnPropertyImplementation(*obj, *name, &result); | 743 GetOwnPropertyImplementation(*obj, *name, &result); |
744 | 744 |
745 if (!result.IsProperty()) { | 745 if (!result.IsProperty()) { |
746 return Heap::undefined_value(); | 746 return Heap::undefined_value(); |
747 } | 747 } |
748 if (result.type() == CALLBACKS) { | |
749 Object* structure = result.GetCallbackObject(); | |
750 if (structure->IsProxy() || structure->IsAccessorInfo()) { | |
751 // Property that is internally implemented as a callback or | |
752 // an API defined callback. | |
753 Object* value; | |
754 { MaybeObject* maybe_value = obj->GetPropertyWithCallback( | |
755 *obj, structure, *name, result.holder()); | |
756 if (!maybe_value->ToObject(&value)) return maybe_value; | |
757 } | |
758 elms->set(IS_ACCESSOR_INDEX, Heap::false_value()); | |
759 elms->set(VALUE_INDEX, value); | |
760 elms->set(WRITABLE_INDEX, Heap::ToBoolean(!result.IsReadOnly())); | |
761 } else if (structure->IsFixedArray()) { | |
762 // __defineGetter__/__defineSetter__ callback. | |
763 elms->set(IS_ACCESSOR_INDEX, Heap::true_value()); | |
764 elms->set(GETTER_INDEX, FixedArray::cast(structure)->get(0)); | |
765 elms->set(SETTER_INDEX, FixedArray::cast(structure)->get(1)); | |
766 } else { | |
767 return Heap::undefined_value(); | |
768 } | |
769 } else { | |
770 elms->set(IS_ACCESSOR_INDEX, Heap::false_value()); | |
771 elms->set(VALUE_INDEX, result.GetLazyValue()); | |
772 elms->set(WRITABLE_INDEX, Heap::ToBoolean(!result.IsReadOnly())); | |
773 } | |
774 | 748 |
775 elms->set(ENUMERABLE_INDEX, Heap::ToBoolean(!result.IsDontEnum())); | 749 elms->set(ENUMERABLE_INDEX, Heap::ToBoolean(!result.IsDontEnum())); |
776 elms->set(CONFIGURABLE_INDEX, Heap::ToBoolean(!result.IsDontDelete())); | 750 elms->set(CONFIGURABLE_INDEX, Heap::ToBoolean(!result.IsDontDelete())); |
| 751 |
| 752 bool is_js_accessor = (result.type() == CALLBACKS) && |
| 753 (result.GetCallbackObject()->IsFixedArray()); |
| 754 |
| 755 if (is_js_accessor) { |
| 756 // __defineGetter__/__defineSetter__ callback. |
| 757 FixedArray* structure = FixedArray::cast(result.GetCallbackObject()); |
| 758 elms->set(IS_ACCESSOR_INDEX, Heap::true_value()); |
| 759 elms->set(GETTER_INDEX, structure->get(0)); |
| 760 elms->set(SETTER_INDEX, structure->get(1)); |
| 761 } else { |
| 762 elms->set(IS_ACCESSOR_INDEX, Heap::false_value()); |
| 763 elms->set(WRITABLE_INDEX, Heap::ToBoolean(!result.IsReadOnly())); |
| 764 |
| 765 PropertyAttributes attrs; |
| 766 Object* value; |
| 767 { MaybeObject* maybe_value = obj->GetProperty(*obj, &result, *name, &attrs); |
| 768 if (!maybe_value->ToObject(&value)) return maybe_value; |
| 769 } |
| 770 elms->set(VALUE_INDEX, value); |
| 771 } |
| 772 |
777 return *desc; | 773 return *desc; |
778 } | 774 } |
779 | 775 |
780 | 776 |
781 static MaybeObject* Runtime_PreventExtensions(Arguments args) { | 777 static MaybeObject* Runtime_PreventExtensions(Arguments args) { |
782 ASSERT(args.length() == 1); | 778 ASSERT(args.length() == 1); |
783 CONVERT_CHECKED(JSObject, obj, args[0]); | 779 CONVERT_CHECKED(JSObject, obj, args[0]); |
784 return obj->PreventExtensions(); | 780 return obj->PreventExtensions(); |
785 } | 781 } |
786 | 782 |
(...skipping 10087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10874 } else { | 10870 } else { |
10875 // Handle last resort GC and make sure to allow future allocations | 10871 // Handle last resort GC and make sure to allow future allocations |
10876 // to grow the heap without causing GCs (if possible). | 10872 // to grow the heap without causing GCs (if possible). |
10877 Counters::gc_last_resort_from_js.Increment(); | 10873 Counters::gc_last_resort_from_js.Increment(); |
10878 Heap::CollectAllGarbage(false); | 10874 Heap::CollectAllGarbage(false); |
10879 } | 10875 } |
10880 } | 10876 } |
10881 | 10877 |
10882 | 10878 |
10883 } } // namespace v8::internal | 10879 } } // namespace v8::internal |
OLD | NEW |