8e7241fdde
Rebuilding (after touching certain files) is crazy slow because includes are out of control. Many of these files we need to rebuild are cctests which pull in more includes than they need. BUG=v8:5294 Review-Url: https://codereview.chromium.org/2304553002 Cr-Commit-Position: refs/heads/master@{#39080}
102 lines
3.3 KiB
C++
102 lines
3.3 KiB
C++
// Copyright 2014 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 "src/api.h"
|
|
#include "test/cctest/compiler/function-tester.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
namespace compiler {
|
|
|
|
static const char* throws = NULL;
|
|
|
|
static const char* load_tests[] = {
|
|
"var x = a; r = x", "123", "0",
|
|
"var x = (r = x)", "undefined", "undefined",
|
|
"var x = (a?1:2); r = x", "1", "2",
|
|
"const x = a; r = x", "123", "0",
|
|
"const x = (a?3:4); r = x", "3", "4",
|
|
"'use strict'; const x = a; r = x", "123", "0",
|
|
"'use strict'; const x = (r = x)", throws, throws,
|
|
"'use strict'; const x = (a?5:6); r = x", "5", "6",
|
|
"'use strict'; let x = a; r = x", "123", "0",
|
|
"'use strict'; let x = (r = x)", throws, throws,
|
|
"'use strict'; let x = (a?7:8); r = x", "7", "8",
|
|
NULL};
|
|
|
|
static const char* store_tests[] = {
|
|
"var x = 1; x = a; r = x", "123", "0",
|
|
"var x = (a?(x=4,2):3); r = x", "2", "3",
|
|
"var x = (a?4:5); x = a; r = x", "123", "0",
|
|
// Assignments to 'const' are SyntaxErrors, handled by the parser,
|
|
// hence we cannot test them here because they are early errors.
|
|
"'use strict'; let x = 1; x = a; r = x", "123", "0",
|
|
"'use strict'; let x = (a?(x=4,2):3); r = x", throws, "3",
|
|
"'use strict'; let x = (a?4:5); x = a; r = x", "123", "0",
|
|
NULL};
|
|
|
|
|
|
static void RunVariableTests(const char* source, const char* tests[]) {
|
|
EmbeddedVector<char, 512> buffer;
|
|
|
|
for (int i = 0; tests[i] != NULL; i += 3) {
|
|
SNPrintF(buffer, source, tests[i]);
|
|
PrintF("#%d: %s\n", i / 3, buffer.start());
|
|
FunctionTester T(buffer.start());
|
|
|
|
// Check function with non-falsey parameter.
|
|
if (tests[i + 1] != throws) {
|
|
Handle<Object> r = v8::Utils::OpenHandle(*CompileRun(tests[i + 1]));
|
|
T.CheckCall(r, T.Val(123), T.Val("result"));
|
|
} else {
|
|
T.CheckThrows(T.Val(123), T.Val("result"));
|
|
}
|
|
|
|
// Check function with falsey parameter.
|
|
if (tests[i + 2] != throws) {
|
|
Handle<Object> r = v8::Utils::OpenHandle(*CompileRun(tests[i + 2]));
|
|
T.CheckCall(r, T.Val(0.0), T.Val("result"));
|
|
} else {
|
|
T.CheckThrows(T.Val(0.0), T.Val("result"));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
TEST(StackLoadVariables) {
|
|
const char* source = "(function(a,r) { %s; return r; })";
|
|
RunVariableTests(source, load_tests);
|
|
}
|
|
|
|
|
|
TEST(ContextLoadVariables) {
|
|
const char* source = "(function(a,r) { %s; function f() {x} return r; })";
|
|
RunVariableTests(source, load_tests);
|
|
}
|
|
|
|
|
|
TEST(StackStoreVariables) {
|
|
const char* source = "(function(a,r) { %s; return r; })";
|
|
RunVariableTests(source, store_tests);
|
|
}
|
|
|
|
|
|
TEST(ContextStoreVariables) {
|
|
const char* source = "(function(a,r) { %s; function f() {x} return r; })";
|
|
RunVariableTests(source, store_tests);
|
|
}
|
|
|
|
|
|
TEST(SelfReferenceVariable) {
|
|
FunctionTester T("(function self() { return self; })");
|
|
|
|
T.CheckCall(T.function);
|
|
CompileRun("var self = 'not a function'");
|
|
T.CheckCall(T.function);
|
|
}
|
|
|
|
} // namespace compiler
|
|
} // namespace internal
|
|
} // namespace v8
|