Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index 38d8647b525c8cb56549af9758848ed887c194dc..03afbd43e01eb2e072906fedcfec65e31c5c237a 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()) { |
|
Sven Panne
2013/08/21 10:46:25
Just curious: Can we reach this code path with For
dcarney
2013/08/21 10:59:33
there's no access overrides for foreign callbacks,
|
| + 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()) { |
|
Sven Panne
2013/08/21 10:46:25
Same here.
|
| + AccessorPair* pair = AccessorPair::cast(obj); |
| + if (pair->all_can_read()) { |
| + return result->GetAttributes(); |
| + } |
| } |
| break; |
| } |
| @@ -3361,6 +3372,15 @@ MaybeObject* JSObject::SetPropertyWithFailedAccessCheck( |
| result->holder(), |
| strict_mode); |
| } |
| + } else if (obj->IsAccessorPair()) { |
|
Sven Panne
2013/08/21 10:46:25
... and here.
|
| + AccessorPair* pair = AccessorPair::cast(obj); |
| + if (pair->all_can_read()) { |
| + return SetPropertyWithCallback(result->GetCallbackObject(), |
| + name, |
| + value, |
| + result->holder(), |
| + strict_mode); |
| + } |
| } |
| break; |
| } |
| @@ -6012,11 +6032,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() || |
| @@ -6028,6 +6050,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(), |
| @@ -6132,7 +6155,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() && |
| @@ -6145,8 +6169,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; |
| } |
| @@ -6182,9 +6210,11 @@ void JSObject::DefineAccessor(Handle<JSObject> object, |
| } |
| if (is_element) { |
| + ASSERT_EQ(v8::DEFAULT, access_control); |
|
Sven Panne
2013/08/21 10:46:25
Perhaps we should document this restriction in v8.
dcarney
2013/08/21 10:59:33
it's not a restriction, i just want to get this wo
|
| DefineElementAccessor(object, index, getter, setter, attributes); |
| } else { |
| - DefinePropertyAccessor(object, name, getter, setter, attributes); |
| + DefinePropertyAccessor( |
| + object, name, getter, setter, attributes, access_control); |
| } |
| if (is_observed) { |