14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License. 54514f5e3Sopenharmony_ci * You may obtain a copy of the License at 64514f5e3Sopenharmony_ci * 74514f5e3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 84514f5e3Sopenharmony_ci * 94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and 134514f5e3Sopenharmony_ci * limitations under the License. 144514f5e3Sopenharmony_ci */ 154514f5e3Sopenharmony_ci 164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_INTERPRETER_FAST_RUNTIME_STUB_INL_H 174514f5e3Sopenharmony_ci#define ECMASCRIPT_INTERPRETER_FAST_RUNTIME_STUB_INL_H 184514f5e3Sopenharmony_ci 194514f5e3Sopenharmony_ci#include "ecmascript/interpreter/fast_runtime_stub.h" 204514f5e3Sopenharmony_ci 214514f5e3Sopenharmony_ci#include "ecmascript/ecma_string-inl.h" 224514f5e3Sopenharmony_ci#include "ecmascript/global_dictionary-inl.h" 234514f5e3Sopenharmony_ci#include "ecmascript/global_env.h" 244514f5e3Sopenharmony_ci#include "ecmascript/interpreter/interpreter.h" 254514f5e3Sopenharmony_ci#include "ecmascript/js_function.h" 264514f5e3Sopenharmony_ci#include "ecmascript/js_proxy.h" 274514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value-inl.h" 284514f5e3Sopenharmony_ci#include "ecmascript/object_factory-inl.h" 294514f5e3Sopenharmony_ci#include "ecmascript/object_fast_operator-inl.h" 304514f5e3Sopenharmony_ci#include "ecmascript/runtime_call_id.h" 314514f5e3Sopenharmony_ci 324514f5e3Sopenharmony_cinamespace panda::ecmascript { 334514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 344514f5e3Sopenharmony_ci#define CHECK_IS_ON_PROTOTYPE_CHAIN(receiver, holder) \ 354514f5e3Sopenharmony_ci if (UNLIKELY((receiver) != (holder))) { \ 364514f5e3Sopenharmony_ci return JSTaggedValue::Hole(); \ 374514f5e3Sopenharmony_ci } 384514f5e3Sopenharmony_ci 394514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::FastMul(JSTaggedValue left, JSTaggedValue right) 404514f5e3Sopenharmony_ci{ 414514f5e3Sopenharmony_ci if (left.IsNumber() && right.IsNumber()) { 424514f5e3Sopenharmony_ci return JSTaggedValue(left.GetNumber() * right.GetNumber()); 434514f5e3Sopenharmony_ci } 444514f5e3Sopenharmony_ci 454514f5e3Sopenharmony_ci return JSTaggedValue::Hole(); 464514f5e3Sopenharmony_ci} 474514f5e3Sopenharmony_ci 484514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::FastDiv(JSTaggedValue left, JSTaggedValue right) 494514f5e3Sopenharmony_ci{ 504514f5e3Sopenharmony_ci if (left.IsNumber() && right.IsNumber()) { 514514f5e3Sopenharmony_ci double dLeft = left.IsInt() ? left.GetInt() : left.GetDouble(); 524514f5e3Sopenharmony_ci double dRight = right.IsInt() ? right.GetInt() : right.GetDouble(); 534514f5e3Sopenharmony_ci if (UNLIKELY(dRight == 0.0)) { 544514f5e3Sopenharmony_ci if (dLeft == 0.0 || std::isnan(dLeft)) { 554514f5e3Sopenharmony_ci return JSTaggedValue(base::NAN_VALUE); 564514f5e3Sopenharmony_ci } 574514f5e3Sopenharmony_ci uint64_t flagBit = ((base::bit_cast<uint64_t>(dLeft)) ^ (base::bit_cast<uint64_t>(dRight))) & 584514f5e3Sopenharmony_ci base::DOUBLE_SIGN_MASK; 594514f5e3Sopenharmony_ci return JSTaggedValue(base::bit_cast<double>( 604514f5e3Sopenharmony_ci flagBit ^ (base::bit_cast<uint64_t>(base::POSITIVE_INFINITY)))); 614514f5e3Sopenharmony_ci } 624514f5e3Sopenharmony_ci return JSTaggedValue(dLeft / dRight); 634514f5e3Sopenharmony_ci } 644514f5e3Sopenharmony_ci return JSTaggedValue::Hole(); 654514f5e3Sopenharmony_ci} 664514f5e3Sopenharmony_ci 674514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::FastMod(JSTaggedValue left, JSTaggedValue right) 684514f5e3Sopenharmony_ci{ 694514f5e3Sopenharmony_ci if (right.IsInt() && left.IsInt()) { 704514f5e3Sopenharmony_ci int iRight = right.GetInt(); 714514f5e3Sopenharmony_ci int iLeft = left.GetInt(); 724514f5e3Sopenharmony_ci if (iRight > 0 && iLeft > 0) { 734514f5e3Sopenharmony_ci return JSTaggedValue(iLeft % iRight); 744514f5e3Sopenharmony_ci } 754514f5e3Sopenharmony_ci } 764514f5e3Sopenharmony_ci if (left.IsNumber() && right.IsNumber()) { 774514f5e3Sopenharmony_ci double dLeft = left.IsInt() ? left.GetInt() : left.GetDouble(); 784514f5e3Sopenharmony_ci double dRight = right.IsInt() ? right.GetInt() : right.GetDouble(); 794514f5e3Sopenharmony_ci if (dRight == 0.0 || std::isnan(dRight) || std::isnan(dLeft) || std::isinf(dLeft)) { 804514f5e3Sopenharmony_ci return JSTaggedValue(base::NAN_VALUE); 814514f5e3Sopenharmony_ci } 824514f5e3Sopenharmony_ci if (dLeft == 0.0 || std::isinf(dRight)) { 834514f5e3Sopenharmony_ci return JSTaggedValue(dLeft); 844514f5e3Sopenharmony_ci } 854514f5e3Sopenharmony_ci return JSTaggedValue(std::fmod(dLeft, dRight)); 864514f5e3Sopenharmony_ci } 874514f5e3Sopenharmony_ci return JSTaggedValue::Hole(); 884514f5e3Sopenharmony_ci} 894514f5e3Sopenharmony_ci 904514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::FastEqual(JSTaggedValue left, JSTaggedValue right) 914514f5e3Sopenharmony_ci{ 924514f5e3Sopenharmony_ci if (left == right) { 934514f5e3Sopenharmony_ci if (UNLIKELY(left.IsDouble())) { 944514f5e3Sopenharmony_ci return JSTaggedValue(!std::isnan(left.GetDouble())); 954514f5e3Sopenharmony_ci } 964514f5e3Sopenharmony_ci return JSTaggedValue::True(); 974514f5e3Sopenharmony_ci } 984514f5e3Sopenharmony_ci if (left.IsNumber()) { 994514f5e3Sopenharmony_ci if (left.IsInt() && right.IsInt()) { 1004514f5e3Sopenharmony_ci return JSTaggedValue::False(); 1014514f5e3Sopenharmony_ci } 1024514f5e3Sopenharmony_ci } 1034514f5e3Sopenharmony_ci if (right.IsUndefinedOrNull()) { 1044514f5e3Sopenharmony_ci if (left.IsUndefinedOrNull()) { 1054514f5e3Sopenharmony_ci return JSTaggedValue::True(); 1064514f5e3Sopenharmony_ci } 1074514f5e3Sopenharmony_ci return JSTaggedValue::False(); 1084514f5e3Sopenharmony_ci } 1094514f5e3Sopenharmony_ci if (left.IsUndefinedOrNull()) { 1104514f5e3Sopenharmony_ci return JSTaggedValue::False(); 1114514f5e3Sopenharmony_ci } 1124514f5e3Sopenharmony_ci if (left.IsBoolean()) { 1134514f5e3Sopenharmony_ci if (right.IsSpecial()) { 1144514f5e3Sopenharmony_ci return JSTaggedValue::False(); 1154514f5e3Sopenharmony_ci } 1164514f5e3Sopenharmony_ci } 1174514f5e3Sopenharmony_ci if (left.IsBigInt() && right.IsBigInt()) { 1184514f5e3Sopenharmony_ci return JSTaggedValue(BigInt::Equal(left, right)); 1194514f5e3Sopenharmony_ci } 1204514f5e3Sopenharmony_ci return JSTaggedValue::Hole(); 1214514f5e3Sopenharmony_ci} 1224514f5e3Sopenharmony_ci 1234514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::FastStrictEqual(JSTaggedValue left, JSTaggedValue right) 1244514f5e3Sopenharmony_ci{ 1254514f5e3Sopenharmony_ci if (left.IsNumber()) { 1264514f5e3Sopenharmony_ci if (right.IsNumber()) { 1274514f5e3Sopenharmony_ci double dLeft = left.IsInt() ? left.GetInt() : left.GetDouble(); 1284514f5e3Sopenharmony_ci double dRight = right.IsInt() ? right.GetInt() : right.GetDouble(); 1294514f5e3Sopenharmony_ci return JSTaggedValue::StrictNumberEquals(dLeft, dRight) ? JSTaggedValue::True() : JSTaggedValue::False(); 1304514f5e3Sopenharmony_ci } 1314514f5e3Sopenharmony_ci return JSTaggedValue::False(); 1324514f5e3Sopenharmony_ci } 1334514f5e3Sopenharmony_ci if (right.IsNumber()) { 1344514f5e3Sopenharmony_ci return JSTaggedValue::False(); 1354514f5e3Sopenharmony_ci } 1364514f5e3Sopenharmony_ci if (left == right) { 1374514f5e3Sopenharmony_ci return JSTaggedValue::True(); 1384514f5e3Sopenharmony_ci } 1394514f5e3Sopenharmony_ci if (left.IsString() && right.IsString()) { 1404514f5e3Sopenharmony_ci auto leftStr = static_cast<EcmaString *>(left.GetTaggedObject()); 1414514f5e3Sopenharmony_ci auto rightStr = static_cast<EcmaString *>(right.GetTaggedObject()); 1424514f5e3Sopenharmony_ci if (EcmaStringAccessor(leftStr).IsFlat() && EcmaStringAccessor(rightStr).IsFlat()) { 1434514f5e3Sopenharmony_ci return EcmaStringAccessor::StringsAreEqual(static_cast<EcmaString *>(left.GetTaggedObject()), 1444514f5e3Sopenharmony_ci static_cast<EcmaString *>(right.GetTaggedObject())) ? 1454514f5e3Sopenharmony_ci JSTaggedValue::True() : JSTaggedValue::False(); 1464514f5e3Sopenharmony_ci } 1474514f5e3Sopenharmony_ci return JSTaggedValue::Hole(); 1484514f5e3Sopenharmony_ci } 1494514f5e3Sopenharmony_ci if (left.IsBigInt()) { 1504514f5e3Sopenharmony_ci if (right.IsBigInt()) { 1514514f5e3Sopenharmony_ci return BigInt::Equal(left, right) ? JSTaggedValue::True() : JSTaggedValue::False(); 1524514f5e3Sopenharmony_ci } 1534514f5e3Sopenharmony_ci return JSTaggedValue::False(); 1544514f5e3Sopenharmony_ci } 1554514f5e3Sopenharmony_ci if (right.IsBigInt()) { 1564514f5e3Sopenharmony_ci return JSTaggedValue::False(); 1574514f5e3Sopenharmony_ci } 1584514f5e3Sopenharmony_ci return JSTaggedValue::False(); 1594514f5e3Sopenharmony_ci} 1604514f5e3Sopenharmony_ci 1614514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::CallGetter(JSThread *thread, JSTaggedValue receiver, JSTaggedValue holder, 1624514f5e3Sopenharmony_ci JSTaggedValue value) 1634514f5e3Sopenharmony_ci{ 1644514f5e3Sopenharmony_ci return ObjectFastOperator::CallGetter(thread, receiver, holder, value); 1654514f5e3Sopenharmony_ci} 1664514f5e3Sopenharmony_ci 1674514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::CallSetter(JSThread *thread, JSTaggedValue receiver, JSTaggedValue value, 1684514f5e3Sopenharmony_ci JSTaggedValue accessorValue) 1694514f5e3Sopenharmony_ci{ 1704514f5e3Sopenharmony_ci return ObjectFastOperator::CallSetter(thread, receiver, value, accessorValue); 1714514f5e3Sopenharmony_ci} 1724514f5e3Sopenharmony_ci 1734514f5e3Sopenharmony_citemplate<ObjectFastOperator::Status status> 1744514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::GetPropertyByIndex(JSThread *thread, JSTaggedValue receiver, uint32_t index) 1754514f5e3Sopenharmony_ci{ 1764514f5e3Sopenharmony_ci return ObjectFastOperator::GetPropertyByIndex<status>(thread, receiver, index); 1774514f5e3Sopenharmony_ci} 1784514f5e3Sopenharmony_ci 1794514f5e3Sopenharmony_citemplate<ObjectFastOperator::Status status> 1804514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::GetPropertyByValue(JSThread *thread, JSTaggedValue receiver, JSTaggedValue key) 1814514f5e3Sopenharmony_ci{ 1824514f5e3Sopenharmony_ci return ObjectFastOperator::GetPropertyByValue<status>(thread, receiver, key); 1834514f5e3Sopenharmony_ci} 1844514f5e3Sopenharmony_ci 1854514f5e3Sopenharmony_citemplate<ObjectFastOperator::Status status> 1864514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::GetPropertyByName(JSThread *thread, JSTaggedValue receiver, JSTaggedValue key) 1874514f5e3Sopenharmony_ci{ 1884514f5e3Sopenharmony_ci return ObjectFastOperator::GetPropertyByName<status>(thread, receiver, key); 1894514f5e3Sopenharmony_ci} 1904514f5e3Sopenharmony_ci 1914514f5e3Sopenharmony_citemplate<ObjectFastOperator::Status status> 1924514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::SetPropertyByName(JSThread *thread, JSTaggedValue receiver, JSTaggedValue key, 1934514f5e3Sopenharmony_ci JSTaggedValue value) 1944514f5e3Sopenharmony_ci{ 1954514f5e3Sopenharmony_ci [[maybe_unused]] EcmaHandleScope handleScope(thread); 1964514f5e3Sopenharmony_ci return ObjectFastOperator::SetPropertyByName<status>(thread, receiver, key, value); 1974514f5e3Sopenharmony_ci} 1984514f5e3Sopenharmony_ci 1994514f5e3Sopenharmony_citemplate<ObjectFastOperator::Status status> 2004514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::SetPropertyByIndex(JSThread *thread, JSTaggedValue receiver, uint32_t index, 2014514f5e3Sopenharmony_ci JSTaggedValue value) 2024514f5e3Sopenharmony_ci{ 2034514f5e3Sopenharmony_ci [[maybe_unused]] EcmaHandleScope handleScope(thread); 2044514f5e3Sopenharmony_ci return ObjectFastOperator::SetPropertyByIndex<status>(thread, receiver, index, value); 2054514f5e3Sopenharmony_ci} 2064514f5e3Sopenharmony_ci 2074514f5e3Sopenharmony_citemplate<ObjectFastOperator::Status status> 2084514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::SetPropertyByValue(JSThread *thread, JSTaggedValue receiver, JSTaggedValue key, 2094514f5e3Sopenharmony_ci JSTaggedValue value) 2104514f5e3Sopenharmony_ci{ 2114514f5e3Sopenharmony_ci [[maybe_unused]] EcmaHandleScope handleScope(thread); 2124514f5e3Sopenharmony_ci return ObjectFastOperator::SetPropertyByValue<status>(thread, receiver, key, value); 2134514f5e3Sopenharmony_ci} 2144514f5e3Sopenharmony_ci 2154514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::GetGlobalOwnProperty(JSThread *thread, JSTaggedValue receiver, JSTaggedValue key) 2164514f5e3Sopenharmony_ci{ 2174514f5e3Sopenharmony_ci JSObject *obj = JSObject::Cast(receiver); 2184514f5e3Sopenharmony_ci TaggedArray *properties = TaggedArray::Cast(obj->GetProperties().GetTaggedObject()); 2194514f5e3Sopenharmony_ci GlobalDictionary *dict = GlobalDictionary::Cast(properties); 2204514f5e3Sopenharmony_ci int entry = dict->FindEntry(key); 2214514f5e3Sopenharmony_ci if (entry != -1) { 2224514f5e3Sopenharmony_ci auto value = dict->GetValue(entry); 2234514f5e3Sopenharmony_ci if (UNLIKELY(value.IsAccessor())) { 2244514f5e3Sopenharmony_ci return CallGetter(thread, receiver, receiver, value); 2254514f5e3Sopenharmony_ci } 2264514f5e3Sopenharmony_ci ASSERT(!value.IsAccessor()); 2274514f5e3Sopenharmony_ci return value; 2284514f5e3Sopenharmony_ci } 2294514f5e3Sopenharmony_ci return JSTaggedValue::Hole(); 2304514f5e3Sopenharmony_ci} 2314514f5e3Sopenharmony_ci 2324514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::FastTypeOf(JSThread *thread, JSTaggedValue obj) 2334514f5e3Sopenharmony_ci{ 2344514f5e3Sopenharmony_ci INTERPRETER_TRACE(thread, FastTypeOf); 2354514f5e3Sopenharmony_ci const GlobalEnvConstants *globalConst = thread->GlobalConstants(); 2364514f5e3Sopenharmony_ci switch (obj.GetRawData()) { 2374514f5e3Sopenharmony_ci case JSTaggedValue::VALUE_TRUE: 2384514f5e3Sopenharmony_ci case JSTaggedValue::VALUE_FALSE: 2394514f5e3Sopenharmony_ci return globalConst->GetBooleanString(); 2404514f5e3Sopenharmony_ci case JSTaggedValue::VALUE_NULL: 2414514f5e3Sopenharmony_ci return globalConst->GetObjectString(); 2424514f5e3Sopenharmony_ci case JSTaggedValue::VALUE_UNDEFINED: 2434514f5e3Sopenharmony_ci return globalConst->GetUndefinedString(); 2444514f5e3Sopenharmony_ci default: 2454514f5e3Sopenharmony_ci if (obj.IsHeapObject()) { 2464514f5e3Sopenharmony_ci if (obj.IsString()) { 2474514f5e3Sopenharmony_ci return globalConst->GetStringString(); 2484514f5e3Sopenharmony_ci } 2494514f5e3Sopenharmony_ci if (obj.IsSymbol()) { 2504514f5e3Sopenharmony_ci return globalConst->GetSymbolString(); 2514514f5e3Sopenharmony_ci } 2524514f5e3Sopenharmony_ci if (obj.IsCallable()) { 2534514f5e3Sopenharmony_ci return globalConst->GetFunctionString(); 2544514f5e3Sopenharmony_ci } 2554514f5e3Sopenharmony_ci if (obj.IsBigInt()) { 2564514f5e3Sopenharmony_ci return globalConst->GetBigIntString(); 2574514f5e3Sopenharmony_ci } 2584514f5e3Sopenharmony_ci if (obj.IsNativeModuleFailureInfo()) { 2594514f5e3Sopenharmony_ci return globalConst->GetNativeModuleFailureInfoString(); 2604514f5e3Sopenharmony_ci } 2614514f5e3Sopenharmony_ci return globalConst->GetObjectString(); 2624514f5e3Sopenharmony_ci } 2634514f5e3Sopenharmony_ci if (obj.IsNumber()) { 2644514f5e3Sopenharmony_ci return globalConst->GetNumberString(); 2654514f5e3Sopenharmony_ci } 2664514f5e3Sopenharmony_ci } 2674514f5e3Sopenharmony_ci return globalConst->GetUndefinedString(); 2684514f5e3Sopenharmony_ci} 2694514f5e3Sopenharmony_ci 2704514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::NewLexicalEnv(JSThread *thread, ObjectFactory *factory, uint16_t numVars) 2714514f5e3Sopenharmony_ci{ 2724514f5e3Sopenharmony_ci INTERPRETER_TRACE(thread, NewLexicalEnv); 2734514f5e3Sopenharmony_ci [[maybe_unused]] EcmaHandleScope handleScope(thread); 2744514f5e3Sopenharmony_ci LexicalEnv *newEnv = factory->InlineNewLexicalEnv(numVars); 2754514f5e3Sopenharmony_ci if (UNLIKELY(newEnv == nullptr)) { 2764514f5e3Sopenharmony_ci return JSTaggedValue::Hole(); 2774514f5e3Sopenharmony_ci } 2784514f5e3Sopenharmony_ci JSTaggedValue currentLexenv = thread->GetCurrentLexenv(); 2794514f5e3Sopenharmony_ci newEnv->SetParentEnv(thread, currentLexenv); 2804514f5e3Sopenharmony_ci newEnv->SetScopeInfo(thread, JSTaggedValue::Hole()); 2814514f5e3Sopenharmony_ci return JSTaggedValue(newEnv); 2824514f5e3Sopenharmony_ci} 2834514f5e3Sopenharmony_ci 2844514f5e3Sopenharmony_ciJSTaggedValue FastRuntimeStub::NewThisObject(JSThread *thread, JSTaggedValue ctor, JSTaggedValue newTarget, 2854514f5e3Sopenharmony_ci InterpretedFrame *state) 2864514f5e3Sopenharmony_ci{ 2874514f5e3Sopenharmony_ci [[maybe_unused]] EcmaHandleScope handleScope(thread); 2884514f5e3Sopenharmony_ci ObjectFactory *factory = thread->GetEcmaVM()->GetFactory(); 2894514f5e3Sopenharmony_ci 2904514f5e3Sopenharmony_ci JSHandle<JSFunction> ctorHandle(thread, ctor); 2914514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> newTargetHandle(thread, newTarget); 2924514f5e3Sopenharmony_ci JSHandle<JSObject> obj = factory->NewJSObjectByConstructor(ctorHandle, newTargetHandle); 2934514f5e3Sopenharmony_ci RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, JSTaggedValue::Exception()); 2944514f5e3Sopenharmony_ci 2954514f5e3Sopenharmony_ci Method *method = Method::Cast(ctorHandle->GetMethod().GetTaggedObject()); 2964514f5e3Sopenharmony_ci state->function = ctorHandle.GetTaggedValue(); 2974514f5e3Sopenharmony_ci state->constpool = method->GetConstantPool(); 2984514f5e3Sopenharmony_ci state->profileTypeInfo = ctorHandle->GetProfileTypeInfo(); 2994514f5e3Sopenharmony_ci state->env = ctorHandle->GetLexicalEnv(); 3004514f5e3Sopenharmony_ci 3014514f5e3Sopenharmony_ci return obj.GetTaggedValue(); 3024514f5e3Sopenharmony_ci} 3034514f5e3Sopenharmony_ci} // namespace panda::ecmascript 3044514f5e3Sopenharmony_ci#endif // ECMASCRIPT_INTERPRETER_FAST_RUNTIME_STUB_INL_H 305