887f876058
This models the materialization of arguments objects in the prologue within the IR graph. It will in turn allow us to optimize access to these objects and also correctly handle them with inlining. R=bmeurer@chromium.org,mvstanton@chromium.org TEST=cctest/test-run-jsobjects/Arguments* Review URL: https://codereview.chromium.org/1344553003 Cr-Commit-Position: refs/heads/master@{#30735}
48 lines
1.8 KiB
C++
48 lines
1.8 KiB
C++
// Copyright 2015 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "test/cctest/compiler/function-tester.h"
|
|
|
|
using namespace v8::internal;
|
|
using namespace v8::internal::compiler;
|
|
|
|
TEST(ArgumentsMapped) {
|
|
FunctionTester T("(function(a) { return arguments; })");
|
|
|
|
Handle<Object> arguments;
|
|
T.Call(T.Val(19), T.Val(23), T.Val(42), T.Val(65)).ToHandle(&arguments);
|
|
CHECK(arguments->IsJSObject() && !arguments->IsJSArray());
|
|
CHECK(JSObject::cast(*arguments)->HasSloppyArgumentsElements());
|
|
Handle<String> l = T.isolate->factory()->length_string();
|
|
Handle<Object> length = JSObject::GetProperty(arguments, l).ToHandleChecked();
|
|
CHECK_EQ(4, length->Number());
|
|
}
|
|
|
|
|
|
TEST(ArgumentsUnmapped) {
|
|
FunctionTester T("(function(a) { 'use strict'; return arguments; })");
|
|
|
|
Handle<Object> arguments;
|
|
T.Call(T.Val(19), T.Val(23), T.Val(42), T.Val(65)).ToHandle(&arguments);
|
|
CHECK(arguments->IsJSObject() && !arguments->IsJSArray());
|
|
CHECK(!JSObject::cast(*arguments)->HasSloppyArgumentsElements());
|
|
Handle<String> l = T.isolate->factory()->length_string();
|
|
Handle<Object> length = JSObject::GetProperty(arguments, l).ToHandleChecked();
|
|
CHECK_EQ(4, length->Number());
|
|
}
|
|
|
|
|
|
TEST(ArgumentsRest) {
|
|
FLAG_harmony_rest_parameters = true;
|
|
FunctionTester T("(function(a, ...args) { return args; })");
|
|
|
|
Handle<Object> arguments;
|
|
T.Call(T.Val(19), T.Val(23), T.Val(42), T.Val(65)).ToHandle(&arguments);
|
|
CHECK(arguments->IsJSObject() && arguments->IsJSArray());
|
|
CHECK(!JSObject::cast(*arguments)->HasSloppyArgumentsElements());
|
|
Handle<String> l = T.isolate->factory()->length_string();
|
|
Handle<Object> length = JSObject::GetProperty(arguments, l).ToHandleChecked();
|
|
CHECK_EQ(3, length->Number());
|
|
}
|