// Copyright 2018 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.

struct Arguments {
  const frame: FrameWithArguments;
  const base: RawPtr;
  const length: intptr;
}

extern operator '[]' macro GetArgumentValue(Arguments, intptr): Object;

extern macro GetFrameArguments(FrameWithArguments, intptr): Arguments;

namespace arguments {

  struct ArgumentsInfo {
    frame: Frame;
    argument_count: bint;
    formal_parameter_count: bint;
  }

  // Calculates and returns the frame pointer, argument count and formal
  // parameter count to be used to access a function's parameters, taking
  // argument adapter frames into account.
  //
  // TODO(danno):
  // This macro is should only be used in builtins that can be called from
  // interpreted or JITted code, not from CSA/Torque builtins (the number of
  // returned formal parameters would be wrong).
  // It is difficult to actually check/assert this, since interpreted or JITted
  // frames are StandardFrames, but so are hand-written builtins. Doing that
  // more refined check would be prohibitively expensive.
  @export
  macro GetArgumentsFrameAndCount(implicit context: Context)(f: JSFunction):
      ArgumentsInfo {
    const frame: Frame = LoadParentFramePointer();
    assert(frame.function == f);

    const shared: SharedFunctionInfo = f.shared_function_info;
    const formalParameterCount: bint =
        Convert<bint>(Convert<int32>(shared.formal_parameter_count));
    const argumentCount: bint = formalParameterCount;

    const adaptor: ArgumentsAdaptorFrame =
        Cast<ArgumentsAdaptorFrame>(frame.caller)
        otherwise return ArgumentsInfo{
      frame,
      argument_count: argumentCount,
      formal_parameter_count: formalParameterCount
    };

    return ArgumentsInfo{
      frame: adaptor,
      argument_count: Convert<bint>(adaptor.length),
      formal_parameter_count: formalParameterCount
    };
  }
}
