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