Index: src/objects.cc |
=================================================================== |
--- src/objects.cc (revision 6703) |
+++ src/objects.cc (working copy) |
@@ -1705,8 +1705,9 @@ |
} |
-bool JSObject::SetElementWithCallbackSetterInPrototypes(uint32_t index, |
- Object* value) { |
+MaybeObject* JSObject::SetElementWithCallbackSetterInPrototypes(uint32_t index, |
+ Object* value, |
+ bool* found) { |
for (Object* pt = GetPrototype(); |
pt != Heap::null_value(); |
pt = pt->GetPrototype()) { |
@@ -1716,15 +1717,16 @@ |
NumberDictionary* dictionary = JSObject::cast(pt)->element_dictionary(); |
int entry = dictionary->FindEntry(index); |
if (entry != NumberDictionary::kNotFound) { |
- Object* element = dictionary->ValueAt(entry); |
PropertyDetails details = dictionary->DetailsAt(entry); |
if (details.type() == CALLBACKS) { |
- SetElementWithCallback(element, index, value, JSObject::cast(pt)); |
- return true; |
+ *found = true; |
+ return SetElementWithCallback( |
+ dictionary->ValueAt(entry), index, value, JSObject::cast(pt)); |
} |
} |
} |
- return false; |
+ *found = false; |
+ return Heap::the_hole_value(); |
} |
@@ -2774,6 +2776,13 @@ |
MaybeObject* JSObject::PreventExtensions() { |
+ if (IsJSGlobalProxy()) { |
+ Object* proto = GetPrototype(); |
+ if (proto->IsNull()) return this; |
+ ASSERT(proto->IsJSGlobalObject()); |
+ return JSObject::cast(proto)->PreventExtensions(); |
+ } |
+ |
// If there are fast elements we normalize. |
if (HasFastElements()) { |
Object* ok; |
@@ -6957,9 +6966,11 @@ |
uint32_t elms_length = static_cast<uint32_t>(elms->length()); |
if (check_prototype && |
- (index >= elms_length || elms->get(index)->IsTheHole()) && |
- SetElementWithCallbackSetterInPrototypes(index, value)) { |
- return value; |
+ (index >= elms_length || elms->get(index)->IsTheHole())) { |
+ bool found; |
+ MaybeObject* result = |
+ SetElementWithCallbackSetterInPrototypes(index, value, &found); |
+ if (found) return result; |
} |
@@ -7091,9 +7102,11 @@ |
} |
} else { |
// Index not already used. Look for an accessor in the prototype chain. |
- if (check_prototype && |
- SetElementWithCallbackSetterInPrototypes(index, value)) { |
- return value; |
+ if (check_prototype) { |
+ bool found; |
+ MaybeObject* result = |
+ SetElementWithCallbackSetterInPrototypes(index, value, &found); |
+ if (found) return result; |
} |
// When we set the is_extensible flag to false we always force |
// the element into dictionary mode (and force them to stay there). |