diff options
| author | Ben Murdoch <benm@google.com> | 2011-12-02 17:19:32 +0000 |
|---|---|---|
| committer | Ben Murdoch <benm@google.com> | 2011-12-02 17:27:49 +0000 |
| commit | 3fb3ca8c7ca439d408449a395897395c0faae8d1 (patch) | |
| tree | 5cb33db083ae7ebe431e2a460fb3806c54531f9c /src/proxy.js | |
| parent | 257744e915dfc84d6d07a6b2accf8402d9ffc708 (diff) | |
| download | android_external_v8-3fb3ca8c7ca439d408449a395897395c0faae8d1.tar.gz android_external_v8-3fb3ca8c7ca439d408449a395897395c0faae8d1.tar.bz2 android_external_v8-3fb3ca8c7ca439d408449a395897395c0faae8d1.zip | |
Upgrade to V8 3.4
Merge 3.4.14.35
Simple merge required updates to makefiles only.
Bug: 568872
Change-Id: I403a38452c547e06fcfa951c12eca12a1bc40978
Diffstat (limited to 'src/proxy.js')
| -rw-r--r-- | src/proxy.js | 74 |
1 files changed, 70 insertions, 4 deletions
diff --git a/src/proxy.js b/src/proxy.js index c11852b0..27524bd9 100644 --- a/src/proxy.js +++ b/src/proxy.js @@ -60,7 +60,9 @@ $Proxy.createFunction = function(handler, callTrap, constructTrap) { } $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,75 @@ $Proxy.create = function(handler, proto) { 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) +} + +function DerivedKeysTrap() { + var names = this.getOwnPropertyNames() + var enumerableNames = [] + for (var i = 0, count = 0; i < names.length; ++i) { + var name = names[i] + if (this.getOwnPropertyDescriptor(TO_STRING_INLINE(name)).enumerable) { + enumerableNames[count++] = names[i] + } + } + return enumerableNames +} |
