| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index faf1f9e4d067cfd9f001cb79abc98c6a26e42909..959e3d38648277f47e94c492297adc411f6fe800 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;
|
| }
|
| @@ -3395,6 +3406,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;
|
| }
|
| @@ -5892,7 +5912,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:
|
| @@ -5950,6 +5971,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));
|
| @@ -5981,11 +6003,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() ||
|
| @@ -5997,6 +6021,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(),
|
| @@ -6018,12 +6043,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;
|
| }
|
|
|
| @@ -6101,7 +6127,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() &&
|
| @@ -6114,8 +6141,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;
|
| }
|
|
|
| @@ -6151,9 +6182,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) {
|
|
|