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

Side by Side Diff: src/objects.cc

Issue 155682: Get rid of unnecessary handle management when invoking interceptors. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 4 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') | src/stub-cache.cc » ('j') | 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 6010 matching lines...) Expand 10 before | Expand all | Expand 10 after
6021 LocalLookupRealNamedProperty(name, &result); 6021 LocalLookupRealNamedProperty(name, &result);
6022 if (result.IsValid()) return GetProperty(receiver, &result, name, attributes); 6022 if (result.IsValid()) return GetProperty(receiver, &result, name, attributes);
6023 // Continue searching via the prototype chain. 6023 // Continue searching via the prototype chain.
6024 Object* pt = GetPrototype(); 6024 Object* pt = GetPrototype();
6025 *attributes = ABSENT; 6025 *attributes = ABSENT;
6026 if (pt == Heap::null_value()) return Heap::undefined_value(); 6026 if (pt == Heap::null_value()) return Heap::undefined_value();
6027 return pt->GetPropertyWithReceiver(receiver, name, attributes); 6027 return pt->GetPropertyWithReceiver(receiver, name, attributes);
6028 } 6028 }
6029 6029
6030 6030
6031 Object* JSObject::GetPropertyWithInterceptorProper( 6031 Object* JSObject::GetPropertyWithInterceptor(
6032 JSObject* receiver, 6032 JSObject* receiver,
6033 String* name, 6033 String* name,
6034 PropertyAttributes* attributes) { 6034 PropertyAttributes* attributes) {
6035 InterceptorInfo* interceptor = GetNamedInterceptor();
6035 HandleScope scope; 6036 HandleScope scope;
6036 Handle<InterceptorInfo> interceptor(GetNamedInterceptor());
6037 Handle<JSObject> receiver_handle(receiver); 6037 Handle<JSObject> receiver_handle(receiver);
6038 Handle<JSObject> holder_handle(this); 6038 Handle<JSObject> holder_handle(this);
6039 Handle<String> name_handle(name); 6039 Handle<String> name_handle(name);
6040 Handle<Object> data_handle(interceptor->data()); 6040 Handle<Object> data_handle(interceptor->data());
6041 6041
6042 if (!interceptor->getter()->IsUndefined()) { 6042 if (!interceptor->getter()->IsUndefined()) {
6043 v8::NamedPropertyGetter getter = 6043 v8::NamedPropertyGetter getter =
6044 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter()); 6044 v8::ToCData<v8::NamedPropertyGetter>(interceptor->getter());
6045 LOG(ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name)); 6045 LOG(ApiNamedPropertyAccess("interceptor-named-get", *holder_handle, name));
6046 v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle), 6046 v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle),
6047 v8::Utils::ToLocal(data_handle), 6047 v8::Utils::ToLocal(data_handle),
6048 v8::Utils::ToLocal(holder_handle)); 6048 v8::Utils::ToLocal(holder_handle));
6049 v8::Handle<v8::Value> result; 6049 v8::Handle<v8::Value> result;
6050 { 6050 {
6051 // Leaving JavaScript. 6051 // Leaving JavaScript.
6052 VMState state(EXTERNAL); 6052 VMState state(EXTERNAL);
6053 result = getter(v8::Utils::ToLocal(name_handle), info); 6053 result = getter(v8::Utils::ToLocal(name_handle), info);
6054 } 6054 }
6055 if (!Top::has_scheduled_exception() && !result.IsEmpty()) { 6055 RETURN_IF_SCHEDULED_EXCEPTION();
6056 if (!result.IsEmpty()) {
6056 *attributes = NONE; 6057 *attributes = NONE;
6057 return *v8::Utils::OpenHandle(*result); 6058 return *v8::Utils::OpenHandle(*result);
6058 } 6059 }
6059 } 6060 }
6060 6061
6061 *attributes = ABSENT; 6062 Object* result = holder_handle->GetPropertyPostInterceptor(
6062 return Heap::undefined_value();
6063 }
6064
6065
6066 Object* JSObject::GetInterceptorPropertyWithLookupHint(
6067 JSObject* receiver,
6068 Smi* lookup_hint,
6069 String* name,
6070 PropertyAttributes* attributes) {
6071 HandleScope scope;
6072 Handle<JSObject> receiver_handle(receiver);
6073 Handle<JSObject> holder_handle(this);
6074 Handle<String> name_handle(name);
6075
6076 Object* result = GetPropertyWithInterceptorProper(receiver,
6077 name,
6078 attributes);
6079 if (*attributes != ABSENT) {
6080 return result;
6081 }
6082 RETURN_IF_SCHEDULED_EXCEPTION();
6083
6084 int property_index = lookup_hint->value();
6085 if (property_index >= 0) {
6086 result = holder_handle->FastPropertyAt(property_index);
6087 } else {
6088 switch (property_index) {
6089 case kLookupInPrototype: {
6090 Object* pt = holder_handle->GetPrototype();
6091 *attributes = ABSENT;
6092 if (pt == Heap::null_value()) return Heap::undefined_value();
6093 result = pt->GetPropertyWithReceiver(
6094 *receiver_handle,
6095 *name_handle,
6096 attributes);
6097 RETURN_IF_SCHEDULED_EXCEPTION();
6098 }
6099 break;
6100
6101 case kLookupInHolder:
6102 result = holder_handle->GetPropertyPostInterceptor(
6103 *receiver_handle,
6104 *name_handle,
6105 attributes);
6106 RETURN_IF_SCHEDULED_EXCEPTION();
6107 break;
6108
6109 default:
6110 UNREACHABLE();
6111 }
6112 }
6113
6114 return result;
6115 }
6116
6117
6118 Object* JSObject::GetPropertyWithInterceptor(
6119 JSObject* receiver,
6120 String* name,
6121 PropertyAttributes* attributes) {
6122 HandleScope scope;
6123 Handle<JSObject> receiver_handle(receiver);
6124 Handle<JSObject> holder_handle(this);
6125 Handle<String> name_handle(name);
6126
6127 Object* result = GetPropertyWithInterceptorProper(receiver, name, attributes);
6128 if (*attributes != ABSENT) {
6129 return result;
6130 }
6131 RETURN_IF_SCHEDULED_EXCEPTION();
6132
6133 result = holder_handle->GetPropertyPostInterceptor(
6134 *receiver_handle, 6063 *receiver_handle,
6135 *name_handle, 6064 *name_handle,
6136 attributes); 6065 attributes);
6137 RETURN_IF_SCHEDULED_EXCEPTION(); 6066 RETURN_IF_SCHEDULED_EXCEPTION();
6138 return result; 6067 return result;
6139 } 6068 }
6140 6069
6141 6070
6142 bool JSObject::HasRealNamedProperty(String* key) { 6071 bool JSObject::HasRealNamedProperty(String* key) {
6143 // Check access rights if needed. 6072 // Check access rights if needed.
(...skipping 1853 matching lines...) Expand 10 before | Expand all | Expand 10 after
7997 if (break_point_objects()->IsUndefined()) return 0; 7926 if (break_point_objects()->IsUndefined()) return 0;
7998 // Single beak point. 7927 // Single beak point.
7999 if (!break_point_objects()->IsFixedArray()) return 1; 7928 if (!break_point_objects()->IsFixedArray()) return 1;
8000 // Multiple break points. 7929 // Multiple break points.
8001 return FixedArray::cast(break_point_objects())->length(); 7930 return FixedArray::cast(break_point_objects())->length();
8002 } 7931 }
8003 #endif 7932 #endif
8004 7933
8005 7934
8006 } } // namespace v8::internal 7935 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698