| Index: src/runtime.cc | 
| diff --git a/src/runtime.cc b/src/runtime.cc | 
| index 8e1a3cb94e33ce19ec525e848c6039b73c40577d..239ba082b25c2ae7bd30783dfd36fbdb371b35ff 100644 | 
| --- a/src/runtime.cc | 
| +++ b/src/runtime.cc | 
| @@ -715,6 +715,19 @@ static bool CheckAccess(JSObject* obj, | 
| } | 
|  | 
|  | 
| +// TODO(1095): we should traverse hidden prototype hierachy as well. | 
| +static bool CheckElementAccess(JSObject* obj, | 
| +                               uint32_t index, | 
| +                               v8::AccessType access_type) { | 
| +  if (obj->IsAccessCheckNeeded() && | 
| +      !Top::MayIndexedAccess(obj, index, access_type)) { | 
| +    return false; | 
| +  } | 
| + | 
| +  return true; | 
| +} | 
| + | 
| + | 
| // Enumerator used as indices into the array returned from GetOwnProperty | 
| enum PropertyDescriptorIndices { | 
| IS_ACCESSOR_INDEX, | 
| @@ -757,7 +770,7 @@ static MaybeObject* Runtime_GetOwnProperty(Arguments args) { | 
| // subsequent cases. | 
| Handle<JSValue> js_value = Handle<JSValue>::cast(obj); | 
| Handle<String> str(String::cast(js_value->value())); | 
| -        Handle<String> substr = SubString(str, index, index+1, NOT_TENURED); | 
| +        Handle<String> substr = SubString(str, index, index + 1, NOT_TENURED); | 
|  | 
| elms->set(IS_ACCESSOR_INDEX, Heap::false_value()); | 
| elms->set(VALUE_INDEX, *substr); | 
| @@ -770,8 +783,7 @@ static MaybeObject* Runtime_GetOwnProperty(Arguments args) { | 
| case JSObject::INTERCEPTED_ELEMENT: | 
| case JSObject::FAST_ELEMENT: { | 
| elms->set(IS_ACCESSOR_INDEX, Heap::false_value()); | 
| -        Handle<Object> element = GetElement(Handle<Object>(obj), index); | 
| -        elms->set(VALUE_INDEX, *element); | 
| +        elms->set(VALUE_INDEX, *GetElement(obj, index)); | 
| elms->set(WRITABLE_INDEX, Heap::true_value()); | 
| elms->set(ENUMERABLE_INDEX,  Heap::true_value()); | 
| elms->set(CONFIGURABLE_INDEX, Heap::true_value()); | 
| @@ -779,13 +791,14 @@ static MaybeObject* Runtime_GetOwnProperty(Arguments args) { | 
| } | 
|  | 
| case JSObject::DICTIONARY_ELEMENT: { | 
| +        Handle<JSObject> holder = obj; | 
| if (obj->IsJSGlobalProxy()) { | 
| Object* proto = obj->GetPrototype(); | 
| if (proto->IsNull()) return Heap::undefined_value(); | 
| ASSERT(proto->IsJSGlobalObject()); | 
| -          obj = Handle<JSObject>(JSObject::cast(proto)); | 
| +          holder = Handle<JSObject>(JSObject::cast(proto)); | 
| } | 
| -        NumberDictionary* dictionary = obj->element_dictionary(); | 
| +        NumberDictionary* dictionary = holder->element_dictionary(); | 
| int entry = dictionary->FindEntry(index); | 
| ASSERT(entry != NumberDictionary::kNotFound); | 
| PropertyDetails details = dictionary->DetailsAt(entry); | 
| @@ -795,14 +808,18 @@ static MaybeObject* Runtime_GetOwnProperty(Arguments args) { | 
| FixedArray* callbacks = | 
| FixedArray::cast(dictionary->ValueAt(entry)); | 
| elms->set(IS_ACCESSOR_INDEX, Heap::true_value()); | 
| -            elms->set(GETTER_INDEX, callbacks->get(0)); | 
| -            elms->set(SETTER_INDEX, callbacks->get(1)); | 
| +            if (CheckElementAccess(*obj, index, v8::ACCESS_GET)) { | 
| +              elms->set(GETTER_INDEX, callbacks->get(0)); | 
| +            } | 
| +            if (CheckElementAccess(*obj, index, v8::ACCESS_SET)) { | 
| +              elms->set(SETTER_INDEX, callbacks->get(1)); | 
| +            } | 
| break; | 
| } | 
| case NORMAL: | 
| // This is a data property. | 
| elms->set(IS_ACCESSOR_INDEX, Heap::false_value()); | 
| -            elms->set(VALUE_INDEX, dictionary->ValueAt(entry)); | 
| +            elms->set(VALUE_INDEX, *GetElement(obj, index)); | 
| elms->set(WRITABLE_INDEX, Heap::ToBoolean(!details.IsReadOnly())); | 
| break; | 
| default: | 
|  |