14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2024 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_BUILTINS_BUILTINS_GC_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_BUILTINS_BUILTINS_GC_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include "ecmascript/base/builtins_base.h"
204514f5e3Sopenharmony_ci#include "ecmascript/js_thread.h"
214514f5e3Sopenharmony_ci
224514f5e3Sopenharmony_cinamespace panda::ecmascript::builtins {
234514f5e3Sopenharmony_ciclass BuiltinsGc : public base::BuiltinsBase {
244514f5e3Sopenharmony_cipublic:
254514f5e3Sopenharmony_ci    static JSTaggedValue GetFreeHeapSize(EcmaRuntimeCallInfo *info);
264514f5e3Sopenharmony_ci
274514f5e3Sopenharmony_ci    static JSTaggedValue GetReservedHeapSize(EcmaRuntimeCallInfo *info);
284514f5e3Sopenharmony_ci
294514f5e3Sopenharmony_ci    static JSTaggedValue GetUsedHeapSize(EcmaRuntimeCallInfo *info);
304514f5e3Sopenharmony_ci
314514f5e3Sopenharmony_ci    static JSTaggedValue GetObjectAddress(EcmaRuntimeCallInfo *info);
324514f5e3Sopenharmony_ci
334514f5e3Sopenharmony_ci    static JSTaggedValue GetObjectSpaceType(EcmaRuntimeCallInfo *info);
344514f5e3Sopenharmony_ci
354514f5e3Sopenharmony_ci    static JSTaggedValue RegisterNativeAllocation(EcmaRuntimeCallInfo *info);
364514f5e3Sopenharmony_ci
374514f5e3Sopenharmony_ci    static JSTaggedValue RegisterNativeFree(EcmaRuntimeCallInfo *info);
384514f5e3Sopenharmony_ci
394514f5e3Sopenharmony_ci    static JSTaggedValue WaitForFinishGC(EcmaRuntimeCallInfo *info);
404514f5e3Sopenharmony_ci
414514f5e3Sopenharmony_ci    static JSTaggedValue StartGC(EcmaRuntimeCallInfo *info);
424514f5e3Sopenharmony_ci
434514f5e3Sopenharmony_ci    static JSTaggedValue AllocateArrayObject(EcmaRuntimeCallInfo *info);
444514f5e3Sopenharmony_ci
454514f5e3Sopenharmony_ci    static Span<const base::BuiltinFunctionEntry> GetGcFunctions()
464514f5e3Sopenharmony_ci    {
474514f5e3Sopenharmony_ci        return Span<const base::BuiltinFunctionEntry>(GC_FUNCTIONS);
484514f5e3Sopenharmony_ci    }
494514f5e3Sopenharmony_ci
504514f5e3Sopenharmony_ciprivate:
514514f5e3Sopenharmony_ci#define BUILTINS_GC_FUNCTION_ENTRY(name, method, length, id) \
524514f5e3Sopenharmony_ci    base::BuiltinFunctionEntry::Create(name, BuiltinsGc::method, length, kungfu::BuiltinsStubCSigns::id),
534514f5e3Sopenharmony_ci
544514f5e3Sopenharmony_ci// List of functions in ArkTools.GC, extension of JS engine.
554514f5e3Sopenharmony_ci// where BuiltinsGc::func refers to the native implementation of GC[name].
564514f5e3Sopenharmony_ci//       kungfu::BuiltinsStubCSigns::stubIndex refers to the builtin stub index, or INVALID if no stub available.
574514f5e3Sopenharmony_ci
584514f5e3Sopenharmony_ci    static constexpr std::array GC_FUNCTIONS = {
594514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("getFreeHeapSize",             GetFreeHeapSize,               0, INVALID)
604514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("getReservedHeapSize",         GetReservedHeapSize,           0, INVALID)
614514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("getUsedHeapSize",             GetUsedHeapSize,               0, INVALID)
624514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("getObjectAddress",            GetObjectAddress,              1, INVALID)
634514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("getObjectSpaceType",          GetObjectSpaceType,            1, INVALID)
644514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("registerNativeAllocation",    RegisterNativeAllocation,      1, INVALID)
654514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("registerNativeFree",          RegisterNativeFree,            1, INVALID)
664514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("waitForFinishGC",             WaitForFinishGC,               1, INVALID)
674514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("startGC",                     StartGC,                       3, INVALID)
684514f5e3Sopenharmony_ci        BUILTINS_GC_FUNCTION_ENTRY("allocateArrayObject",         AllocateArrayObject,           1, INVALID)
694514f5e3Sopenharmony_ci    };
704514f5e3Sopenharmony_ci#undef BUILTINS_GC_FUNCTION_ENTRY
714514f5e3Sopenharmony_ci
724514f5e3Sopenharmony_ci    static void WaitAndHandleConcurrentMarkingFinished(Heap *heap);
734514f5e3Sopenharmony_ci    static TriggerGCType StringToGcType(JSThread *thread, JSTaggedValue cause);
744514f5e3Sopenharmony_ci};
754514f5e3Sopenharmony_ci}  // namespace panda::ecmascript::builtins
764514f5e3Sopenharmony_ci
774514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_BUILTINS_BUILTINS_GC_H
78