1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "test/cctest/compiler/function-tester.h"
6
7namespace v8 {
8namespace internal {
9namespace compiler {
10
11TEST(ArgumentsMapped) {
12  FunctionTester T("(function(a) { return arguments; })");
13
14  Handle<Object> arguments;
15  T.Call(T.Val(19), T.Val(23), T.Val(42), T.Val(65)).ToHandle(&arguments);
16  CHECK(arguments->IsJSObject() && !arguments->IsJSArray());
17  CHECK(JSObject::cast(*arguments)->HasSloppyArgumentsElements());
18  Handle<String> l = T.isolate->factory()->length_string();
19  Handle<Object> length = Object::GetProperty(arguments, l).ToHandleChecked();
20  CHECK_EQ(4, length->Number());
21}
22
23
24TEST(ArgumentsUnmapped) {
25  FunctionTester T("(function(a) { 'use strict'; return arguments; })");
26
27  Handle<Object> arguments;
28  T.Call(T.Val(19), T.Val(23), T.Val(42), T.Val(65)).ToHandle(&arguments);
29  CHECK(arguments->IsJSObject() && !arguments->IsJSArray());
30  CHECK(!JSObject::cast(*arguments)->HasSloppyArgumentsElements());
31  Handle<String> l = T.isolate->factory()->length_string();
32  Handle<Object> length = Object::GetProperty(arguments, l).ToHandleChecked();
33  CHECK_EQ(4, length->Number());
34}
35
36
37TEST(ArgumentsRest) {
38  FunctionTester T("(function(a, ...args) { return args; })");
39
40  Handle<Object> arguments;
41  T.Call(T.Val(19), T.Val(23), T.Val(42), T.Val(65)).ToHandle(&arguments);
42  CHECK(arguments->IsJSObject() && arguments->IsJSArray());
43  CHECK(!JSObject::cast(*arguments)->HasSloppyArgumentsElements());
44  Handle<String> l = T.isolate->factory()->length_string();
45  Handle<Object> length = Object::GetProperty(arguments, l).ToHandleChecked();
46  CHECK_EQ(3, length->Number());
47}
48
49}  // namespace compiler
50}  // namespace internal
51}  // namespace v8
52