blob: 80a918134fad00b3e7eacdf5c144de8e0cc09427 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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();
Ben Murdochda12d292016-06-02 14:46:10 +010019 Handle<Object> length = Object::GetProperty(arguments, l).ToHandleChecked();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000020 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();
Ben Murdochda12d292016-06-02 14:46:10 +010032 Handle<Object> length = Object::GetProperty(arguments, l).ToHandleChecked();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000033 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();
Ben Murdochda12d292016-06-02 14:46:10 +010045 Handle<Object> length = Object::GetProperty(arguments, l).ToHandleChecked();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046 CHECK_EQ(3, length->Number());
47}
48
49} // namespace compiler
50} // namespace internal
51} // namespace v8