// 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(
      context: Context, _receiver: Object, target: Object,
      handler: Object): JSProxyRevocableResult {
    try {
      const targetJSReceiver =
          Cast<JSReceiver>(target) otherwise ThrowProxyNonObject;
      if (IsRevokedProxy(targetJSReceiver)) {
        goto ThrowProxyHandlerOrTargetRevoked;
      }

      const handlerJSReceiver =
          Cast<JSReceiver>(handler) otherwise ThrowProxyNonObject;
      if (IsRevokedProxy(handlerJSReceiver)) {
        goto ThrowProxyHandlerOrTargetRevoked;
      }

      // 1. Let p be ? ProxyCreate(target, handler).
      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(kProxyNonObject, 'Proxy.revocable');
    }
    label ThrowProxyHandlerOrTargetRevoked deferred {
      ThrowTypeError(kProxyHandlerOrTargetRevoked, 'Proxy.revocable');
    }
  }
}
