1 /*
2 * Copyright (c) 2021 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/builtins/builtins_global.h"
17
18 #include "ecmascript/js_hclass.h"
19 #include "ecmascript/ecma_runtime_call_info.h"
20 #include "ecmascript/ecma_vm.h"
21 #include "ecmascript/global_env.h"
22 #include "ecmascript/js_tagged_value-inl.h"
23 #include "ecmascript/js_thread.h"
24 #include "ecmascript/object_factory.h"
25 #include "ecmascript/js_array.h"
26 #include "ecmascript/shared_objects/js_shared_array.h"
27 #include "ecmascript/tests/test_helper.h"
28
29 using namespace panda::ecmascript;
30 using namespace panda::ecmascript::builtins;
31 using BuiltinsBase = panda::ecmascript::base::BuiltinsBase;
32
33 namespace panda::test {
34 class BuiltinsGlobalTest : public BaseTestWithScope<false> {
35 public:
NewJSObject(JSThread *thread, ObjectFactory *factory, JSHandle<GlobalEnv> globalEnv)36 static JSHandle<JSObject> NewJSObject(JSThread *thread, ObjectFactory *factory, JSHandle<GlobalEnv> globalEnv)
37 {
38 JSFunction *jsFunc = globalEnv->GetObjectFunction().GetObject<JSFunction>();
39 JSHandle<JSTaggedValue> jsFunc1(thread, jsFunc);
40 JSHandle<JSObject> jsObj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(jsFunc1), jsFunc1);
41 return jsObj;
42 }
43 };
44
HWTEST_F_L0(BuiltinsGlobalTest, DecodeURIComponent)45 HWTEST_F_L0(BuiltinsGlobalTest, DecodeURIComponent)
46 {
47 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
48 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
49 ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
50 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(123));
51
52 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
53 JSTaggedValue result = BuiltinsGlobal::DecodeURIComponent(ecmaRuntimeCallInfo);
54 TestHelper::TearDownFrame(thread, prev);
55 EXPECT_TRUE(result.IsString());
56 JSHandle<EcmaString> ecmaStrHandle(thread, result);
57 EXPECT_STREQ("123", EcmaStringAccessor(ecmaStrHandle).ToCString().c_str());
58 }
59
HWTEST_F_L0(BuiltinsGlobalTest, EncodeURIComponent)60 HWTEST_F_L0(BuiltinsGlobalTest, EncodeURIComponent)
61 {
62 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
63 ecmaRuntimeCallInfo->SetFunction(JSTaggedValue::Undefined());
64 ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
65 ecmaRuntimeCallInfo->SetCallArg(0, JSTaggedValue(123));
66
67 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
68 JSTaggedValue result = BuiltinsGlobal::EncodeURIComponent(ecmaRuntimeCallInfo);
69 TestHelper::TearDownFrame(thread, prev);
70 EXPECT_TRUE(result.IsString());
71 JSHandle<EcmaString> ecmaStrHandle(thread, result);
72 EXPECT_STREQ("123", EcmaStringAccessor(ecmaStrHandle).ToCString().c_str());
73 }
74
HWTEST_F_L0(BuiltinsGlobalTest, PrintEntrypointAndPrintString)75 HWTEST_F_L0(BuiltinsGlobalTest, PrintEntrypointAndPrintString)
76 {
77 // msg == nullptr
78 JSTaggedValue result = BuiltinsGlobal::PrintEntrypoint(nullptr);
79 EXPECT_EQ(result, JSTaggedValue::Undefined());
80 }
81
HWTEST_F_L0(BuiltinsGlobalTest, CallJsProxy)82 HWTEST_F_L0(BuiltinsGlobalTest, CallJsProxy)
83 {
84 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
85 auto ecmaVM = thread->GetEcmaVM();
86 JSHandle<GlobalEnv> env = ecmaVM->GetGlobalEnv();
87 JSHandle<JSTaggedValue> emptyObj(thread, NewJSObject(thread, factory, env).GetTaggedValue());
88 JSHandle<JSProxy> proxy = factory->NewJSProxy(emptyObj, emptyObj);
89 proxy->SetCallable(false);
90 auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
91 ecmaRuntimeCallInfo->SetFunction(proxy.GetTaggedValue());
92 ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined());
93
94 [[maybe_unused]] auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo);
95 JSTaggedValue result = BuiltinsGlobal::CallJsProxy(ecmaRuntimeCallInfo);
96 TestHelper::TearDownFrame(thread, prev);
97 EXPECT_TRUE(thread->HasPendingException());
98 EXPECT_EQ(result, JSTaggedValue::Undefined());
99 thread->ClearException();
100 }
101
HWTEST_F_L0(BuiltinsGlobalTest, Escape)102 HWTEST_F_L0(BuiltinsGlobalTest, Escape)
103 {
104 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
105 JSHandle<EcmaString> str1 = factory->NewFromASCII("?!=()#%&");
106 auto ecmaRuntimeCallInfo1 =
107 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); // NOLINT, 6 means 3 paras
108 ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
109 ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
110 ecmaRuntimeCallInfo1->SetCallArg(0, str1.GetTaggedValue());
111
112 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
113 JSTaggedValue result1 = BuiltinsGlobal::Escape(ecmaRuntimeCallInfo1);
114 TestHelper::TearDownFrame(thread, prev1);
115 EXPECT_TRUE(result1.IsString());
116 JSHandle<EcmaString> ecmaStrHandle1(thread, result1);
117 EXPECT_STREQ("%3F%21%3D%28%29%23%25%26", EcmaStringAccessor(ecmaStrHandle1).ToCString().c_str()); // NOLINT
118
119 JSHandle<EcmaString> str2 = factory->NewFromASCII("%u%u0%u9%ua%uF%u00%u09%u0f%u0F%u000%u00a%u00F");
120 auto ecmaRuntimeCallInfo2 =
121 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); // NOLINT
122 ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
123 ecmaRuntimeCallInfo2->SetThis(JSTaggedValue::Undefined());
124 ecmaRuntimeCallInfo2->SetCallArg(0, str2.GetTaggedValue()); // NOLINT
125
126 [[maybe_unused]] auto prev2 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
127 JSTaggedValue result2 = BuiltinsGlobal::Escape(ecmaRuntimeCallInfo2);
128 TestHelper::TearDownFrame(thread, prev2);
129 EXPECT_TRUE(result2.IsString());
130 JSHandle<EcmaString> ecmaStrHandle2(thread, result2);
131 EXPECT_STREQ("%25u%25u0%25u9%25ua%25uF%25u00%25u09%25u0f%25u0F%25u000%25u00a%25u00F", // NOLINT special value
132 EcmaStringAccessor(ecmaStrHandle2).ToCString().c_str());
133
134 JSHandle<EcmaString> str3 = factory->NewFromASCII("Hello World!");
135 std::vector<JSTaggedValue> args{str3.GetTaggedValue()};
136 auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, args, 6);
137
138 [[maybe_unused]] auto prev3 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
139 JSTaggedValue result3 = BuiltinsGlobal::Escape(ecmaRuntimeCallInfo3);
140 TestHelper::TearDownFrame(thread, prev3);
141 EXPECT_TRUE(result3.IsString());
142 JSHandle<EcmaString> ecmaStrHandle3(thread, result3);
143 EXPECT_STREQ("Hello%20World%21", EcmaStringAccessor(ecmaStrHandle3).ToCString().c_str());
144 }
145
HWTEST_F_L0(BuiltinsGlobalTest, Unescape)146 HWTEST_F_L0(BuiltinsGlobalTest, Unescape)
147 {
148 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
149 JSHandle<EcmaString> str1 = factory->NewFromASCII("");
150 auto ecmaRuntimeCallInfo1 =
151 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); // NOLINT
152 ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
153 ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
154 ecmaRuntimeCallInfo1->SetCallArg(0, str1.GetTaggedValue());
155
156 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
157 JSTaggedValue result1 = BuiltinsGlobal::Unescape(ecmaRuntimeCallInfo1);
158 TestHelper::TearDownFrame(thread, prev1);
159 EXPECT_TRUE(result1.IsString());
160 JSHandle<EcmaString> ecmaStrHandle1(thread, result1);
161 EXPECT_STREQ("", EcmaStringAccessor(ecmaStrHandle1).ToCString().c_str());
162
163 JSHandle<EcmaString> str2 = factory->NewFromASCII("%u%u0%u9%ua%uF%u00%u09%u0f%u0F%u000%u00a%u00F");
164 auto ecmaRuntimeCallInfo2 =
165 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6); // NOLINT
166 ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
167 ecmaRuntimeCallInfo2->SetThis(JSTaggedValue::Undefined());
168 ecmaRuntimeCallInfo2->SetCallArg(0, str2.GetTaggedValue()); // NOLINT
169
170 [[maybe_unused]] auto prev2 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
171 JSTaggedValue result2 = BuiltinsGlobal::Unescape(ecmaRuntimeCallInfo2);
172 TestHelper::TearDownFrame(thread, prev2);
173 EXPECT_TRUE(result2.IsString());
174 JSHandle<EcmaString> ecmaStrHandle2(thread, result2);
175 EXPECT_STREQ("%u%u0%u9%ua%uF%u00%u09%u0f%u0F%u000%u00a%u00F",
176 EcmaStringAccessor(ecmaStrHandle2).ToCString().c_str());
177
178 JSHandle<EcmaString> str3 = factory->NewFromASCII("Hello%20World%21");
179 std::vector<JSTaggedValue> args{str3.GetTaggedValue()};
180 auto ecmaRuntimeCallInfo3 = TestHelper::CreateEcmaRuntimeCallInfo(thread, args, 6);
181
182 [[maybe_unused]] auto prev3 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
183 JSTaggedValue result3 = BuiltinsGlobal::Escape(ecmaRuntimeCallInfo3);
184 TestHelper::TearDownFrame(thread, prev3);
185 EXPECT_TRUE(result3.IsString());
186 JSHandle<EcmaString> ecmaStrHandle3(thread, result3);
187 EXPECT_STREQ("Hello%2520World%2521", EcmaStringAccessor(ecmaStrHandle3).ToCString().c_str());
188 }
189
HWTEST_F_L0(BuiltinsGlobalTest, isSendable_0)190 HWTEST_F_L0(BuiltinsGlobalTest, isSendable_0)
191 {
192 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
193 JSHandle<EcmaString> str1 = factory->NewFromASCII("?!=()#%&");
194 auto ecmaRuntimeCallInfo1 =
195 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
196 ecmaRuntimeCallInfo1->SetFunction(JSTaggedValue::Undefined());
197 ecmaRuntimeCallInfo1->SetThis(JSTaggedValue::Undefined());
198 ecmaRuntimeCallInfo1->SetCallArg(0, str1.GetTaggedValue());
199
200 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo1);
201 JSTaggedValue result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo1);
202 TestHelper::TearDownFrame(thread, prev1);
203 EXPECT_EQ(JSTaggedValue::True(), result);
204
205 auto ecmaRuntimeCallInfo2 =
206 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
207 ecmaRuntimeCallInfo2->SetFunction(JSTaggedValue::Undefined());
208 ecmaRuntimeCallInfo2->SetThis(JSTaggedValue::Undefined());
209 ecmaRuntimeCallInfo2->SetCallArg(0, JSTaggedValue(1));
210
211 prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo2);
212 result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo2);
213 TestHelper::TearDownFrame(thread, prev1);
214 EXPECT_EQ(JSTaggedValue::True(), result);
215
216 auto ecmaRuntimeCallInfo3 =
217 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
218 ecmaRuntimeCallInfo3->SetFunction(JSTaggedValue::Undefined());
219 ecmaRuntimeCallInfo3->SetThis(JSTaggedValue::Undefined());
220 ecmaRuntimeCallInfo3->SetCallArg(0, JSTaggedValue(1.5));
221
222 prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo3);
223 result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo3);
224 TestHelper::TearDownFrame(thread, prev1);
225 EXPECT_EQ(JSTaggedValue::True(), result);
226 }
227
HWTEST_F_L0(BuiltinsGlobalTest, isSendable_1)228 HWTEST_F_L0(BuiltinsGlobalTest, isSendable_1)
229 {
230 ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
231
232 auto ecmaRuntimeCallInfo5 =
233 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
234 ecmaRuntimeCallInfo5->SetFunction(JSTaggedValue::Undefined());
235 ecmaRuntimeCallInfo5->SetThis(JSTaggedValue::Undefined());
236 JSFunction *jsFunc = thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction().GetObject<JSFunction>();
237 JSHandle<JSTaggedValue> jsFunc1(thread, jsFunc);
238 JSHandle<JSObject> jsObj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(jsFunc1), jsFunc1);
239 ecmaRuntimeCallInfo5->SetCallArg(0, jsObj.GetTaggedValue());
240
241 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo5);
242 auto result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo5);
243 TestHelper::TearDownFrame(thread, prev1);
244 EXPECT_EQ(JSTaggedValue::False(), result);
245
246 auto ecmaRuntimeCallInfo6 =
247 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
248 ecmaRuntimeCallInfo6->SetFunction(JSTaggedValue::Undefined());
249 ecmaRuntimeCallInfo6->SetThis(JSTaggedValue::Undefined());
250 JSHandle<JSObject> sharedArrayFunc(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
251 ecmaRuntimeCallInfo6->SetCallArg(0, sharedArrayFunc.GetTaggedValue());
252
253 prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo6);
254 result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo6);
255 TestHelper::TearDownFrame(thread, prev1);
256 EXPECT_EQ(JSTaggedValue::True(), result);
257
258 auto ecmaRuntimeCallInfo8 =
259 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
260 ecmaRuntimeCallInfo8->SetFunction(JSTaggedValue::Undefined());
261 ecmaRuntimeCallInfo8->SetThis(JSTaggedValue::Undefined());
262 JSArray *arr = JSArray::Cast(JSArray::ArrayCreate(thread, JSTaggedNumber(0)).GetTaggedValue().GetTaggedObject());
263 EXPECT_TRUE(arr != nullptr);
264 JSHandle<JSObject> arrObj(thread, arr);
265 ecmaRuntimeCallInfo8->SetCallArg(0, arrObj.GetTaggedValue());
266
267 prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo8);
268 result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo8);
269 TestHelper::TearDownFrame(thread, prev1);
270 EXPECT_EQ(JSTaggedValue::False(), result);
271 }
272
HWTEST_F_L0(BuiltinsGlobalTest, isSendable_2)273 HWTEST_F_L0(BuiltinsGlobalTest, isSendable_2)
274 {
275 auto ecmaRuntimeCallInfo4 =
276 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
277 ecmaRuntimeCallInfo4->SetFunction(JSTaggedValue::Undefined());
278 ecmaRuntimeCallInfo4->SetThis(JSTaggedValue::Undefined());
279 JSFunction *jsFunc = thread->GetEcmaVM()->GetGlobalEnv()->GetObjectFunction().GetObject<JSFunction>();
280 JSHandle<JSTaggedValue> jsFunc1(thread, jsFunc);
281 ecmaRuntimeCallInfo4->SetCallArg(0, jsFunc1.GetTaggedValue());
282
283 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
284 auto result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo4);
285 TestHelper::TearDownFrame(thread, prev1);
286 EXPECT_EQ(JSTaggedValue::False(), result);
287
288 auto ecmaRuntimeCallInfo7 =
289 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
290 ecmaRuntimeCallInfo7->SetFunction(JSTaggedValue::Undefined());
291 ecmaRuntimeCallInfo7->SetThis(JSTaggedValue::Undefined());
292 JSHandle<JSObject> sharedArrayFunc(thread->GetEcmaVM()->GetGlobalEnv()->GetSharedArrayFunction());
293 JSSharedArray *arr = JSSharedArray::Cast(JSSharedArray::ArrayCreate(thread, JSTaggedNumber(0))->GetTaggedObject());
294 EXPECT_TRUE(arr != nullptr);
295 JSHandle<JSObject> sharedObj(thread, arr);
296 ecmaRuntimeCallInfo7->SetCallArg(0, sharedObj.GetTaggedValue());
297
298 prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo7);
299 result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo7);
300 TestHelper::TearDownFrame(thread, prev1);
301 EXPECT_EQ(JSTaggedValue::True(), result);
302
303 auto ecmaRuntimeCallInfo9 =
304 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
305 ecmaRuntimeCallInfo9->SetFunction(JSTaggedValue::Undefined());
306 ecmaRuntimeCallInfo9->SetThis(JSTaggedValue::Undefined());
307 ecmaRuntimeCallInfo9->SetCallArg(0, sharedObj.GetTaggedValue());
308 ecmaRuntimeCallInfo9->SetCallArg(1, sharedObj.GetTaggedValue());
309
310 prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo9);
311 result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo9);
312 TestHelper::TearDownFrame(thread, prev1);
313 EXPECT_EQ(JSTaggedValue::False(), result);
314 }
315
HWTEST_F_L0(BuiltinsGlobalTest, isSendable_3)316 HWTEST_F_L0(BuiltinsGlobalTest, isSendable_3)
317 {
318 auto ecmaRuntimeCallInfo4 =
319 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
320 ecmaRuntimeCallInfo4->SetFunction(JSTaggedValue::Undefined());
321 ecmaRuntimeCallInfo4->SetThis(JSTaggedValue::Undefined());
322 ecmaRuntimeCallInfo4->SetCallArg(0, JSTaggedValue::Undefined());
323
324 [[maybe_unused]] auto prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo4);
325 auto result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo4);
326 TestHelper::TearDownFrame(thread, prev1);
327 EXPECT_EQ(JSTaggedValue::True(), result);
328
329 auto ecmaRuntimeCallInfo5 =
330 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
331 ecmaRuntimeCallInfo5->SetFunction(JSTaggedValue::Undefined());
332 ecmaRuntimeCallInfo5->SetThis(JSTaggedValue::Undefined());
333 ecmaRuntimeCallInfo5->SetCallArg(0, JSTaggedValue::True());
334
335 prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo5);
336 result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo5);
337 TestHelper::TearDownFrame(thread, prev1);
338 EXPECT_EQ(JSTaggedValue::True(), result);
339
340 auto ecmaRuntimeCallInfo6 =
341 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 8);
342 ecmaRuntimeCallInfo6->SetFunction(JSTaggedValue::Undefined());
343 ecmaRuntimeCallInfo6->SetThis(JSTaggedValue::Undefined());
344 ecmaRuntimeCallInfo6->SetCallArg(0, JSTaggedValue::Exception());
345
346 prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo6);
347 result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo6);
348 TestHelper::TearDownFrame(thread, prev1);
349 EXPECT_EQ(JSTaggedValue::False(), result);
350
351 auto ecmaRuntimeCallInfo9 =
352 TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue::Undefined(), 6);
353 ecmaRuntimeCallInfo9->SetFunction(JSTaggedValue::Undefined());
354 ecmaRuntimeCallInfo9->SetThis(JSTaggedValue::Undefined());
355 ecmaRuntimeCallInfo9->SetCallArg(0, JSTaggedValue::Null());
356
357 prev1 = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo9);
358 result = BuiltinsGlobal::IsSendable(ecmaRuntimeCallInfo9);
359 TestHelper::TearDownFrame(thread, prev1);
360 EXPECT_EQ(JSTaggedValue::True(), result);
361 }
362
363 } // namespace panda::test
364