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