1 /*
2 * Copyright (c) 2024 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_gc.h"
17 #include "ecmascript/mem/concurrent_marker.h"
18 #include "ecmascript/mem/heap-inl.h"
19
20 namespace panda::ecmascript::builtins {
GetFreeHeapSize(EcmaRuntimeCallInfo * info)21 JSTaggedValue BuiltinsGc::GetFreeHeapSize(EcmaRuntimeCallInfo *info)
22 {
23 auto *heap = info->GetThread()->GetEcmaVM()->GetHeap();
24 auto size = heap->GetHeapLimitSize() - heap->GetHeapObjectSize();
25 return JSTaggedValue(static_cast<int64_t>(size));
26 }
27
GetReservedHeapSize(EcmaRuntimeCallInfo * info)28 JSTaggedValue BuiltinsGc::GetReservedHeapSize(EcmaRuntimeCallInfo *info)
29 {
30 auto *heap = info->GetThread()->GetEcmaVM()->GetHeap();
31 return JSTaggedValue(static_cast<int64_t>(heap->GetHeapLimitSize()));
32 }
33
GetUsedHeapSize(EcmaRuntimeCallInfo * info)34 JSTaggedValue BuiltinsGc::GetUsedHeapSize(EcmaRuntimeCallInfo *info)
35 {
36 auto *heap = info->GetThread()->GetEcmaVM()->GetHeap();
37 return JSTaggedValue(static_cast<int64_t>(heap->GetHeapObjectSize()));
38 }
39
GetObjectAddress(EcmaRuntimeCallInfo * info)40 JSTaggedValue BuiltinsGc::GetObjectAddress(EcmaRuntimeCallInfo *info)
41 {
42 JSHandle<JSTaggedValue> h = GetCallArg(info, 0);
43 return JSTaggedValue(reinterpret_cast<int64_t>(h->GetHeapObject()));
44 }
45
GetObjectSpaceType(EcmaRuntimeCallInfo * info)46 JSTaggedValue BuiltinsGc::GetObjectSpaceType(EcmaRuntimeCallInfo *info)
47 {
48 JSHandle<JSTaggedValue> h = GetCallArg(info, 0);
49 auto *region = Region::ObjectAddressToRange(h->GetHeapObject());
50 return JSTaggedValue(region->GetSpaceType());
51 }
52
RegisterNativeAllocation(EcmaRuntimeCallInfo * info)53 JSTaggedValue BuiltinsGc::RegisterNativeAllocation(EcmaRuntimeCallInfo *info)
54 {
55 JSHandle<JSTaggedValue> h = GetCallArg(info, 0);
56 auto *heap = const_cast<Heap *>(info->GetThread()->GetEcmaVM()->GetHeap());
57 auto size = h->GetInt();
58 if (size < 0) {
59 auto *thread = info->GetThread();
60 THROW_RANGE_ERROR_AND_RETURN(thread, "The value must be non negative", JSTaggedValue::Exception());
61 }
62 heap->IncreaseNativeBindingSize(size);
63 heap->TryTriggerFullMarkOrGCByNativeSize();
64 if (heap->GetConcurrentMarker()->IsTriggeredConcurrentMark()) {
65 heap->WaitConcurrentMarkingFinished();
66 heap->GetConcurrentMarker()->HandleMarkingFinished();
67 }
68 return JSTaggedValue::Undefined();
69 }
70
RegisterNativeFree(EcmaRuntimeCallInfo * info)71 JSTaggedValue BuiltinsGc::RegisterNativeFree(EcmaRuntimeCallInfo *info)
72 {
73 JSHandle<JSTaggedValue> h = GetCallArg(info, 0);
74 auto *heap = const_cast<Heap *>(info->GetThread()->GetEcmaVM()->GetHeap());
75 auto size = h->GetInt();
76 if (size < 0) {
77 auto *thread = info->GetThread();
78 THROW_RANGE_ERROR_AND_RETURN(thread, "The value must be non negative", JSTaggedValue::Exception());
79 }
80 auto allocated = heap->GetNativeBindingSize();
81 heap->DecreaseNativeBindingSize(std::min(allocated, static_cast<size_t>(size)));
82 return JSTaggedValue::Undefined();
83 }
84 } // namespace panda::ecmascript::builtins
85