1 /* 2 * Copyright (c) 2021 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 ECMASCRIPT_MEM_ASSERT_SCOPE_H 17 #define ECMASCRIPT_MEM_ASSERT_SCOPE_H 18 19 #include <optional> 20 21 #include "ecmascript/common.h" 22 #include "libpandabase/utils/bit_field.h" 23 24 namespace panda::ecmascript { 25 26 #ifndef NDEBUG 27 constexpr bool IS_ALLOW_CHECK = true; 28 #else 29 constexpr bool IS_ALLOW_CHECK = false; 30 #endif 31 32 enum class AssertType : uint8_t { 33 GARBAGE_COLLECTION_ASSERT = 0, 34 HEAP_ALLOC_ASSERT, 35 HANDLE_ALLOC_ASSERT, 36 DEREF_HANDLE_ASSERT, 37 LOCAL_TO_SHARE_WEAK_REF_ASSERT, 38 LAST_ASSERT_TYPE 39 }; 40 41 template<AssertType type, bool isAllow, bool IsDebug = IS_ALLOW_CHECK> 42 class PUBLIC_API AssertScopeT { 43 public: 44 static bool IsAllowed(); 45 }; 46 47 template<AssertType type, bool isAllow> 48 class PUBLIC_API AssertScopeT<type, isAllow, true> { 49 public: 50 AssertScopeT(); 51 52 ~AssertScopeT(); 53 54 static bool IsAllowed(); 55 56 private: 57 std::optional<size_t> oldData_; 58 }; 59 60 [[maybe_unused]] void ForceResetAssertData(); 61 62 using DisallowGarbageCollection = AssertScopeT<AssertType::GARBAGE_COLLECTION_ASSERT, false, IS_ALLOW_CHECK>; 63 using AllowGarbageCollection = AssertScopeT<AssertType::GARBAGE_COLLECTION_ASSERT, true, IS_ALLOW_CHECK>; 64 using DisAllowHeapAlloc = AssertScopeT<AssertType::HEAP_ALLOC_ASSERT, false, IS_ALLOW_CHECK>; 65 using AllowHeapAlloc = AssertScopeT<AssertType::HEAP_ALLOC_ASSERT, true, IS_ALLOW_CHECK>; 66 using DisAllowHandleAllocation = AssertScopeT<AssertType::HANDLE_ALLOC_ASSERT, false, IS_ALLOW_CHECK>; 67 using AllowHandleAllocation = AssertScopeT<AssertType::HANDLE_ALLOC_ASSERT, true, IS_ALLOW_CHECK>; 68 using DisAllowDeRefHandle = AssertScopeT<AssertType::DEREF_HANDLE_ASSERT, false, IS_ALLOW_CHECK>; 69 using AllowDeRefHandle = AssertScopeT<AssertType::DEREF_HANDLE_ASSERT, true, IS_ALLOW_CHECK>; 70 using DisAllowLocalToShareWeakRefHandle = AssertScopeT<AssertType::LOCAL_TO_SHARE_WEAK_REF_ASSERT, 71 false, IS_ALLOW_CHECK>; 72 using AllowLocalToShareWeakRefHandle = AssertScopeT<AssertType::LOCAL_TO_SHARE_WEAK_REF_ASSERT, 73 true, IS_ALLOW_CHECK>; 74 #if (!defined NDEBUG) || (defined RUN_TEST) 75 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 76 #define DISALLOW_GARBAGE_COLLECTION [[maybe_unused]] DisallowGarbageCollection noGc 77 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 78 #define ALLOW_GARBAGE_COLLECTION [[maybe_unused]] AllowGarbageCollection allowGc 79 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 80 #define DISALLOW_HEAP_ALLOC [[maybe_unused]] DisAllowHeapAlloc noHeapAlloc 81 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 82 #define ALLOW_HEAP_ALLOC [[maybe_unused]] AllowHeapAlloc allowHeapAlloc 83 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 84 #define DISALLOW_HANDLE_ALLOC [[maybe_unused]] DisAllowHandleAllocation disAllowHandleAlloc 85 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 86 #define ALLOW_HANDLE_ALLOC [[maybe_unused]] AllowHandleAllocation allowHandleAlloc 87 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 88 #define DISALLOW_DEREF_HANDLE [[maybe_unused]] DisAllowDeRefHandle disAllowDeRefHandle 89 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 90 #define ALLOW_DEREF_HANDLE [[maybe_unused]] AllowDeRefHandle allowDeRefHandle 91 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 92 #define DISALLOW_LOCAL_TO_SHARE_WEAK_REF_HANDLE \ 93 [[maybe_unused]] DisAllowLocalToShareWeakRefHandle disAllowLocalToShareWeakRefHandle 94 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 95 #define ALLOW_LOCAL_TO_SHARE_WEAK_REF_HANDLE \ 96 [[maybe_unused]] AllowLocalToShareWeakRefHandle allowLocalToShareRefHandle 97 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 98 #define DISALLOW_HEAP_ACCESS \ 99 DISALLOW_HEAP_ALLOC; \ 100 DISALLOW_HANDLE_ALLOC; \ 101 DISALLOW_DEREF_HANDLE; 102 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 103 #define ALLOW_HEAP_ACCESS \ 104 ALLOW_HEAP_ALLOC; \ 105 ALLOW_HANDLE_ALLOC; \ 106 ALLOW_DEREF_HANDLE; 107 #else 108 #define DISALLOW_GARBAGE_COLLECTION 109 #define ALLOW_GARBAGE_COLLECTION 110 #define DISALLOW_HEAP_ALLOC 111 #define ALLOW_HEAP_ALLOC 112 #define DISALLOW_HANDLE_ALLOC 113 #define ALLOW_HANDLE_ALLOC 114 #define DISALLOW_HEAP_ACCESS 115 #define ALLOW_HEAP_ACCESS 116 #define DISALLOW_DEREF_HANDLE 117 #define ALLOW_DEREF_HANDLE 118 #define DISALLOW_LOCAL_TO_SHARE_WEAK_REF_HANDLE 119 #define ALLOW_LOCAL_TO_SHARE_WEAK_REF_HANDLE 120 #endif 121 122 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 123 #define CHECK_NO_GC ASSERT_PRINT(AllowGarbageCollection::IsAllowed(), "disallow execute garbage collection.") 124 125 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 126 #define CHECK_NO_HEAP_ALLOC ASSERT_PRINT(AllowHeapAlloc::IsAllowed(), "disallow execute heap alloc.") 127 128 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 129 #define CHECK_NO_HANDLE_ALLOC ASSERT_PRINT(AllowHandleAllocation::IsAllowed(), "disallow execute handle alloc.") 130 131 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 132 #define CHECK_NO_DEREF_HANDLE ASSERT_PRINT(AllowDeRefHandle::IsAllowed(), "disallow execute deref handle.") 133 134 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 135 #define CHECK_NO_LOCAL_TO_SHARE_WEAK_REF_HANDLE \ 136 ASSERT_PRINT(AllowLocalToShareWeakRefHandle::IsAllowed(), "disallow local to share weak ref handle.") 137 } // namespace panda::ecmascript 138 139 #endif // ECMASCRIPT_MEM_ASSERT_SCOPE_H 140