Revision: 11677
Author: [email protected]
Date: Tue May 29 07:00:56 2012
Log: Proxies: Fix receiver for setters inherited from proxies.
[email protected]
BUG=v8:1543
TEST=
Review URL: https://chromiumcodereview.appspot.com/10451064
http://code.google.com/p/v8/source/detail?r=11677
Modified:
/branches/bleeding_edge/src/objects.cc
/branches/bleeding_edge/src/objects.h
/branches/bleeding_edge/test/mjsunit/harmony/proxies.js
=======================================
--- /branches/bleeding_edge/src/objects.cc Tue May 29 05:42:22 2012
+++ /branches/bleeding_edge/src/objects.cc Tue May 29 07:00:56 2012
@@ -248,13 +248,14 @@
}
-MaybeObject* JSProxy::SetElementWithHandler(uint32_t index,
+MaybeObject* JSProxy::SetElementWithHandler(JSReceiver* receiver,
+ uint32_t index,
Object* value,
StrictModeFlag strict_mode) {
String* name;
MaybeObject* maybe = GetHeap()->Uint32ToString(index);
if (!maybe->To<String>(&name)) return maybe;
- return SetPropertyWithHandler(name, value, NONE, strict_mode);
+ return SetPropertyWithHandler(receiver, name, value, NONE, strict_mode);
}
@@ -2085,7 +2086,7 @@
return maybe;
}
return JSProxy::cast(pt)->SetPropertyWithHandlerIfDefiningSetter(
- name, value, NONE, strict_mode, found);
+ this, name, value, NONE, strict_mode, found);
}
if (!JSObject::cast(pt)->HasDictionaryElements()) {
continue;
@@ -2140,7 +2141,7 @@
Handle<Object> hvalue(value);
MaybeObject* result =
accessor_result.proxy()->SetPropertyWithHandlerIfDefiningSetter(
- name, value, attributes, strict_mode, &found);
+ this, 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.
@@ -2624,7 +2625,7 @@
StrictModeFlag strict_mode) {
if (result->IsFound() && result->type() == HANDLER) {
return result->proxy()->SetPropertyWithHandler(
- key, value, attributes, strict_mode);
+ this, key, value, attributes, strict_mode);
} else {
return JSObject::cast(this)->SetPropertyForResult(
result, key, value, attributes, strict_mode);
@@ -2648,13 +2649,14 @@
MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyWithHandler(
+ JSReceiver* receiver_raw,
String* name_raw,
Object* value_raw,
PropertyAttributes attributes,
StrictModeFlag strict_mode) {
Isolate* isolate = GetIsolate();
HandleScope scope(isolate);
- Handle<Object> receiver(this);
+ Handle<JSReceiver> receiver(receiver_raw);
Handle<Object> name(name_raw);
Handle<Object> value(value_raw);
@@ -2667,6 +2669,7 @@
MUST_USE_RESULT MaybeObject*
JSProxy::SetPropertyWithHandlerIfDefiningSetter(
+ JSReceiver* receiver_raw,
String* name_raw,
Object* value_raw,
PropertyAttributes attributes,
@@ -2674,6 +2677,7 @@
bool* found) {
*found = true; // except where defined otherwise...
Isolate* isolate = GetHeap()->isolate();
+ Handle<JSReceiver> receiver(receiver_raw);
Handle<JSProxy> proxy(this);
Handle<Object> handler(this->handler()); // Trap might morph proxy.
Handle<String> name(name_raw);
@@ -2715,7 +2719,7 @@
if (!setter->IsUndefined()) {
// We have a setter -- invoke it.
// TODO(rossberg): nicer would be to cast to some JSCallable here...
- return proxy->SetPropertyWithDefinedSetter(
+ return receiver->SetPropertyWithDefinedSetter(
JSReceiver::cast(*setter), *value);
} else {
Handle<String> get_name =
isolate->factory()->LookupAsciiSymbol("get_");
@@ -9657,7 +9661,7 @@
bool check_proto) {
if (IsJSProxy()) {
return JSProxy::cast(this)->SetElementWithHandler(
- index, value, strict_mode);
+ this, index, value, strict_mode);
} else {
return JSObject::cast(this)->SetElement(
index, value, attributes, strict_mode, check_proto);
=======================================
--- /branches/bleeding_edge/src/objects.h Fri May 25 08:26:52 2012
+++ /branches/bleeding_edge/src/objects.h Tue May 29 07:00:56 2012
@@ -7708,11 +7708,13 @@
uint32_t index);
MUST_USE_RESULT MaybeObject* SetPropertyWithHandler(
+ JSReceiver* receiver,
String* name,
Object* value,
PropertyAttributes attributes,
StrictModeFlag strict_mode);
MUST_USE_RESULT MaybeObject* SetElementWithHandler(
+ JSReceiver* receiver,
uint32_t index,
Object* value,
StrictModeFlag strict_mode);
@@ -7720,6 +7722,7 @@
// If the handler defines an accessor property, invoke its setter
// (or throw if only a getter exists) and set *found to true. Otherwise
false.
MUST_USE_RESULT MaybeObject* SetPropertyWithHandlerIfDefiningSetter(
+ JSReceiver* receiver,
String* name,
Object* value,
PropertyAttributes attributes,
=======================================
--- /branches/bleeding_edge/test/mjsunit/harmony/proxies.js Tue May 29
06:57:55 2012
+++ /branches/bleeding_edge/test/mjsunit/harmony/proxies.js Tue May 29
07:00:56 2012
@@ -572,6 +572,7 @@
}))
+var rec
var key
var val
@@ -611,6 +612,7 @@
assertEquals(46, o.p_setter = 46)
assertEquals("p_setter", key)
+ assertSame(o, rec)
assertEquals(46, val) // written to parent
assertFalse(Object.prototype.hasOwnProperty.call(o, "p_setter"))
@@ -641,8 +643,14 @@
switch (k) {
case "p_writable": return {writable: true, configurable: true}
case "p_nonwritable": return {writable: false, configurable: true}
- case "p_setter":return {set: function(x) { val = x }, configurable:
true}
- case "p_nosetter": return {get: function() { return 1 },
configurable: true}
+ case "p_setter":return {
+ set: function(x) { rec = this; val = x },
+ configurable: true
+ }
+ case "p_nosetter": return {
+ get: function() { return 1 },
+ configurable: true
+ }
case "p_nonconf":return {}
case "p_throw": throw "myexn"
case "p_setterthrow": return {set: function(x) { throw "myexn" }}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev