Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Side by Side Diff: src/objects.cc

Issue 151151: Use attributes to communicate failed lookup instead of retval. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 5770 matching lines...) Expand 10 before | Expand all | Expand 10 after
5781 LocalLookupRealNamedProperty(name, &result); 5781 LocalLookupRealNamedProperty(name, &result);
5782 if (result.IsValid()) return GetProperty(receiver, &result, name, attributes); 5782 if (result.IsValid()) return GetProperty(receiver, &result, name, attributes);
5783 // Continue searching via the prototype chain. 5783 // Continue searching via the prototype chain.
5784 Object* pt = GetPrototype(); 5784 Object* pt = GetPrototype();
5785 *attributes = ABSENT; 5785 *attributes = ABSENT;
5786 if (pt == Heap::null_value()) return Heap::undefined_value(); 5786 if (pt == Heap::null_value()) return Heap::undefined_value();
5787 return pt->GetPropertyWithReceiver(receiver, name, attributes); 5787 return pt->GetPropertyWithReceiver(receiver, name, attributes);
5788 } 5788 }
5789 5789
5790 5790
5791 bool JSObject::GetPropertyWithInterceptorProper( 5791 Object* JSObject::GetPropertyWithInterceptorProper(
5792 JSObject* receiver, 5792 JSObject* receiver,
5793 String* name, 5793 String* name,
5794 PropertyAttributes* attributes, 5794 PropertyAttributes* attributes) {
5795 Object** result_object) {
5796 HandleScope scope; 5795 HandleScope scope;
5797 Handle<InterceptorInfo> interceptor(GetNamedInterceptor()); 5796 Handle<InterceptorInfo> interceptor(GetNamedInterceptor());
5798 Handle<JSObject> receiver_handle(receiver); 5797 Handle<JSObject> receiver_handle(receiver);
5799 Handle<JSObject> holder_handle(this); 5798 Handle<JSObject> holder_handle(this);
5800 Handle<String> name_handle(name); 5799 Handle<String> name_handle(name);
5801 Handle<Object> data_handle(interceptor->data()); 5800 Handle<Object> data_handle(interceptor->data());
5802 5801
5803 if (!interceptor->getter()->IsUndefined()) { 5802 if (!interceptor->getter()->IsUndefined()) {
5804 v8::NamedPropertyGetter getter = 5803 v8::NamedPropertyGetter getter =
5805 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); 5804 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter());
5806 LOG(ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name)); 5805 LOG(ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name));
5807 v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle), 5806 v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle),
5808 v8::Utils::ToLocal(data_handle), 5807 v8::Utils::ToLocal(data_handle),
5809 v8::Utils::ToLocal(holder_handle)); 5808 v8::Utils::ToLocal(holder_handle));
5810 v8::Handle<v8::Value> result; 5809 v8::Handle<v8::Value> result;
5811 { 5810 {
5812 // Leaving JavaScript. 5811 // Leaving JavaScript.
5813 VMState state(EXTERNAL); 5812 VMState state(EXTERNAL);
5814 result = getter(v8::Utils::ToLocal(name_handle), info); 5813 result = getter(v8::Utils::ToLocal(name_handle), info);
5815 } 5814 }
5816 if (Top::has_scheduled_exception()) { 5815 if (!Top::has_scheduled_exception() && !result.IsEmpty()) {
5817 return false;
5818 }
5819 if (!result.IsEmpty()) {
5820 *attributes = NONE; 5816 *attributes = NONE;
5821 *result_object = *v8::Utils::OpenHandle(*result); 5817 return *v8::Utils::OpenHandle(*result);
5822 return true;
5823 } 5818 }
5824 } 5819 }
5825 5820
5826 return false; 5821 *attributes = ABSENT;
5822 return Heap::undefined_value();
5827 } 5823 }
5828 5824
5829 5825
5830 Object* JSObject::GetInterceptorPropertyWithLookupHint( 5826 Object* JSObject::GetInterceptorPropertyWithLookupHint(
5831 JSObject* receiver, 5827 JSObject* receiver,
5832 Smi* lookup_hint, 5828 Smi* lookup_hint,
5833 String* name, 5829 String* name,
5834 PropertyAttributes* attributes) { 5830 PropertyAttributes* attributes) {
5835 HandleScope scope; 5831 HandleScope scope;
5836 Handle<JSObject> receiver_handle(receiver); 5832 Handle<JSObject> receiver_handle(receiver);
5837 Handle<JSObject> holder_handle(this); 5833 Handle<JSObject> holder_handle(this);
5838 Handle<String> name_handle(name); 5834 Handle<String> name_handle(name);
5839 5835
5840 Object* result = NULL; 5836 Object* result = GetPropertyWithInterceptorProper(receiver,
5841 if (GetPropertyWithInterceptorProper(receiver, name, attributes, &result)) { 5837 name,
5838 attributes);
5839 if (*attributes != ABSENT) {
5842 return result; 5840 return result;
5843 } else {
5844 RETURN_IF_SCHEDULED_EXCEPTION();
5845 } 5841 }
5842 RETURN_IF_SCHEDULED_EXCEPTION();
5846 5843
5847 int property_index = lookup_hint->value(); 5844 int property_index = lookup_hint->value();
5848 if (property_index >= 0) { 5845 if (property_index >= 0) {
5849 result = holder_handle->FastPropertyAt(property_index); 5846 result = holder_handle->FastPropertyAt(property_index);
5850 } else { 5847 } else {
5851 switch (property_index) { 5848 switch (property_index) {
5852 case kLookupInPrototype: { 5849 case kLookupInPrototype: {
5853 Object* pt = holder_handle->GetPrototype(); 5850 Object* pt = holder_handle->GetPrototype();
5854 *attributes = ABSENT; 5851 *attributes = ABSENT;
5855 if (pt == Heap::null_value()) return Heap::undefined_value(); 5852 if (pt == Heap::null_value()) return Heap::undefined_value();
(...skipping 24 matching lines...) Expand all
5880 5877
5881 Object* JSObject::GetPropertyWithInterceptor( 5878 Object* JSObject::GetPropertyWithInterceptor(
5882 JSObject* receiver, 5879 JSObject* receiver,
5883 String* name, 5880 String* name,
5884 PropertyAttributes* attributes) { 5881 PropertyAttributes* attributes) {
5885 HandleScope scope; 5882 HandleScope scope;
5886 Handle<JSObject> receiver_handle(receiver); 5883 Handle<JSObject> receiver_handle(receiver);
5887 Handle<JSObject> holder_handle(this); 5884 Handle<JSObject> holder_handle(this);
5888 Handle<String> name_handle(name); 5885 Handle<String> name_handle(name);
5889 5886
5890 Object* result = NULL; 5887 Object* result = GetPropertyWithInterceptorProper(receiver, name, attributes);
5891 if (GetPropertyWithInterceptorProper(receiver, name, attributes, &result)) { 5888 if (*attributes != ABSENT) {
5892 return result; 5889 return result;
5893 } else {
5894 RETURN_IF_SCHEDULED_EXCEPTION();
5895 } 5890 }
5891 RETURN_IF_SCHEDULED_EXCEPTION();
5896 5892
5897 result = holder_handle->GetPropertyPostInterceptor( 5893 result = holder_handle->GetPropertyPostInterceptor(
5898 *receiver_handle, 5894 *receiver_handle,
5899 *name_handle, 5895 *name_handle,
5900 attributes); 5896 attributes);
5901 RETURN_IF_SCHEDULED_EXCEPTION(); 5897 RETURN_IF_SCHEDULED_EXCEPTION();
5902 return result; 5898 return result;
5903 } 5899 }
5904 5900
5905 5901
(...skipping 1733 matching lines...) Expand 10 before | Expand all | Expand 10 after
7639 // No break point. 7635 // No break point.
7640 if (break_point_objects()->IsUndefined()) return 0; 7636 if (break_point_objects()->IsUndefined()) return 0;
7641 // Single beak point. 7637 // Single beak point.
7642 if (!break_point_objects()->IsFixedArray()) return 1; 7638 if (!break_point_objects()->IsFixedArray()) return 1;
7643 // Multiple break points. 7639 // Multiple break points.
7644 return FixedArray::cast(break_point_objects())->length(); 7640 return FixedArray::cast(break_point_objects())->length();
7645 } 7641 }
7646 #endif 7642 #endif
7647 7643
7648 } } // namespace v8::internal 7644 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698