162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2017 the V8 project authors. All rights reserved.
262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file.
462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/code-stub-assembler.h"
662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace v8 {
862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace internal {
962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef compiler::Node Node;
1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef compiler::CodeAssemblerState CodeAssemblerState;
1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtypedef compiler::CodeAssemblerLabel CodeAssemblerLabel;
1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass ArgumentsBuiltinsAssembler : public CodeStubAssembler {
1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  explicit ArgumentsBuiltinsAssembler(CodeAssemblerState* state)
1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : CodeStubAssembler(state) {}
1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastNewStrictArguments(Node* context, Node* function);
2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastNewSloppyArguments(Node* context, Node* function);
2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* EmitFastNewRestParameter(Node* context, Node* function);
2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private:
2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Calculates and returns the the frame pointer, argument count and formal
2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // parameter count to be used to access a function's parameters, taking
2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // argument adapter frames into account. The tuple is of the form:
2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // <frame_ptr, # parameters actually passed, formal parameter count>
2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::tuple<Node*, Node*, Node*> GetArgumentsFrameAndCount(Node* function,
2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                            ParameterMode mode);
3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Allocates an an arguments (either rest, strict or sloppy) together with the
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // FixedArray elements for the arguments and a parameter map (for sloppy
3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // arguments only). A tuple is returned with pointers to the arguments object,
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // the elements and parameter map in the form:
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // <argument object, arguments FixedArray, parameter map or nullptr>
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::tuple<Node*, Node*, Node*> AllocateArgumentsObject(
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Node* map, Node* arguments, Node* mapped_arguments,
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      ParameterMode param_mode, int base_size);
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // For Rest parameters and Strict arguments, the copying of parameters from
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // the stack into the arguments object is straight-forward and shares much of
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // the same underlying logic, which is encapsulated by this function. It
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // allocates an arguments-like object of size |base_size| with the map |map|,
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // and then copies |rest_count| arguments from the stack frame pointed to by
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // |frame_ptr| starting from |first_arg|. |arg_count| == |first_arg| +
4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // |rest_count|.
4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Node* ConstructParametersObjectFromArgs(Node* map, Node* frame_ptr,
4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                          Node* arg_count, Node* first_arg,
4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                          Node* rest_count,
5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                          ParameterMode param_mode,
5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                          int base_size);
5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace internal
5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace v8
56