• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2022-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 #ifndef PANDA_PLUGINS_ETS_RUNTIME_MEM_ETS_REFERENCE_H
17 #define PANDA_PLUGINS_ETS_RUNTIME_MEM_ETS_REFERENCE_H
18 
19 #include "libpandabase/macros.h"
20 #include "runtime/mem/refstorage/reference.h"
21 #include "runtime/mem/refstorage/reference_storage.h"
22 #include "plugins/ets/runtime/napi/ets_napi.h"
23 #include "plugins/ets/runtime/types/ets_class.h"
24 #include "plugins/ets/runtime/types/ets_object.h"
25 
26 namespace ark::ets {
27 class EtsReference final {
28 public:
29     DEFAULT_COPY_SEMANTIC(EtsReference);
30     DEFAULT_MOVE_SEMANTIC(EtsReference);
31     EtsReference() = default;
32     ~EtsReference() = default;
33 
34     using EtsObjectType = mem::Reference::ObjectType;
35 
IsStack()36     bool IsStack() const
37     {
38         return GetReference()->IsStack();
39     }
40 
IsLocal()41     bool IsLocal() const
42     {
43         return GetReference()->IsLocal();
44     }
45 
IsGlobal()46     bool IsGlobal() const
47     {
48         return GetReference()->IsGlobal();
49     }
50 
IsWeak()51     bool IsWeak() const
52     {
53         return GetReference()->IsWeak();
54     }
55 
CastToReference(EtsReference * etsRef)56     static mem::Reference *CastToReference(EtsReference *etsRef)
57     {
58         return reinterpret_cast<mem::Reference *>(etsRef);
59     }
60 
CastFromReference(mem::Reference * ref)61     static EtsReference *CastFromReference(mem::Reference *ref)
62     {
63         return reinterpret_cast<EtsReference *>(ref);
64     }
65 
66 private:
GetReference()67     const mem::Reference *GetReference() const
68     {
69         return reinterpret_cast<const mem::Reference *>(this);
70     }
71 };
72 
EtsObjectToEtsRef(ets_object obj)73 [[maybe_unused]] static inline EtsReference *EtsObjectToEtsRef(ets_object obj)
74 {
75     return reinterpret_cast<EtsReference *>(obj);
76 }
77 
EtsRefToEtsObject(EtsReference * ref)78 [[maybe_unused]] static inline ets_object EtsRefToEtsObject(EtsReference *ref)
79 {
80     return reinterpret_cast<ets_object>(ref);
81 }
82 
EtsNapiWeakToEtsRef(ets_object obj)83 [[maybe_unused]] static inline EtsReference *EtsNapiWeakToEtsRef(ets_object obj)
84 {
85     auto ref = reinterpret_cast<EtsReference *>(obj);
86     ASSERT(ref->IsWeak());
87     return ref;
88 }
89 
EtsRefToEtsNapiWeak(EtsReference * ref)90 [[maybe_unused]] static inline ets_object EtsRefToEtsNapiWeak(EtsReference *ref)
91 {
92     ASSERT(ref->IsWeak());
93     return reinterpret_cast<ets_object>(ref);
94 }
95 
96 class EtsReferenceStorage final : private mem::ReferenceStorage {
97 public:
EtsReferenceStorage(mem::GlobalObjectStorage * globalStorage,mem::InternalAllocatorPtr allocator,bool refCheckValidate)98     EtsReferenceStorage(mem::GlobalObjectStorage *globalStorage, mem::InternalAllocatorPtr allocator,
99                         bool refCheckValidate)
100         : mem::ReferenceStorage(globalStorage, allocator, refCheckValidate)
101     {
102     }
103     ~EtsReferenceStorage() = default;
104 
105     NO_COPY_SEMANTIC(EtsReferenceStorage);
106     NO_MOVE_SEMANTIC(EtsReferenceStorage);
107 
NewEtsStackRef(EtsObject ** obj)108     static EtsReference *NewEtsStackRef(EtsObject **obj)
109     {
110         mem::Reference *ref = mem::ReferenceStorage::NewStackRef(reinterpret_cast<ObjectHeader **>(obj));
111         return EtsReference::CastFromReference(ref);
112     }
113 
NewEtsRef(EtsObject * obj,EtsReference::EtsObjectType objType)114     EtsReference *NewEtsRef(EtsObject *obj, EtsReference::EtsObjectType objType)
115     {
116         mem::Reference *ref = NewRef(obj->GetCoreType(), objType);
117         return EtsReference::CastFromReference(ref);
118     }
119 
RemoveEtsRef(EtsReference * etsRef)120     void RemoveEtsRef(EtsReference *etsRef)
121     {
122         RemoveRef(EtsReference::CastToReference(etsRef));
123     }
124 
GetEtsObject(EtsReference * etsRef)125     [[nodiscard]] EtsObject *GetEtsObject(EtsReference *etsRef)
126     {
127         return EtsObject::FromCoreType(GetObject(EtsReference::CastToReference(etsRef)));
128     }
129 
IsValidEtsRef(EtsReference * etsRef)130     [[nodiscard]] bool IsValidEtsRef(EtsReference *etsRef)
131     {
132         return IsValidRef(EtsReference::CastToReference(etsRef));
133     }
134 
PushLocalEtsFrame(uint32_t capacity)135     bool PushLocalEtsFrame(uint32_t capacity)
136     {
137         return PushLocalFrame(capacity);
138     }
139 
PopLocalEtsFrame(EtsReference * result)140     EtsReference *PopLocalEtsFrame(EtsReference *result)
141     {
142         return EtsReference::CastFromReference(PopLocalFrame(EtsReference::CastToReference(result)));
143     }
144 
GetAsReferenceStorage()145     mem::ReferenceStorage *GetAsReferenceStorage()
146     {
147         return this;
148     }
149 };
150 }  // namespace ark::ets
151 
152 #endif  // PANDA_PLUGINS_ETS_RUNTIME_MEM_ETS_REFERENCE_H
153