Line data Source code
1 : // Copyright 2016 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 "src/v8.h"
6 :
7 : #include "test/cctest/cctest.h"
8 :
9 : namespace v8 {
10 : namespace internal {
11 : namespace test_usecounters {
12 :
13 : int* global_use_counts = nullptr;
14 :
15 84 : void MockUseCounterCallback(v8::Isolate* isolate,
16 : v8::Isolate::UseCounterFeature feature) {
17 84 : ++global_use_counts[feature];
18 84 : }
19 :
20 26644 : TEST(AssigmentExpressionLHSIsCall) {
21 5 : v8::Isolate* isolate = CcTest::isolate();
22 10 : v8::HandleScope scope(isolate);
23 5 : LocalContext env;
24 5 : int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
25 5 : global_use_counts = use_counts;
26 5 : CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
27 :
28 : // AssignmentExpressions whose LHS is not a call do not increment counters
29 : CompileRun("function f(){ a = 0; a()[b] = 0; }");
30 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
31 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
32 : CompileRun("function f(){ ++a; ++a()[b]; }");
33 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
34 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
35 : CompileRun("function f(){ 'use strict'; a = 0; a()[b] = 0; }");
36 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
37 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
38 : CompileRun("function f(){ 'use strict'; ++a; ++a()[b]; }");
39 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
40 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
41 :
42 : // AssignmentExpressions whose LHS is a call increment appropriate counters
43 : CompileRun("function f(){ a() = 0; }");
44 5 : CHECK_NE(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
45 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
46 5 : use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy] = 0;
47 : CompileRun("function f(){ 'use strict'; a() = 0; }");
48 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
49 5 : CHECK_NE(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
50 5 : use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict] = 0;
51 :
52 : // UpdateExpressions whose LHS is a call increment appropriate counters
53 : CompileRun("function f(){ ++a(); }");
54 5 : CHECK_NE(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
55 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
56 5 : use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy] = 0;
57 : CompileRun("function f(){ 'use strict'; ++a(); }");
58 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInSloppy]);
59 5 : CHECK_NE(0, use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict]);
60 5 : use_counts[v8::Isolate::kAssigmentExpressionLHSIsCallInStrict] = 0;
61 5 : }
62 :
63 26644 : TEST(AtomicsWakeAndAtomicsNotify) {
64 5 : v8::Isolate* isolate = CcTest::isolate();
65 10 : v8::HandleScope scope(isolate);
66 5 : LocalContext env;
67 5 : int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
68 5 : global_use_counts = use_counts;
69 5 : i::FLAG_harmony_sharedarraybuffer = true;
70 5 : CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
71 :
72 : CompileRun("Atomics.wake(new Int32Array(new SharedArrayBuffer(16)), 0);");
73 5 : CHECK_EQ(1, use_counts[v8::Isolate::kAtomicsWake]);
74 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAtomicsNotify]);
75 :
76 5 : use_counts[v8::Isolate::kAtomicsWake] = 0;
77 5 : use_counts[v8::Isolate::kAtomicsNotify] = 0;
78 :
79 : CompileRun("Atomics.notify(new Int32Array(new SharedArrayBuffer(16)), 0);");
80 5 : CHECK_EQ(0, use_counts[v8::Isolate::kAtomicsWake]);
81 5 : CHECK_EQ(1, use_counts[v8::Isolate::kAtomicsNotify]);
82 5 : }
83 :
84 26644 : TEST(RegExpMatchIsTrueishOnNonJSRegExp) {
85 5 : v8::Isolate* isolate = CcTest::isolate();
86 10 : v8::HandleScope scope(isolate);
87 5 : LocalContext env;
88 5 : int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
89 5 : global_use_counts = use_counts;
90 5 : CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
91 :
92 : CompileRun("new RegExp(/./); new RegExp('');");
93 5 : CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsTrueishOnNonJSRegExp]);
94 5 : CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsFalseishOnJSRegExp]);
95 :
96 : CompileRun("let p = { [Symbol.match]: true }; new RegExp(p);");
97 5 : CHECK_EQ(1, use_counts[v8::Isolate::kRegExpMatchIsTrueishOnNonJSRegExp]);
98 5 : CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsFalseishOnJSRegExp]);
99 5 : }
100 :
101 26644 : TEST(RegExpMatchIsFalseishOnJSRegExp) {
102 5 : v8::Isolate* isolate = CcTest::isolate();
103 10 : v8::HandleScope scope(isolate);
104 5 : LocalContext env;
105 5 : int use_counts[v8::Isolate::kUseCounterFeatureCount] = {};
106 5 : global_use_counts = use_counts;
107 5 : CcTest::isolate()->SetUseCounterCallback(MockUseCounterCallback);
108 :
109 : CompileRun("new RegExp(/./); new RegExp('');");
110 5 : CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsTrueishOnNonJSRegExp]);
111 5 : CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsFalseishOnJSRegExp]);
112 :
113 : CompileRun("let p = /./; p[Symbol.match] = false; new RegExp(p);");
114 5 : CHECK_EQ(0, use_counts[v8::Isolate::kRegExpMatchIsTrueishOnNonJSRegExp]);
115 5 : CHECK_EQ(1, use_counts[v8::Isolate::kRegExpMatchIsFalseishOnJSRegExp]);
116 5 : }
117 :
118 : } // namespace test_usecounters
119 : } // namespace internal
120 79917 : } // namespace v8
|