Fix error introduced in r9431, which leads to redundant lookup when setting property with handler.
BUG= TEST= Review URL: http://codereview.chromium.org/8386030 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9862 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
5c40d7a55d
commit
307b589e61
@ -2148,47 +2148,35 @@ MaybeObject* JSObject::SetPropertyWithCallbackSetterInPrototypes(
|
||||
bool* found,
|
||||
StrictModeFlag strict_mode) {
|
||||
Heap* heap = GetHeap();
|
||||
LookupResult result(heap->isolate());
|
||||
LookupCallbackSetterInPrototypes(name, &result);
|
||||
if (result.IsFound()) {
|
||||
// We could not find a local property so let's check whether there is an
|
||||
// accessor that wants to handle the property.
|
||||
LookupResult accessor_result(heap->isolate());
|
||||
LookupCallbackSetterInPrototypes(name, &accessor_result);
|
||||
if (accessor_result.IsFound()) {
|
||||
*found = true;
|
||||
if (result.type() == CALLBACKS) {
|
||||
return SetPropertyWithCallback(result.GetCallbackObject(),
|
||||
if (accessor_result.type() == CALLBACKS) {
|
||||
return SetPropertyWithCallback(accessor_result.GetCallbackObject(),
|
||||
name,
|
||||
value,
|
||||
result.holder(),
|
||||
accessor_result.holder(),
|
||||
strict_mode);
|
||||
} else if (result.type() == HANDLER) {
|
||||
// We could not find a local property so let's check whether there is an
|
||||
// accessor that wants to handle the property.
|
||||
LookupResult accessor_result(heap->isolate());
|
||||
LookupCallbackSetterInPrototypes(name, &accessor_result);
|
||||
if (accessor_result.IsFound()) {
|
||||
if (accessor_result.type() == CALLBACKS) {
|
||||
return SetPropertyWithCallback(accessor_result.GetCallbackObject(),
|
||||
name,
|
||||
value,
|
||||
accessor_result.holder(),
|
||||
strict_mode);
|
||||
} else if (accessor_result.type() == HANDLER) {
|
||||
// There is a proxy in the prototype chain. Invoke its
|
||||
// getPropertyDescriptor trap.
|
||||
bool found = false;
|
||||
// SetPropertyWithHandlerIfDefiningSetter can cause GC,
|
||||
// make sure to use the handlified references after calling
|
||||
// the function.
|
||||
Handle<JSObject> self(this);
|
||||
Handle<String> hname(name);
|
||||
Handle<Object> hvalue(value);
|
||||
MaybeObject* result =
|
||||
accessor_result.proxy()->SetPropertyWithHandlerIfDefiningSetter(
|
||||
name, value, attributes, strict_mode, &found);
|
||||
if (found) return result;
|
||||
// The proxy does not define the property as an accessor.
|
||||
// Consequently, it has no effect on setting the receiver.
|
||||
return self->AddProperty(*hname, *hvalue, attributes, strict_mode);
|
||||
}
|
||||
}
|
||||
} else if (accessor_result.type() == HANDLER) {
|
||||
// There is a proxy in the prototype chain. Invoke its
|
||||
// getPropertyDescriptor trap.
|
||||
bool found = false;
|
||||
// SetPropertyWithHandlerIfDefiningSetter can cause GC,
|
||||
// make sure to use the handlified references after calling
|
||||
// the function.
|
||||
Handle<JSObject> self(this);
|
||||
Handle<String> hname(name);
|
||||
Handle<Object> hvalue(value);
|
||||
MaybeObject* result =
|
||||
accessor_result.proxy()->SetPropertyWithHandlerIfDefiningSetter(
|
||||
name, value, attributes, strict_mode, &found);
|
||||
if (found) return result;
|
||||
// The proxy does not define the property as an accessor.
|
||||
// Consequently, it has no effect on setting the receiver.
|
||||
return self->AddProperty(*hname, *hvalue, attributes, strict_mode);
|
||||
}
|
||||
}
|
||||
*found = false;
|
||||
|
Loading…
Reference in New Issue
Block a user