OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" |
9 #include "src/api.h" | 9 #include "src/api.h" |
10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
(...skipping 795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 Handle<Object> receiver, | 806 Handle<Object> receiver, |
807 uint32_t index) { | 807 uint32_t index) { |
808 Handle<Object> holder; | 808 Handle<Object> holder; |
809 | 809 |
810 // Iterate up the prototype chain until an element is found or the null | 810 // Iterate up the prototype chain until an element is found or the null |
811 // prototype is encountered. | 811 // prototype is encountered. |
812 for (holder = object; | 812 for (holder = object; |
813 !holder->IsNull(); | 813 !holder->IsNull(); |
814 holder = Handle<Object>(holder->GetPrototype(isolate), isolate)) { | 814 holder = Handle<Object>(holder->GetPrototype(isolate), isolate)) { |
815 if (!holder->IsJSObject()) { | 815 if (!holder->IsJSObject()) { |
816 Context* native_context = isolate->context()->native_context(); | 816 if (holder->IsJSProxy()) { |
817 if (holder->IsNumber()) { | |
818 holder = Handle<Object>( | |
819 native_context->number_function()->instance_prototype(), isolate); | |
820 } else if (holder->IsString()) { | |
821 holder = Handle<Object>( | |
822 native_context->string_function()->instance_prototype(), isolate); | |
823 } else if (holder->IsSymbol()) { | |
824 holder = Handle<Object>( | |
825 native_context->symbol_function()->instance_prototype(), isolate); | |
826 } else if (holder->IsBoolean()) { | |
827 holder = Handle<Object>( | |
828 native_context->boolean_function()->instance_prototype(), isolate); | |
829 } else if (holder->IsJSProxy()) { | |
830 return JSProxy::GetElementWithHandler( | 817 return JSProxy::GetElementWithHandler( |
831 Handle<JSProxy>::cast(holder), receiver, index); | 818 Handle<JSProxy>::cast(holder), receiver, index); |
| 819 } else if (holder->IsUndefined()) { |
| 820 // Undefined has no indexed properties. |
| 821 return isolate->factory()->undefined_value(); |
832 } else { | 822 } else { |
833 // Undefined and null have no indexed properties. | 823 holder = Handle<Object>(holder->GetPrototype(isolate), isolate); |
834 ASSERT(holder->IsUndefined() || holder->IsNull()); | 824 ASSERT(holder->IsJSObject()); |
835 return isolate->factory()->undefined_value(); | |
836 } | 825 } |
837 } | 826 } |
838 | 827 |
839 // Inline the case for JSObjects. Doing so significantly improves the | 828 // Inline the case for JSObjects. Doing so significantly improves the |
840 // performance of fetching elements where checking the prototype chain is | 829 // performance of fetching elements where checking the prototype chain is |
841 // necessary. | 830 // necessary. |
842 Handle<JSObject> js_object = Handle<JSObject>::cast(holder); | 831 Handle<JSObject> js_object = Handle<JSObject>::cast(holder); |
843 | 832 |
844 // Check access rights if needed. | 833 // Check access rights if needed. |
845 if (js_object->IsAccessCheckNeeded()) { | 834 if (js_object->IsAccessCheckNeeded()) { |
(...skipping 16154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17000 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16989 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17001 static const char* error_messages_[] = { | 16990 static const char* error_messages_[] = { |
17002 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16991 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17003 }; | 16992 }; |
17004 #undef ERROR_MESSAGES_TEXTS | 16993 #undef ERROR_MESSAGES_TEXTS |
17005 return error_messages_[reason]; | 16994 return error_messages_[reason]; |
17006 } | 16995 } |
17007 | 16996 |
17008 | 16997 |
17009 } } // namespace v8::internal | 16998 } } // namespace v8::internal |
OLD | NEW |