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
7 namespace v8 {
8 namespace internal {
9 namespace compiler {
10
TEST(ArgumentsMapped)11 TEST(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 = JSObject::GetProperty(arguments, l).ToHandleChecked();
20 CHECK_EQ(4, length->Number());
21 }
22
23
TEST(ArgumentsUnmapped)24 TEST(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 = JSObject::GetProperty(arguments, l).ToHandleChecked();
33 CHECK_EQ(4, length->Number());
34 }
35
36
TEST(ArgumentsRest)37 TEST(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 = JSObject::GetProperty(arguments, l).ToHandleChecked();
46 CHECK_EQ(3, length->Number());
47 }
48
49 } // namespace compiler
50 } // namespace internal
51 } // namespace v8
52