| // Copyright 2019 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. |
| |
| #include 'src/builtins/builtins-proxy-gen.h' |
| |
| namespace proxy { |
| |
| extern macro ProxiesCodeStubAssembler::AllocateProxyRevokeFunction( |
| implicit context: Context)(JSProxy): JSFunction; |
| |
| // Proxy.revocable(target, handler) |
| // https://tc39.github.io/ecma262/#sec-proxy.revocable |
| transitioning javascript builtin |
| ProxyRevocable(js-implicit context: NativeContext)( |
| target: JSAny, handler: JSAny): JSProxyRevocableResult { |
| try { |
| // 1. Let p be ? ProxyCreate(target, handler). |
| const targetJSReceiver = |
| Cast<JSReceiver>(target) otherwise ThrowProxyNonObject; |
| const handlerJSReceiver = |
| Cast<JSReceiver>(handler) otherwise ThrowProxyNonObject; |
| const proxy: JSProxy = AllocateProxy(targetJSReceiver, handlerJSReceiver); |
| |
| // 2. Let steps be the algorithm steps defined in Proxy Revocation |
| // Functions. |
| // 3. Let revoker be CreateBuiltinFunction(steps, « [[RevocableProxy]] »). |
| // 4. Set revoker.[[RevocableProxy]] to p. |
| const revoke: JSFunction = AllocateProxyRevokeFunction(proxy); |
| |
| // 5. Let result be ObjectCreate(%ObjectPrototype%). |
| // 6. Perform CreateDataProperty(result, "proxy", p). |
| // 7. Perform CreateDataProperty(result, "revoke", revoker). |
| // 8. Return result. |
| return NewJSProxyRevocableResult(proxy, revoke); |
| } label ThrowProxyNonObject deferred { |
| ThrowTypeError(MessageTemplate::kProxyNonObject, 'Proxy.revocable'); |
| } |
| } |
| } |