OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 } | 368 } |
369 | 369 |
370 | 370 |
371 MaybeObject* JSProxy::GetPropertyWithHandler(Object* receiver_raw, | 371 MaybeObject* JSProxy::GetPropertyWithHandler(Object* receiver_raw, |
372 Name* name_raw) { | 372 Name* name_raw) { |
373 Isolate* isolate = GetIsolate(); | 373 Isolate* isolate = GetIsolate(); |
374 HandleScope scope(isolate); | 374 HandleScope scope(isolate); |
375 Handle<Object> receiver(receiver_raw, isolate); | 375 Handle<Object> receiver(receiver_raw, isolate); |
376 Handle<Object> name(name_raw, isolate); | 376 Handle<Object> name(name_raw, isolate); |
377 | 377 |
| 378 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 379 if (name->IsSymbol()) return isolate->heap()->undefined_value(); |
| 380 |
378 Handle<Object> args[] = { receiver, name }; | 381 Handle<Object> args[] = { receiver, name }; |
379 Handle<Object> result = CallTrap( | 382 Handle<Object> result = CallTrap( |
380 "get", isolate->derived_get_trap(), ARRAY_SIZE(args), args); | 383 "get", isolate->derived_get_trap(), ARRAY_SIZE(args), args); |
381 if (isolate->has_pending_exception()) return Failure::Exception(); | 384 if (isolate->has_pending_exception()) return Failure::Exception(); |
382 | 385 |
383 return *result; | 386 return *result; |
384 } | 387 } |
385 | 388 |
386 | 389 |
387 Handle<Object> Object::GetProperty(Handle<Object> object, Handle<Name> name) { | 390 Handle<Object> Object::GetProperty(Handle<Object> object, Handle<Name> name) { |
(...skipping 2361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2749 } | 2752 } |
2750 } | 2753 } |
2751 | 2754 |
2752 | 2755 |
2753 bool JSProxy::HasPropertyWithHandler(Name* name_raw) { | 2756 bool JSProxy::HasPropertyWithHandler(Name* name_raw) { |
2754 Isolate* isolate = GetIsolate(); | 2757 Isolate* isolate = GetIsolate(); |
2755 HandleScope scope(isolate); | 2758 HandleScope scope(isolate); |
2756 Handle<Object> receiver(this, isolate); | 2759 Handle<Object> receiver(this, isolate); |
2757 Handle<Object> name(name_raw, isolate); | 2760 Handle<Object> name(name_raw, isolate); |
2758 | 2761 |
| 2762 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 2763 if (name->IsSymbol()) return false; |
| 2764 |
2759 Handle<Object> args[] = { name }; | 2765 Handle<Object> args[] = { name }; |
2760 Handle<Object> result = CallTrap( | 2766 Handle<Object> result = CallTrap( |
2761 "has", isolate->derived_has_trap(), ARRAY_SIZE(args), args); | 2767 "has", isolate->derived_has_trap(), ARRAY_SIZE(args), args); |
2762 if (isolate->has_pending_exception()) return false; | 2768 if (isolate->has_pending_exception()) return false; |
2763 | 2769 |
2764 return result->BooleanValue(); | 2770 return result->BooleanValue(); |
2765 } | 2771 } |
2766 | 2772 |
2767 | 2773 |
2768 MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyWithHandler( | 2774 MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyWithHandler( |
2769 JSReceiver* receiver_raw, | 2775 JSReceiver* receiver_raw, |
2770 Name* name_raw, | 2776 Name* name_raw, |
2771 Object* value_raw, | 2777 Object* value_raw, |
2772 PropertyAttributes attributes, | 2778 PropertyAttributes attributes, |
2773 StrictModeFlag strict_mode) { | 2779 StrictModeFlag strict_mode) { |
2774 Isolate* isolate = GetIsolate(); | 2780 Isolate* isolate = GetIsolate(); |
2775 HandleScope scope(isolate); | 2781 HandleScope scope(isolate); |
2776 Handle<JSReceiver> receiver(receiver_raw); | 2782 Handle<JSReceiver> receiver(receiver_raw); |
2777 Handle<Object> name(name_raw, isolate); | 2783 Handle<Object> name(name_raw, isolate); |
2778 Handle<Object> value(value_raw, isolate); | 2784 Handle<Object> value(value_raw, isolate); |
2779 | 2785 |
| 2786 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 2787 if (name->IsSymbol()) return *value; |
| 2788 |
2780 Handle<Object> args[] = { receiver, name, value }; | 2789 Handle<Object> args[] = { receiver, name, value }; |
2781 CallTrap("set", isolate->derived_set_trap(), ARRAY_SIZE(args), args); | 2790 CallTrap("set", isolate->derived_set_trap(), ARRAY_SIZE(args), args); |
2782 if (isolate->has_pending_exception()) return Failure::Exception(); | 2791 if (isolate->has_pending_exception()) return Failure::Exception(); |
2783 | 2792 |
2784 return *value; | 2793 return *value; |
2785 } | 2794 } |
2786 | 2795 |
2787 | 2796 |
2788 MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyViaPrototypesWithHandler( | 2797 MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyViaPrototypesWithHandler( |
2789 JSReceiver* receiver_raw, | 2798 JSReceiver* receiver_raw, |
2790 Name* name_raw, | 2799 Name* name_raw, |
2791 Object* value_raw, | 2800 Object* value_raw, |
2792 PropertyAttributes attributes, | 2801 PropertyAttributes attributes, |
2793 StrictModeFlag strict_mode, | 2802 StrictModeFlag strict_mode, |
2794 bool* done) { | 2803 bool* done) { |
2795 Isolate* isolate = GetIsolate(); | 2804 Isolate* isolate = GetIsolate(); |
2796 Handle<JSProxy> proxy(this); | 2805 Handle<JSProxy> proxy(this); |
2797 Handle<JSReceiver> receiver(receiver_raw); | 2806 Handle<JSReceiver> receiver(receiver_raw); |
2798 Handle<Name> name(name_raw); | 2807 Handle<Name> name(name_raw); |
2799 Handle<Object> value(value_raw, isolate); | 2808 Handle<Object> value(value_raw, isolate); |
2800 Handle<Object> handler(this->handler(), isolate); // Trap might morph proxy. | 2809 Handle<Object> handler(this->handler(), isolate); // Trap might morph proxy. |
2801 | 2810 |
| 2811 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 2812 if (name->IsSymbol()) { |
| 2813 *done = false; |
| 2814 return isolate->heap()->the_hole_value(); |
| 2815 } |
| 2816 |
2802 *done = true; // except where redefined... | 2817 *done = true; // except where redefined... |
2803 Handle<Object> args[] = { name }; | 2818 Handle<Object> args[] = { name }; |
2804 Handle<Object> result = proxy->CallTrap( | 2819 Handle<Object> result = proxy->CallTrap( |
2805 "getPropertyDescriptor", Handle<Object>(), ARRAY_SIZE(args), args); | 2820 "getPropertyDescriptor", Handle<Object>(), ARRAY_SIZE(args), args); |
2806 if (isolate->has_pending_exception()) return Failure::Exception(); | 2821 if (isolate->has_pending_exception()) return Failure::Exception(); |
2807 | 2822 |
2808 if (result->IsUndefined()) { | 2823 if (result->IsUndefined()) { |
2809 *done = false; | 2824 *done = false; |
2810 return GetHeap()->the_hole_value(); | 2825 return isolate->heap()->the_hole_value(); |
2811 } | 2826 } |
2812 | 2827 |
2813 // Emulate [[GetProperty]] semantics for proxies. | 2828 // Emulate [[GetProperty]] semantics for proxies. |
2814 bool has_pending_exception; | 2829 bool has_pending_exception; |
2815 Handle<Object> argv[] = { result }; | 2830 Handle<Object> argv[] = { result }; |
2816 Handle<Object> desc = | 2831 Handle<Object> desc = |
2817 Execution::Call(isolate->to_complete_property_descriptor(), result, | 2832 Execution::Call(isolate->to_complete_property_descriptor(), result, |
2818 ARRAY_SIZE(argv), argv, &has_pending_exception); | 2833 ARRAY_SIZE(argv), argv, &has_pending_exception); |
2819 if (has_pending_exception) return Failure::Exception(); | 2834 if (has_pending_exception) return Failure::Exception(); |
2820 | 2835 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2881 } | 2896 } |
2882 | 2897 |
2883 | 2898 |
2884 MUST_USE_RESULT MaybeObject* JSProxy::DeletePropertyWithHandler( | 2899 MUST_USE_RESULT MaybeObject* JSProxy::DeletePropertyWithHandler( |
2885 Name* name_raw, DeleteMode mode) { | 2900 Name* name_raw, DeleteMode mode) { |
2886 Isolate* isolate = GetIsolate(); | 2901 Isolate* isolate = GetIsolate(); |
2887 HandleScope scope(isolate); | 2902 HandleScope scope(isolate); |
2888 Handle<JSProxy> receiver(this); | 2903 Handle<JSProxy> receiver(this); |
2889 Handle<Object> name(name_raw, isolate); | 2904 Handle<Object> name(name_raw, isolate); |
2890 | 2905 |
| 2906 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 2907 if (name->IsSymbol()) return isolate->heap()->false_value(); |
| 2908 |
2891 Handle<Object> args[] = { name }; | 2909 Handle<Object> args[] = { name }; |
2892 Handle<Object> result = CallTrap( | 2910 Handle<Object> result = CallTrap( |
2893 "delete", Handle<Object>(), ARRAY_SIZE(args), args); | 2911 "delete", Handle<Object>(), ARRAY_SIZE(args), args); |
2894 if (isolate->has_pending_exception()) return Failure::Exception(); | 2912 if (isolate->has_pending_exception()) return Failure::Exception(); |
2895 | 2913 |
2896 bool result_bool = result->BooleanValue(); | 2914 bool result_bool = result->BooleanValue(); |
2897 if (mode == STRICT_DELETION && !result_bool) { | 2915 if (mode == STRICT_DELETION && !result_bool) { |
2898 Handle<Object> handler(receiver->handler(), isolate); | 2916 Handle<Object> handler(receiver->handler(), isolate); |
2899 Handle<String> trap_name = isolate->factory()->InternalizeOneByteString( | 2917 Handle<String> trap_name = isolate->factory()->InternalizeOneByteString( |
2900 STATIC_ASCII_VECTOR("delete")); | 2918 STATIC_ASCII_VECTOR("delete")); |
(...skipping 20 matching lines...) Expand all Loading... |
2921 MUST_USE_RESULT PropertyAttributes JSProxy::GetPropertyAttributeWithHandler( | 2939 MUST_USE_RESULT PropertyAttributes JSProxy::GetPropertyAttributeWithHandler( |
2922 JSReceiver* receiver_raw, | 2940 JSReceiver* receiver_raw, |
2923 Name* name_raw) { | 2941 Name* name_raw) { |
2924 Isolate* isolate = GetIsolate(); | 2942 Isolate* isolate = GetIsolate(); |
2925 HandleScope scope(isolate); | 2943 HandleScope scope(isolate); |
2926 Handle<JSProxy> proxy(this); | 2944 Handle<JSProxy> proxy(this); |
2927 Handle<Object> handler(this->handler(), isolate); // Trap might morph proxy. | 2945 Handle<Object> handler(this->handler(), isolate); // Trap might morph proxy. |
2928 Handle<JSReceiver> receiver(receiver_raw); | 2946 Handle<JSReceiver> receiver(receiver_raw); |
2929 Handle<Object> name(name_raw, isolate); | 2947 Handle<Object> name(name_raw, isolate); |
2930 | 2948 |
| 2949 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 2950 if (name->IsSymbol()) return ABSENT; |
| 2951 |
2931 Handle<Object> args[] = { name }; | 2952 Handle<Object> args[] = { name }; |
2932 Handle<Object> result = CallTrap( | 2953 Handle<Object> result = CallTrap( |
2933 "getPropertyDescriptor", Handle<Object>(), ARRAY_SIZE(args), args); | 2954 "getPropertyDescriptor", Handle<Object>(), ARRAY_SIZE(args), args); |
2934 if (isolate->has_pending_exception()) return NONE; | 2955 if (isolate->has_pending_exception()) return NONE; |
2935 | 2956 |
2936 if (result->IsUndefined()) return ABSENT; | 2957 if (result->IsUndefined()) return ABSENT; |
2937 | 2958 |
2938 bool has_pending_exception; | 2959 bool has_pending_exception; |
2939 Handle<Object> argv[] = { result }; | 2960 Handle<Object> argv[] = { result }; |
2940 Handle<Object> desc = | 2961 Handle<Object> desc = |
(...skipping 8639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11580 } else { | 11601 } else { |
11581 HeapSortPairs(this, numbers, len); | 11602 HeapSortPairs(this, numbers, len); |
11582 return; | 11603 return; |
11583 } | 11604 } |
11584 } | 11605 } |
11585 | 11606 |
11586 | 11607 |
11587 // Fill in the names of local properties into the supplied storage. The main | 11608 // Fill in the names of local properties into the supplied storage. The main |
11588 // purpose of this function is to provide reflection information for the object | 11609 // purpose of this function is to provide reflection information for the object |
11589 // mirrors. | 11610 // mirrors. |
11590 void JSObject::GetLocalPropertyNames(FixedArray* storage, int index) { | 11611 void JSObject::GetLocalPropertyNames( |
11591 ASSERT(storage->length() >= (NumberOfLocalProperties() - index)); | 11612 FixedArray* storage, int index, PropertyAttributes filter) { |
| 11613 ASSERT(storage->length() >= (NumberOfLocalProperties(filter) - index)); |
11592 if (HasFastProperties()) { | 11614 if (HasFastProperties()) { |
11593 int real_size = map()->NumberOfOwnDescriptors(); | 11615 int real_size = map()->NumberOfOwnDescriptors(); |
11594 DescriptorArray* descs = map()->instance_descriptors(); | 11616 DescriptorArray* descs = map()->instance_descriptors(); |
11595 ASSERT(storage->length() >= index + real_size); | |
11596 for (int i = 0; i < real_size; i++) { | 11617 for (int i = 0; i < real_size; i++) { |
11597 storage->set(index + i, descs->GetKey(i)); | 11618 if ((descs->GetDetails(i).attributes() & filter) == 0 && |
| 11619 ((filter & SYMBOLIC) == 0 || !descs->GetKey(i)->IsSymbol())) { |
| 11620 storage->set(index++, descs->GetKey(i)); |
| 11621 } |
11598 } | 11622 } |
11599 } else { | 11623 } else { |
11600 property_dictionary()->CopyKeysTo(storage, | 11624 property_dictionary()->CopyKeysTo(storage, |
11601 index, | 11625 index, |
| 11626 filter, |
11602 NameDictionary::UNSORTED); | 11627 NameDictionary::UNSORTED); |
11603 } | 11628 } |
11604 } | 11629 } |
11605 | 11630 |
11606 | 11631 |
11607 int JSObject::NumberOfLocalElements(PropertyAttributes filter) { | 11632 int JSObject::NumberOfLocalElements(PropertyAttributes filter) { |
11608 return GetLocalElementKeys(NULL, filter); | 11633 return GetLocalElementKeys(NULL, filter); |
11609 } | 11634 } |
11610 | 11635 |
11611 | 11636 |
(...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12342 DeleteProperty(int, JSObject::DeleteMode); | 12367 DeleteProperty(int, JSObject::DeleteMode); |
12343 | 12368 |
12344 template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Shrink(Name* n); | 12369 template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Shrink(Name* n); |
12345 | 12370 |
12346 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink( | 12371 template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink( |
12347 uint32_t); | 12372 uint32_t); |
12348 | 12373 |
12349 template void Dictionary<NameDictionaryShape, Name*>::CopyKeysTo( | 12374 template void Dictionary<NameDictionaryShape, Name*>::CopyKeysTo( |
12350 FixedArray*, | 12375 FixedArray*, |
12351 int, | 12376 int, |
| 12377 PropertyAttributes, |
12352 Dictionary<NameDictionaryShape, Name*>::SortMode); | 12378 Dictionary<NameDictionaryShape, Name*>::SortMode); |
12353 | 12379 |
12354 template int | 12380 template int |
12355 Dictionary<NameDictionaryShape, Name*>::NumberOfElementsFilterAttributes( | 12381 Dictionary<NameDictionaryShape, Name*>::NumberOfElementsFilterAttributes( |
12356 PropertyAttributes); | 12382 PropertyAttributes); |
12357 | 12383 |
12358 template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Add( | 12384 template MaybeObject* Dictionary<NameDictionaryShape, Name*>::Add( |
12359 Name*, Object*, PropertyDetails); | 12385 Name*, Object*, PropertyDetails); |
12360 | 12386 |
12361 template MaybeObject* | 12387 template MaybeObject* |
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13584 RightTrimFixedArray<FROM_MUTATOR>(heap, storage, length - properties); | 13610 RightTrimFixedArray<FROM_MUTATOR>(heap, storage, length - properties); |
13585 } | 13611 } |
13586 return storage; | 13612 return storage; |
13587 } | 13613 } |
13588 | 13614 |
13589 | 13615 |
13590 template<typename Shape, typename Key> | 13616 template<typename Shape, typename Key> |
13591 void Dictionary<Shape, Key>::CopyKeysTo( | 13617 void Dictionary<Shape, Key>::CopyKeysTo( |
13592 FixedArray* storage, | 13618 FixedArray* storage, |
13593 int index, | 13619 int index, |
| 13620 PropertyAttributes filter, |
13594 typename Dictionary<Shape, Key>::SortMode sort_mode) { | 13621 typename Dictionary<Shape, Key>::SortMode sort_mode) { |
13595 ASSERT(storage->length() >= NumberOfElementsFilterAttributes( | 13622 ASSERT(storage->length() >= NumberOfElementsFilterAttributes( |
13596 static_cast<PropertyAttributes>(NONE))); | 13623 static_cast<PropertyAttributes>(NONE))); |
13597 int capacity = HashTable<Shape, Key>::Capacity(); | 13624 int capacity = HashTable<Shape, Key>::Capacity(); |
13598 for (int i = 0; i < capacity; i++) { | 13625 for (int i = 0; i < capacity; i++) { |
13599 Object* k = HashTable<Shape, Key>::KeyAt(i); | 13626 Object* k = HashTable<Shape, Key>::KeyAt(i); |
13600 if (HashTable<Shape, Key>::IsKey(k)) { | 13627 if (HashTable<Shape, Key>::IsKey(k)) { |
13601 PropertyDetails details = DetailsAt(i); | 13628 PropertyDetails details = DetailsAt(i); |
13602 if (details.IsDeleted()) continue; | 13629 if (details.IsDeleted()) continue; |
13603 storage->set(index++, k); | 13630 PropertyAttributes attr = details.attributes(); |
| 13631 if ((attr & filter) == 0) storage->set(index++, k); |
13604 } | 13632 } |
13605 } | 13633 } |
13606 if (sort_mode == Dictionary<Shape, Key>::SORTED) { | 13634 if (sort_mode == Dictionary<Shape, Key>::SORTED) { |
13607 storage->SortPairs(storage, index); | 13635 storage->SortPairs(storage, index); |
13608 } | 13636 } |
13609 ASSERT(storage->length() >= index); | 13637 ASSERT(storage->length() >= index); |
13610 } | 13638 } |
13611 | 13639 |
13612 | 13640 |
13613 // Backwards lookup (slow). | 13641 // Backwards lookup (slow). |
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14327 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 14355 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
14328 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 14356 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
14329 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 14357 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
14330 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 14358 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
14331 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 14359 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
14332 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 14360 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
14333 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 14361 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
14334 } | 14362 } |
14335 | 14363 |
14336 } } // namespace v8::internal | 14364 } } // namespace v8::internal |
OLD | NEW |