summaryrefslogtreecommitdiffstats
path: root/src/proxy.js
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2011-12-02 17:19:32 +0000
committerBen Murdoch <benm@google.com>2011-12-02 17:27:49 +0000
commit3fb3ca8c7ca439d408449a395897395c0faae8d1 (patch)
tree5cb33db083ae7ebe431e2a460fb3806c54531f9c /src/proxy.js
parent257744e915dfc84d6d07a6b2accf8402d9ffc708 (diff)
downloadandroid_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.js74
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
+}