Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index dc3ac255ea5cacede22246b32fa443178852e7fb..f39b760402e1f05a937dbaac7d278aa277ca2855 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -506,57 +506,65 @@ MaybeObject* Object::GetPropertyWithDefinedGetter(Object* receiver, |
} |
+// TODO(yangguo): this should eventually replace the non-handlified version. |
+Handle<Object> JSObject::GetPropertyWithCallback(Handle<JSObject> object, |
+ Handle<Object> receiver, |
+ Handle<Object> structure, |
+ Handle<Name> name) { |
+ CALL_HEAP_FUNCTION(object->GetIsolate(), |
+ object->GetPropertyWithCallback(*receiver, |
+ *structure, |
+ *name), |
+ Object); |
+} |
+ |
+ |
// Only deal with CALLBACKS and INTERCEPTOR |
-MaybeObject* JSObject::GetPropertyWithFailedAccessCheck( |
- Object* receiver, |
+Handle<Object> JSObject::GetPropertyWithFailedAccessCheck( |
+ Handle<JSObject> object, |
+ Handle<Object> receiver, |
LookupResult* result, |
- Name* name, |
+ Handle<Name> name, |
PropertyAttributes* attributes) { |
+ Isolate* isolate = name->GetIsolate(); |
if (result->IsProperty()) { |
switch (result->type()) { |
case CALLBACKS: { |
// Only allow API accessors. |
- Object* obj = result->GetCallbackObject(); |
- if (obj->IsAccessorInfo()) { |
- AccessorInfo* info = AccessorInfo::cast(obj); |
- if (info->all_can_read()) { |
- *attributes = result->GetAttributes(); |
- return result->holder()->GetPropertyWithCallback( |
- receiver, result->GetCallbackObject(), name); |
- } |
- } else if (obj->IsAccessorPair()) { |
- AccessorPair* pair = AccessorPair::cast(obj); |
- if (pair->all_can_read()) { |
- return result->holder()->GetPropertyWithCallback( |
- receiver, result->GetCallbackObject(), name); |
- } |
+ Handle<Object> callback_obj(result->GetCallbackObject(), isolate); |
+ if (callback_obj->IsAccessorInfo()) { |
+ if (!AccessorInfo::cast(*callback_obj)->all_can_read()) break; |
+ *attributes = result->GetAttributes(); |
+ // Fall through to GetPropertyWithCallback. |
+ } else if (callback_obj->IsAccessorPair()) { |
+ if (!AccessorPair::cast(*callback_obj)->all_can_read()) break; |
+ // Fall through to GetPropertyWithCallback. |
+ } else { |
+ break; |
} |
- break; |
+ Handle<JSObject> holder(result->holder(), isolate); |
+ return GetPropertyWithCallback(holder, receiver, callback_obj, name); |
} |
case NORMAL: |
case FIELD: |
case CONSTANT: { |
// Search ALL_CAN_READ accessors in prototype chain. |
- LookupResult r(GetIsolate()); |
- result->holder()->LookupRealNamedPropertyInPrototypes(name, &r); |
+ LookupResult r(isolate); |
+ result->holder()->LookupRealNamedPropertyInPrototypes(*name, &r); |
if (r.IsProperty()) { |
- return GetPropertyWithFailedAccessCheck(receiver, |
- &r, |
- name, |
- attributes); |
+ return GetPropertyWithFailedAccessCheck( |
+ object, receiver, &r, name, attributes); |
} |
break; |
} |
case INTERCEPTOR: { |
// If the object has an interceptor, try real named properties. |
// No access check in GetPropertyAttributeWithInterceptor. |
- LookupResult r(GetIsolate()); |
- result->holder()->LookupRealNamedProperty(name, &r); |
+ LookupResult r(isolate); |
+ result->holder()->LookupRealNamedProperty(*name, &r); |
if (r.IsProperty()) { |
- return GetPropertyWithFailedAccessCheck(receiver, |
- &r, |
- name, |
- attributes); |
+ return GetPropertyWithFailedAccessCheck( |
+ object, receiver, &r, name, attributes); |
} |
break; |
} |
@@ -567,11 +575,9 @@ MaybeObject* JSObject::GetPropertyWithFailedAccessCheck( |
// No accessible property found. |
*attributes = ABSENT; |
- Heap* heap = name->GetHeap(); |
- Isolate* isolate = heap->isolate(); |
- isolate->ReportFailedAccessCheck(this, v8::ACCESS_GET); |
- RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
- return heap->undefined_value(); |
+ isolate->ReportFailedAccessCheck(*object, v8::ACCESS_GET); |
+ RETURN_HANDLE_IF_SCHEDULED_EXCEPTION(isolate, Object); |
+ return isolate->factory()->undefined_value(); |
} |
@@ -856,11 +862,16 @@ MaybeObject* Object::GetProperty(Object* receiver, |
// property from the current object, we still check that we have |
// access to it. |
JSObject* checked = JSObject::cast(current); |
- if (!heap->isolate()->MayNamedAccess(checked, name, v8::ACCESS_GET)) { |
- return checked->GetPropertyWithFailedAccessCheck(receiver, |
- result, |
- name, |
- attributes); |
+ if (!isolate->MayNamedAccess(checked, name, v8::ACCESS_GET)) { |
+ HandleScope scope(isolate); |
+ Handle<Object> value = JSObject::GetPropertyWithFailedAccessCheck( |
+ handle(checked, isolate), |
+ handle(receiver, isolate), |
+ result, |
+ handle(name, isolate), |
+ attributes); |
+ RETURN_IF_EMPTY_HANDLE(isolate, value); |
+ return *value; |
} |
} |
// Stop traversing the chain once we reach the last object in the |