Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 7e15f3005d6cbb035c4d9818eab72cefdc58617d..a885a1dc3c89f54147cc23d4f9f2f43e46ef05b5 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -513,6 +513,12 @@ MaybeObject* JSObject::GetPropertyWithFailedAccessCheck( |
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); |
+ } |
} |
break; |
} |
@@ -573,6 +579,11 @@ PropertyAttributes JSObject::GetPropertyAttributeWithFailedAccessCheck( |
if (info->all_can_read()) { |
return result->GetAttributes(); |
} |
+ } else if (obj->IsAccessorPair()) { |
+ AccessorPair* pair = AccessorPair::cast(obj); |
+ if (pair->all_can_read()) { |
+ return result->GetAttributes(); |
+ } |
} |
break; |
} |
@@ -3401,6 +3412,15 @@ MaybeObject* JSObject::SetPropertyWithFailedAccessCheck( |
result->holder(), |
strict_mode); |
} |
+ } else if (obj->IsAccessorPair()) { |
+ AccessorPair* pair = AccessorPair::cast(obj); |
+ if (pair->all_can_read()) { |
+ return SetPropertyWithCallback(result->GetCallbackObject(), |
+ name, |
+ value, |
+ result->holder(), |
+ strict_mode); |
+ } |
} |
break; |
} |
@@ -5953,7 +5973,8 @@ void JSObject::DefineElementAccessor(Handle<JSObject> object, |
uint32_t index, |
Handle<Object> getter, |
Handle<Object> setter, |
- PropertyAttributes attributes) { |
+ PropertyAttributes attributes, |
+ v8::AccessControl access_control) { |
switch (object->GetElementsKind()) { |
case FAST_SMI_ELEMENTS: |
case FAST_ELEMENTS: |
@@ -6011,6 +6032,7 @@ void JSObject::DefineElementAccessor(Handle<JSObject> object, |
Isolate* isolate = object->GetIsolate(); |
Handle<AccessorPair> accessors = isolate->factory()->NewAccessorPair(); |
accessors->SetComponents(*getter, *setter); |
+ accessors->set_access_flags(access_control); |
CALL_HEAP_FUNCTION_VOID( |
isolate, object->SetElementCallback(index, *accessors, attributes)); |
@@ -6042,11 +6064,13 @@ void JSObject::DefinePropertyAccessor(Handle<JSObject> object, |
Handle<Name> name, |
Handle<Object> getter, |
Handle<Object> setter, |
- PropertyAttributes attributes) { |
+ PropertyAttributes attributes, |
+ v8::AccessControl access_control) { |
// We could assert that the property is configurable here, but we would need |
// to do a lookup, which seems to be a bit of overkill. |
bool only_attribute_changes = getter->IsNull() && setter->IsNull(); |
if (object->HasFastProperties() && !only_attribute_changes && |
+ access_control == v8::DEFAULT && |
(object->map()->NumberOfOwnDescriptors() < |
DescriptorArray::kMaxNumberOfDescriptors)) { |
bool getterOk = getter->IsNull() || |
@@ -6058,6 +6082,7 @@ void JSObject::DefinePropertyAccessor(Handle<JSObject> object, |
Handle<AccessorPair> accessors = CreateAccessorPairFor(object, name); |
accessors->SetComponents(*getter, *setter); |
+ accessors->set_access_flags(access_control); |
CALL_HEAP_FUNCTION_VOID( |
object->GetIsolate(), |
@@ -6079,12 +6104,13 @@ bool JSObject::CanSetCallback(Name* name) { |
LookupCallbackProperty(name, &callback_result); |
if (callback_result.IsFound()) { |
Object* obj = callback_result.GetCallbackObject(); |
- if (obj->IsAccessorInfo() && |
- AccessorInfo::cast(obj)->prohibits_overwriting()) { |
- return false; |
+ if (obj->IsAccessorInfo()) { |
+ return !AccessorInfo::cast(obj)->prohibits_overwriting(); |
+ } |
+ if (obj->IsAccessorPair()) { |
+ return !AccessorPair::cast(obj)->prohibits_overwriting(); |
} |
} |
- |
return true; |
} |
@@ -6162,7 +6188,8 @@ void JSObject::DefineAccessor(Handle<JSObject> object, |
Handle<Name> name, |
Handle<Object> getter, |
Handle<Object> setter, |
- PropertyAttributes attributes) { |
+ PropertyAttributes attributes, |
+ v8::AccessControl access_control) { |
Isolate* isolate = object->GetIsolate(); |
// Check access rights if needed. |
if (object->IsAccessCheckNeeded() && |
@@ -6175,8 +6202,12 @@ void JSObject::DefineAccessor(Handle<JSObject> object, |
Handle<Object> proto(object->GetPrototype(), isolate); |
if (proto->IsNull()) return; |
ASSERT(proto->IsJSGlobalObject()); |
- DefineAccessor( |
- Handle<JSObject>::cast(proto), name, getter, setter, attributes); |
+ DefineAccessor(Handle<JSObject>::cast(proto), |
+ name, |
+ getter, |
+ setter, |
+ attributes, |
+ access_control); |
return; |
} |
@@ -6212,9 +6243,11 @@ void JSObject::DefineAccessor(Handle<JSObject> object, |
} |
if (is_element) { |
- DefineElementAccessor(object, index, getter, setter, attributes); |
+ DefineElementAccessor( |
+ object, index, getter, setter, attributes, access_control); |
} else { |
- DefinePropertyAccessor(object, name, getter, setter, attributes); |
+ DefinePropertyAccessor( |
+ object, name, getter, setter, attributes, access_control); |
} |
if (is_observed) { |