| Index: src/stub-cache.cc
|
| ===================================================================
|
| --- src/stub-cache.cc (revision 2553)
|
| +++ src/stub-cache.cc (working copy)
|
| @@ -789,20 +789,71 @@
|
|
|
|
|
| Object* LoadInterceptorProperty(Arguments args) {
|
| - JSObject* recv = JSObject::cast(args[0]);
|
| - JSObject* holder = JSObject::cast(args[1]);
|
| - String* name = String::cast(args[2]);
|
| + Handle<JSObject> receiver_handle = args.at<JSObject>(0);
|
| + Handle<JSObject> holder_handle = args.at<JSObject>(1);
|
| + Handle<String> name_handle = args.at<String>(2);
|
| Smi* lookup_hint = Smi::cast(args[3]);
|
| - ASSERT(holder->HasNamedInterceptor());
|
| - PropertyAttributes attr = NONE;
|
| + Handle<InterceptorInfo> interceptor_info = args.at<InterceptorInfo>(4);
|
| + Handle<Object> data_handle = args.at<Object>(5);
|
|
|
| - Object* result = holder->GetInterceptorPropertyWithLookupHint(
|
| - recv, lookup_hint, name, &attr);
|
| + Address getter_address = v8::ToCData<Address>(interceptor_info->getter());
|
| + v8::NamedPropertyGetter getter =
|
| + FUNCTION_CAST<v8::NamedPropertyGetter>(getter_address);
|
| + ASSERT(getter != NULL);
|
| +
|
| + PropertyAttributes attributes = ABSENT;
|
| + Object* result = Heap::undefined_value();
|
| +
|
| + {
|
| + // Use the interceptor getter.
|
| + v8::AccessorInfo info(v8::Utils::ToLocal(receiver_handle),
|
| + v8::Utils::ToLocal(data_handle),
|
| + v8::Utils::ToLocal(holder_handle));
|
| + HandleScope scope;
|
| + v8::Handle<v8::Value> r;
|
| + {
|
| + // Leaving JavaScript.
|
| + VMState state(EXTERNAL);
|
| + r = getter(v8::Utils::ToLocal(name_handle), info);
|
| + }
|
| + RETURN_IF_SCHEDULED_EXCEPTION();
|
| + if (!r.IsEmpty()) {
|
| + return *v8::Utils::OpenHandle(*r);
|
| + }
|
| + }
|
| +
|
| + int property_index = lookup_hint->value();
|
| + if (property_index >= 0) {
|
| + result = holder_handle->FastPropertyAt(property_index);
|
| + } else {
|
| + switch (property_index) {
|
| + case JSObject::kLookupInPrototype: {
|
| + Object* pt = holder_handle->GetPrototype();
|
| + if (pt == Heap::null_value()) return Heap::undefined_value();
|
| + result = pt->GetPropertyWithReceiver(
|
| + *receiver_handle,
|
| + *name_handle,
|
| + &attributes);
|
| + RETURN_IF_SCHEDULED_EXCEPTION();
|
| + }
|
| + break;
|
| +
|
| + case JSObject::kLookupInHolder:
|
| + result = holder_handle->GetPropertyPostInterceptor(
|
| + *receiver_handle,
|
| + *name_handle,
|
| + &attributes);
|
| + RETURN_IF_SCHEDULED_EXCEPTION();
|
| + break;
|
| +
|
| + default:
|
| + UNREACHABLE();
|
| + }
|
| + }
|
| +
|
| if (result->IsFailure()) return result;
|
| + if (attributes != ABSENT) return result;
|
|
|
| - // If the property is present, return it.
|
| - if (attr != ABSENT) return result;
|
| -
|
| // If the top frame is an internal frame, this is really a call
|
| // IC. In this case, we simply return the undefined result which
|
| // will lead to an exception when trying to invoke the result as a
|
|
|