// 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(Convert(shared.formal_parameter_count)); const argumentCount: bint = formalParameterCount; const adaptor: ArgumentsAdaptorFrame = Cast(frame.caller) otherwise return ArgumentsInfo{ frame, argument_count: argumentCount, formal_parameter_count: formalParameterCount }; return ArgumentsInfo{ frame: adaptor, argument_count: Convert(adaptor.length), formal_parameter_count: formalParameterCount }; } }