| Index: src/proxy.js
|
| ===================================================================
|
| --- src/proxy.js (revision 8618)
|
| +++ src/proxy.js (working copy)
|
| @@ -60,7 +60,9 @@
|
| }
|
|
|
| $Proxy.create = function(handler, proto) {
|
| - if (!IS_SPEC_OBJECT(proto)) proto = $Object.prototype
|
| + if (!IS_SPEC_OBJECT(handler))
|
| + throw MakeTypeError("handler_non_object", ["create"])
|
| + if (!IS_SPEC_OBJECT(proto)) proto = null // Mozilla does this...
|
| return %CreateJSProxy(handler, proto)
|
| }
|
|
|
| @@ -73,11 +75,63 @@
|
|
|
| function DerivedGetTrap(receiver, name) {
|
| var desc = this.getPropertyDescriptor(name)
|
| - if (IS_UNDEFINED(desc)) { return desc; }
|
| + if (IS_UNDEFINED(desc)) { return desc }
|
| if ('value' in desc) {
|
| return desc.value
|
| } else {
|
| - if (IS_UNDEFINED(desc.get)) { return desc.get; }
|
| - return desc.get.call(receiver) // The proposal says so...
|
| + if (IS_UNDEFINED(desc.get)) { return desc.get }
|
| + // The proposal says: desc.get.call(receiver)
|
| + return %_CallFunction(receiver, desc.get)
|
| }
|
| }
|
| +
|
| +function DerivedSetTrap(receiver, name, val) {
|
| + var desc = this.getOwnPropertyDescriptor(name)
|
| + if (desc) {
|
| + if ('writable' in desc) {
|
| + if (desc.writable) {
|
| + desc.value = val
|
| + this.defineProperty(name, desc)
|
| + return true
|
| + } else {
|
| + return false
|
| + }
|
| + } else { // accessor
|
| + if (desc.set) {
|
| + // The proposal says: desc.set.call(receiver, val)
|
| + %_CallFunction(receiver, val, desc.set)
|
| + return true
|
| + } else {
|
| + return false
|
| + }
|
| + }
|
| + }
|
| + desc = this.getPropertyDescriptor(name)
|
| + if (desc) {
|
| + if ('writable' in desc) {
|
| + if (desc.writable) {
|
| + // fall through
|
| + } else {
|
| + return false
|
| + }
|
| + } else { // accessor
|
| + if (desc.set) {
|
| + // The proposal says: desc.set.call(receiver, val)
|
| + %_CallFunction(receiver, val, desc.set)
|
| + return true
|
| + } else {
|
| + return false
|
| + }
|
| + }
|
| + }
|
| + this.defineProperty(name, {
|
| + value: val,
|
| + writable: true,
|
| + enumerable: true,
|
| + configurable: true});
|
| + return true;
|
| +}
|
| +
|
| +function DerivedHasTrap(name) {
|
| + return !!this.getPropertyDescriptor(name)
|
| +}
|
|
|