1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ecmascript/base/string_helper.h"
17 #include "ecmascript/ecma_vm.h"
18 #include "ecmascript/global_env.h"
19 #include "ecmascript/interpreter/fast_runtime_stub-inl.h"
20 #include "ecmascript/js_function.h"
21 #include "ecmascript/js_thread.h"
22 #include "ecmascript/platform/time.h"
23 #include "ecmascript/tests/test_helper.h"
24
25 using namespace panda::ecmascript;
26
27 namespace panda::test {
28 class BuiltinsLazyTest : public BaseTestWithScope<true> {
29 };
30
HWTEST_F_L0(BuiltinsLazyTest,SlowGetOwnProperty)31 HWTEST_F_L0(BuiltinsLazyTest, SlowGetOwnProperty)
32 {
33 EcmaVM *ecmaVM = thread->GetEcmaVM();
34 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
35 ObjectFactory *factory = ecmaVM->GetFactory();
36 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("Date"));
37 auto globalObj = JSHandle<JSObject>(thread, globalEnv->GetGlobalObject());
38 PropertyDescriptor desc(thread);
39 bool success = JSObject::GetOwnProperty(thread, globalObj, key, desc);
40 ASSERT_TRUE(success);
41 ASSERT_TRUE(desc.GetValue()->IsJSFunction());
42 }
43
HWTEST_F_L0(BuiltinsLazyTest,SlowSetProperty)44 HWTEST_F_L0(BuiltinsLazyTest, SlowSetProperty)
45 {
46 EcmaVM *ecmaVM = thread->GetEcmaVM();
47 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
48 ObjectFactory *factory = ecmaVM->GetFactory();
49 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("Date"));
50 auto globalObj = JSHandle<JSTaggedValue>(thread, globalEnv->GetGlobalObject());
51 JSHandle<JSTaggedValue> value(factory->NewFromUtf8("Value"));
52 bool success = JSObject::SetProperty(thread, globalObj, key, value);
53 ASSERT_TRUE(success);
54 PropertyDescriptor desc(thread);
55 JSObject::GetOwnProperty(thread, JSHandle<JSObject>::Cast(globalObj), key, desc);
56 ASSERT_FALSE(desc.IsAccessorDescriptor());
57 }
58
HWTEST_F_L0(BuiltinsLazyTest,EnvGetDateConstructorTest)59 HWTEST_F_L0(BuiltinsLazyTest, EnvGetDateConstructorTest)
60 {
61 EcmaVM *ecmaVM = thread->GetEcmaVM();
62 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
63 JSHandle<JSTaggedValue> dateFunction = globalEnv->GetDateFunction();
64 ASSERT_TRUE(dateFunction->IsJSFunction());
65 ObjectFactory *factory = ecmaVM->GetFactory();
66 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("now"));
67 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, dateFunction, key));
68 }
69
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetDateConstructorTest)70 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetDateConstructorTest)
71 {
72 EcmaVM *ecmaVM = thread->GetEcmaVM();
73 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
74 ObjectFactory *factory = ecmaVM->GetFactory();
75 auto key = factory->NewFromUtf8("Date");
76 auto globalObj = globalEnv->GetGlobalObject();
77 auto dateFunction = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key.GetTaggedValue());
78 ASSERT_TRUE(dateFunction.IsJSFunction());
79 }
80
HWTEST_F_L0(BuiltinsLazyTest,EnvGetSetConstructorTest)81 HWTEST_F_L0(BuiltinsLazyTest, EnvGetSetConstructorTest)
82 {
83 EcmaVM *ecmaVM = thread->GetEcmaVM();
84 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
85 JSHandle<JSTaggedValue> setFunction = globalEnv->GetBuiltinsSetFunction();
86 ASSERT_TRUE(setFunction->IsJSFunction());
87 ObjectFactory *factory = ecmaVM->GetFactory();
88 JSHandle<JSTaggedValue> setObject(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(setFunction),
89 setFunction));
90 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("add"));
91 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, setObject, key));
92 }
93
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetSetConstructorTest)94 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetSetConstructorTest)
95 {
96 EcmaVM *ecmaVM = thread->GetEcmaVM();
97 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
98 ObjectFactory *factory = ecmaVM->GetFactory();
99 JSTaggedValue key = factory->NewFromUtf8("Set").GetTaggedValue();
100 auto globalObj = globalEnv->GetGlobalObject();
101 auto setFunction = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
102 ASSERT_TRUE(setFunction.IsJSFunction());
103 }
104
HWTEST_F_L0(BuiltinsLazyTest,EnvGetMapConstructorTest)105 HWTEST_F_L0(BuiltinsLazyTest, EnvGetMapConstructorTest)
106 {
107 EcmaVM *ecmaVM = thread->GetEcmaVM();
108 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
109 JSHandle<JSTaggedValue> mapFunction = globalEnv->GetBuiltinsMapFunction();
110 ASSERT_TRUE(mapFunction->IsJSFunction());
111 ObjectFactory *factory = ecmaVM->GetFactory();
112 JSHandle<JSTaggedValue> mapObject(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(mapFunction),
113 mapFunction));
114 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("clear"));
115 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, mapObject, key));
116 }
117
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetMapConstructorTest)118 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetMapConstructorTest)
119 {
120 EcmaVM *ecmaVM = thread->GetEcmaVM();
121 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
122 ObjectFactory *factory = ecmaVM->GetFactory();
123 JSTaggedValue key = factory->NewFromUtf8("Map").GetTaggedValue();
124 auto globalObj = globalEnv->GetGlobalObject();
125 auto mapFunction = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
126 ASSERT_TRUE(mapFunction.IsJSFunction());
127 }
128
HWTEST_F_L0(BuiltinsLazyTest,EnvGetWeakMapConstructorTest)129 HWTEST_F_L0(BuiltinsLazyTest, EnvGetWeakMapConstructorTest)
130 {
131 EcmaVM *ecmaVM = thread->GetEcmaVM();
132 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
133 JSHandle<JSTaggedValue> weakMapFunction = globalEnv->GetBuiltinsWeakMapFunction();
134 ASSERT_TRUE(weakMapFunction->IsJSFunction());
135 ObjectFactory *factory = ecmaVM->GetFactory();
136 JSHandle<JSTaggedValue> weakMapObject(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(weakMapFunction),
137 weakMapFunction));
138 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("delete"));
139 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, weakMapObject, key));
140 }
141
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetWeakMapConstructorTest)142 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetWeakMapConstructorTest)
143 {
144 EcmaVM *ecmaVM = thread->GetEcmaVM();
145 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
146 ObjectFactory *factory = ecmaVM->GetFactory();
147 JSTaggedValue key = factory->NewFromUtf8("WeakMap").GetTaggedValue();
148 auto globalObj = globalEnv->GetGlobalObject();
149 auto weakMapFunction = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
150 ASSERT_TRUE(weakMapFunction.IsJSFunction());
151 }
152
HWTEST_F_L0(BuiltinsLazyTest,EnvGetWeakSetConstructorTest)153 HWTEST_F_L0(BuiltinsLazyTest, EnvGetWeakSetConstructorTest)
154 {
155 EcmaVM *ecmaVM = thread->GetEcmaVM();
156 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
157 JSHandle<JSTaggedValue> weakSetFunction = globalEnv->GetBuiltinsWeakSetFunction();
158 ASSERT_TRUE(weakSetFunction->IsJSFunction());
159 ObjectFactory *factory = ecmaVM->GetFactory();
160 JSHandle<JSTaggedValue> weakSetObject(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(weakSetFunction),
161 weakSetFunction));
162 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("delete"));
163 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, weakSetObject, key));
164 }
165
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetWeakSetConstructorTest)166 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetWeakSetConstructorTest)
167 {
168 EcmaVM *ecmaVM = thread->GetEcmaVM();
169 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
170 ObjectFactory *factory = ecmaVM->GetFactory();
171 JSTaggedValue key = factory->NewFromUtf8("WeakSet").GetTaggedValue();
172 auto globalObj = globalEnv->GetGlobalObject();
173 auto weakSetFunction = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
174 ASSERT_TRUE(weakSetFunction.IsJSFunction());
175 }
176
HWTEST_F_L0(BuiltinsLazyTest,EnvGetWeakRefConstructorTest)177 HWTEST_F_L0(BuiltinsLazyTest, EnvGetWeakRefConstructorTest)
178 {
179 EcmaVM *ecmaVM = thread->GetEcmaVM();
180 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
181 JSHandle<JSTaggedValue> weakRefFunction = globalEnv->GetBuiltinsWeakRefFunction();
182 ASSERT_TRUE(weakRefFunction->IsJSFunction());
183 ObjectFactory *factory = ecmaVM->GetFactory();
184 JSHandle<JSTaggedValue> weakRefObject(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(weakRefFunction),
185 weakRefFunction));
186 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("deref"));
187 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, weakRefObject, key));
188 }
189
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetWeakRefConstructorTest)190 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetWeakRefConstructorTest)
191 {
192 EcmaVM *ecmaVM = thread->GetEcmaVM();
193 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
194 ObjectFactory *factory = ecmaVM->GetFactory();
195 JSTaggedValue key = factory->NewFromUtf8("WeakRef").GetTaggedValue();
196 auto globalObj = globalEnv->GetGlobalObject();
197 auto weakRefFunction = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
198 ASSERT_TRUE(weakRefFunction.IsJSFunction());
199 }
200
HWTEST_F_L0(BuiltinsLazyTest,EnvGetFinalizationRegistryConstructorTest)201 HWTEST_F_L0(BuiltinsLazyTest, EnvGetFinalizationRegistryConstructorTest)
202 {
203 EcmaVM *ecmaVM = thread->GetEcmaVM();
204 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
205 JSHandle<JSTaggedValue> function = globalEnv->GetBuiltinsFinalizationRegistryFunction();
206 ASSERT_TRUE(function->IsJSFunction());
207 ObjectFactory *factory = ecmaVM->GetFactory();
208 JSHandle<JSTaggedValue> object(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(function), function));
209 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("register"));
210 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, object, key));
211 }
212
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetFinalizationRegistryConstructorTest)213 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetFinalizationRegistryConstructorTest)
214 {
215 EcmaVM *ecmaVM = thread->GetEcmaVM();
216 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
217 ObjectFactory *factory = ecmaVM->GetFactory();
218 JSTaggedValue key = factory->NewFromUtf8("FinalizationRegistry").GetTaggedValue();
219 auto globalObj = globalEnv->GetGlobalObject();
220 auto function = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
221 ASSERT_TRUE(function.IsJSFunction());
222 }
223
HWTEST_F_L0(BuiltinsLazyTest,EnvGetInt8ArrayConstructorTest)224 HWTEST_F_L0(BuiltinsLazyTest, EnvGetInt8ArrayConstructorTest)
225 {
226 EcmaVM *ecmaVM = thread->GetEcmaVM();
227 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
228 JSHandle<JSTaggedValue> function = globalEnv->GetInt8ArrayFunction();
229 ASSERT_TRUE(function->IsJSFunction());
230 ObjectFactory *factory = ecmaVM->GetFactory();
231 JSHandle<JSTaggedValue> object(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(function), function));
232 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("BYTES_PER_ELEMENT"));
233 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, object, key));
234 }
235
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetInt8ArrayConstructorTest)236 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetInt8ArrayConstructorTest)
237 {
238 EcmaVM *ecmaVM = thread->GetEcmaVM();
239 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
240 ObjectFactory *factory = ecmaVM->GetFactory();
241 JSTaggedValue key = factory->NewFromUtf8("Int8Array").GetTaggedValue();
242 auto globalObj = globalEnv->GetGlobalObject();
243 auto function = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
244 ASSERT_TRUE(function.IsJSFunction());
245 }
246
HWTEST_F_L0(BuiltinsLazyTest,EnvGetArrayBufferConstructorTest)247 HWTEST_F_L0(BuiltinsLazyTest, EnvGetArrayBufferConstructorTest)
248 {
249 EcmaVM *ecmaVM = thread->GetEcmaVM();
250 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
251 JSHandle<JSTaggedValue> function = globalEnv->GetArrayBufferFunction();
252 ASSERT_TRUE(function->IsJSFunction());
253 ObjectFactory *factory = ecmaVM->GetFactory();
254 JSHandle<JSTaggedValue> object(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(function), function));
255 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("slice"));
256 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, object, key));
257 }
258
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetArrayBufferConstructorTest)259 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetArrayBufferConstructorTest)
260 {
261 EcmaVM *ecmaVM = thread->GetEcmaVM();
262 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
263 ObjectFactory *factory = ecmaVM->GetFactory();
264 JSTaggedValue key = factory->NewFromUtf8("ArrayBuffer").GetTaggedValue();
265 auto globalObj = globalEnv->GetGlobalObject();
266 auto function = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
267 ASSERT_TRUE(function.IsJSFunction());
268 }
269
HWTEST_F_L0(BuiltinsLazyTest,EnvGetDataViewConstructorTest)270 HWTEST_F_L0(BuiltinsLazyTest, EnvGetDataViewConstructorTest)
271 {
272 EcmaVM *ecmaVM = thread->GetEcmaVM();
273 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
274 JSHandle<JSTaggedValue> function = globalEnv->GetDataViewFunction();
275 ASSERT_TRUE(function->IsJSFunction());
276 ObjectFactory *factory = ecmaVM->GetFactory();
277 JSHandle<JSTaggedValue> object(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(function), function));
278 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("getFloat32"));
279 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, object, key));
280 }
281
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetDataViewConstructorTest)282 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetDataViewConstructorTest)
283 {
284 EcmaVM *ecmaVM = thread->GetEcmaVM();
285 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
286 ObjectFactory *factory = ecmaVM->GetFactory();
287 JSTaggedValue key = factory->NewFromUtf8("DataView").GetTaggedValue();
288 auto globalObj = globalEnv->GetGlobalObject();
289 auto function = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
290 ASSERT_TRUE(function.IsJSFunction());
291 }
292
HWTEST_F_L0(BuiltinsLazyTest,EnvGetSharedArrayBufferConstructorTest)293 HWTEST_F_L0(BuiltinsLazyTest, EnvGetSharedArrayBufferConstructorTest)
294 {
295 EcmaVM *ecmaVM = thread->GetEcmaVM();
296 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
297 JSHandle<JSTaggedValue> function = globalEnv->GetSharedArrayBufferFunction();
298 ASSERT_TRUE(function->IsJSFunction());
299 ObjectFactory *factory = ecmaVM->GetFactory();
300 JSHandle<JSTaggedValue> object(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(function), function));
301 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("slice"));
302 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, object, key));
303 }
304
HWTEST_F_L0(BuiltinsLazyTest,GlobalGetSharedArrayBufferConstructorTest)305 HWTEST_F_L0(BuiltinsLazyTest, GlobalGetSharedArrayBufferConstructorTest)
306 {
307 EcmaVM *ecmaVM = thread->GetEcmaVM();
308 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
309 ObjectFactory *factory = ecmaVM->GetFactory();
310 JSTaggedValue key = factory->NewFromUtf8("SharedArrayBuffer").GetTaggedValue();
311 auto globalObj = globalEnv->GetGlobalObject();
312 auto function = FastRuntimeStub::GetGlobalOwnProperty(thread, globalObj, key);
313 ASSERT_TRUE(function.IsJSFunction());
314 }
315
HWTEST_F_L0(BuiltinsLazyTest,EnvGetLocaleConstructorTest)316 HWTEST_F_L0(BuiltinsLazyTest, EnvGetLocaleConstructorTest)
317 {
318 EcmaVM *ecmaVM = thread->GetEcmaVM();
319 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
320 JSHandle<JSTaggedValue> function = globalEnv->GetLocaleFunction();
321 ASSERT_TRUE(function->IsJSFunction());
322 ObjectFactory *factory = ecmaVM->GetFactory();
323 JSHandle<JSTaggedValue> object(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(function), function));
324 JSHandle<JSTaggedValue> key(factory->NewFromUtf8("maximize"));
325 ASSERT_TRUE(JSTaggedValue::HasProperty(thread, object, key));
326 }
327
HWTEST_F_L0(BuiltinsLazyTest,IntlGetLocaleFunctionConstructorTest)328 HWTEST_F_L0(BuiltinsLazyTest, IntlGetLocaleFunctionConstructorTest)
329 {
330 EcmaVM *ecmaVM = thread->GetEcmaVM();
331 JSHandle<GlobalEnv> globalEnv = ecmaVM->GetGlobalEnv();
332 ObjectFactory *factory = ecmaVM->GetFactory();
333 JSTaggedValue key = factory->NewFromUtf8("Locale").GetTaggedValue();
334 auto intlObj = globalEnv->GetIntlFunction().GetTaggedValue();
335 auto function = FastRuntimeStub::GetPropertyByName(thread, intlObj, key);
336 ASSERT_TRUE(function.IsJSFunction());
337 }
338 } // namespace panda::test
339