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