summaryrefslogtreecommitdiff
path: root/deps/v8/src/js/proxy.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/js/proxy.js')
-rw-r--r--deps/v8/src/js/proxy.js198
1 files changed, 28 insertions, 170 deletions
diff --git a/deps/v8/src/js/proxy.js b/deps/v8/src/js/proxy.js
index fc38680a13..842bac0252 100644
--- a/deps/v8/src/js/proxy.js
+++ b/deps/v8/src/js/proxy.js
@@ -1,4 +1,4 @@
-// Copyright 2011 the V8 project authors. All rights reserved.
+// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -10,201 +10,59 @@
// ----------------------------------------------------------------------------
// Imports
-
-var GlobalFunction = global.Function;
-var GlobalObject = global.Object;
+//
+var GlobalProxy = global.Proxy;
var MakeTypeError;
-var ToNameArray;
utils.Import(function(from) {
MakeTypeError = from.MakeTypeError;
- ToNameArray = from.ToNameArray;
});
//----------------------------------------------------------------------------
-function ProxyCreate(handler, proto) {
- if (!IS_SPEC_OBJECT(handler))
- throw MakeTypeError(kProxyHandlerNonObject, "create")
- if (IS_UNDEFINED(proto))
- proto = null
- else if (!(IS_SPEC_OBJECT(proto) || IS_NULL(proto)))
- throw MakeTypeError(kProxyProtoNonObject)
- return %CreateJSProxy(handler, proto)
-}
-
-function ProxyCreateFunction(handler, callTrap, constructTrap) {
- if (!IS_SPEC_OBJECT(handler))
- throw MakeTypeError(kProxyHandlerNonObject, "createFunction")
- if (!IS_CALLABLE(callTrap))
- throw MakeTypeError(kProxyTrapFunctionExpected, "call")
- if (IS_UNDEFINED(constructTrap)) {
- constructTrap = DerivedConstructTrap(callTrap)
- } else if (IS_CALLABLE(constructTrap)) {
- // Make sure the trap receives 'undefined' as this.
- var construct = constructTrap
- constructTrap = function() {
- return %Apply(construct, UNDEFINED, arguments, 0, %_ArgumentsLength());
- }
- } else {
- throw MakeTypeError(kProxyTrapFunctionExpected, "construct")
- }
- return %CreateJSFunctionProxy(
- handler, callTrap, constructTrap, GlobalFunction.prototype)
+function ProxyCreateRevocable(target, handler) {
+ var p = new GlobalProxy(target, handler);
+ return {proxy: p, revoke: () => %JSProxyRevoke(p)};
}
// -------------------------------------------------------------------
// Proxy Builtins
-function DerivedConstructTrap(callTrap) {
- return function() {
- var proto = this.prototype
- if (!IS_SPEC_OBJECT(proto)) proto = GlobalObject.prototype
- var obj = { __proto__: proto };
- var result = %Apply(callTrap, obj, arguments, 0, %_ArgumentsLength());
- return IS_SPEC_OBJECT(result) ? result : obj
- }
-}
-
-function DelegateCallAndConstruct(callTrap, constructTrap) {
- return function() {
- return %Apply(%_IsConstructCall() ? constructTrap : callTrap,
- this, arguments, 0, %_ArgumentsLength())
- }
-}
-
-function DerivedGetTrap(receiver, name) {
- var desc = this.getPropertyDescriptor(name)
- if (IS_UNDEFINED(desc)) { return desc }
- if ('value' in desc) {
- return desc.value
- } else {
- if (IS_UNDEFINED(desc.get)) { return desc.get }
- // The proposal says: desc.get.call(receiver)
- return %_Call(desc.get, receiver)
- }
-}
-
-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)
- %_Call(desc.set, receiver, val)
- 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)
- %_Call(desc.set, receiver, val)
- 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 DerivedHasOwnTrap(name) {
- return !!this.getOwnPropertyDescriptor(name)
-}
-
-function DerivedKeysTrap() {
- var names = this.getOwnPropertyNames()
- var enumerableNames = []
- for (var i = 0, count = 0; i < names.length; ++i) {
- var name = names[i]
- if (IS_SYMBOL(name)) continue
- var desc = this.getOwnPropertyDescriptor(TO_STRING(name))
- if (!IS_UNDEFINED(desc) && desc.enumerable) {
- enumerableNames[count++] = names[i]
- }
+// Implements part of ES6 9.5.11 Proxy.[[Enumerate]]:
+// Call the trap, which should return an iterator, exhaust the iterator,
+// and return an array containing the values.
+function ProxyEnumerate(trap, handler, target) {
+ // 7. Let trapResult be ? Call(trap, handler, «target»).
+ var trap_result = %_Call(trap, handler, target);
+ // 8. If Type(trapResult) is not Object, throw a TypeError exception.
+ if (!IS_RECEIVER(trap_result)) {
+ throw MakeTypeError(kProxyEnumerateNonObject);
}
- return enumerableNames
-}
-
-function DerivedEnumerateTrap() {
- var names = this.getPropertyNames()
- var enumerableNames = []
- for (var i = 0, count = 0; i < names.length; ++i) {
- var name = names[i]
- if (IS_SYMBOL(name)) continue
- var desc = this.getPropertyDescriptor(TO_STRING(name))
- if (!IS_UNDEFINED(desc)) {
- if (!desc.configurable) {
- throw MakeTypeError(kProxyPropNotConfigurable,
- this, name, "getPropertyDescriptor")
- }
- if (desc.enumerable) enumerableNames[count++] = names[i]
+ // 9. Return trapResult.
+ var result = [];
+ for (var it = trap_result.next(); !it.done; it = trap_result.next()) {
+ var key = it.value;
+ // Not yet spec'ed as of 2015-11-25, but will be spec'ed soon:
+ // If the iterator returns a non-string value, throw a TypeError.
+ if (!IS_STRING(key)) {
+ throw MakeTypeError(kProxyEnumerateNonString);
}
+ result.push(key);
}
- return enumerableNames
-}
-
-function ProxyEnumerate(proxy) {
- var handler = %GetHandler(proxy)
- if (IS_UNDEFINED(handler.enumerate)) {
- return %Apply(DerivedEnumerateTrap, handler, [], 0, 0)
- } else {
- return ToNameArray(handler.enumerate(), "enumerate", false)
- }
+ return result;
}
//-------------------------------------------------------------------
-var Proxy = new GlobalObject();
-%AddNamedProperty(global, "Proxy", Proxy, DONT_ENUM);
-
//Set up non-enumerable properties of the Proxy object.
-utils.InstallFunctions(Proxy, DONT_ENUM, [
- "create", ProxyCreate,
- "createFunction", ProxyCreateFunction
-])
+utils.InstallFunctions(GlobalProxy, DONT_ENUM, [
+ "revocable", ProxyCreateRevocable
+]);
// -------------------------------------------------------------------
// Exports
-utils.Export(function(to) {
- to.ProxyDelegateCallAndConstruct = DelegateCallAndConstruct;
- to.ProxyDerivedHasOwnTrap = DerivedHasOwnTrap;
- to.ProxyDerivedKeysTrap = DerivedKeysTrap;
-});
-
%InstallToContext([
- "derived_get_trap", DerivedGetTrap,
- "derived_has_trap", DerivedHasTrap,
- "derived_set_trap", DerivedSetTrap,
"proxy_enumerate", ProxyEnumerate,
]);