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 using DisallowGarbageCollection = AssertScopeT<AssertType::GARBAGE_COLLECTION_ASSERT, false, IS_ALLOW_CHECK>; 61 using AllowGarbageCollection = AssertScopeT<AssertType::GARBAGE_COLLECTION_ASSERT, true, IS_ALLOW_CHECK>; 62 using DisAllowHeapAlloc = AssertScopeT<AssertType::HEAP_ALLOC_ASSERT, false, IS_ALLOW_CHECK>; 63 using AllowHeapAlloc = AssertScopeT<AssertType::HEAP_ALLOC_ASSERT, true, IS_ALLOW_CHECK>; 64 using DisAllowHandleAllocation = AssertScopeT<AssertType::HANDLE_ALLOC_ASSERT, false, IS_ALLOW_CHECK>; 65 using AllowHandleAllocation = AssertScopeT<AssertType::HANDLE_ALLOC_ASSERT, true, IS_ALLOW_CHECK>; 66 using DisAllowDeRefHandle = AssertScopeT<AssertType::DEREF_HANDLE_ASSERT, false, IS_ALLOW_CHECK>; 67 using AllowDeRefHandle = AssertScopeT<AssertType::DEREF_HANDLE_ASSERT, true, IS_ALLOW_CHECK>; 68 using DisAllowLocalToShareWeakRefHandle = AssertScopeT<AssertType::LOCAL_TO_SHARE_WEAK_REF_ASSERT, 69 false, IS_ALLOW_CHECK>; 70 using AllowLocalToShareWeakRefHandle = AssertScopeT<AssertType::LOCAL_TO_SHARE_WEAK_REF_ASSERT, 71 true, IS_ALLOW_CHECK>; 72 #if (!defined NDEBUG) || (defined RUN_TEST) 73 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 74 #define DISALLOW_GARBAGE_COLLECTION [[maybe_unused]] DisallowGarbageCollection noGc 75 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 76 #define ALLOW_GARBAGE_COLLECTION [[maybe_unused]] AllowGarbageCollection allowGc 77 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 78 #define DISALLOW_HEAP_ALLOC [[maybe_unused]] DisAllowHeapAlloc noHeapAlloc 79 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 80 #define ALLOW_HEAP_ALLOC [[maybe_unused]] AllowHeapAlloc allowHeapAlloc 81 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 82 #define DISALLOW_HANDLE_ALLOC [[maybe_unused]] DisAllowHandleAllocation disAllowHandleAlloc 83 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 84 #define ALLOW_HANDLE_ALLOC [[maybe_unused]] AllowHandleAllocation allowHandleAlloc 85 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 86 #define DISALLOW_DEREF_HANDLE [[maybe_unused]] DisAllowDeRefHandle disAllowDeRefHandle 87 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 88 #define ALLOW_DEREF_HANDLE [[maybe_unused]] AllowDeRefHandle allowDeRefHandle 89 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 90 #define DISALLOW_LOCAL_TO_SHARE_WEAK_REF_HANDLE \ 91 [[maybe_unused]] DisAllowLocalToShareWeakRefHandle disAllowLocalToShareWeakRefHandle 92 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 93 #define ALLOW_LOCAL_TO_SHARE_WEAK_REF_HANDLE \ 94 [[maybe_unused]] AllowLocalToShareWeakRefHandle allowLocalToShareRefHandle 95 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 96 #define DISALLOW_HEAP_ACCESS \ 97 DISALLOW_HEAP_ALLOC; \ 98 DISALLOW_HANDLE_ALLOC; \ 99 DISALLOW_DEREF_HANDLE; 100 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 101 #define ALLOW_HEAP_ACCESS \ 102 ALLOW_HEAP_ALLOC; \ 103 ALLOW_HANDLE_ALLOC; \ 104 ALLOW_DEREF_HANDLE; 105 #else 106 #define DISALLOW_GARBAGE_COLLECTION 107 #define ALLOW_GARBAGE_COLLECTION 108 #define DISALLOW_HEAP_ALLOC 109 #define ALLOW_HEAP_ALLOC 110 #define DISALLOW_HANDLE_ALLOC 111 #define ALLOW_HANDLE_ALLOC 112 #define DISALLOW_HEAP_ACCESS 113 #define ALLOW_HEAP_ACCESS 114 #define DISALLOW_DEREF_HANDLE 115 #define ALLOW_DEREF_HANDLE 116 #define DISALLOW_LOCAL_TO_SHARE_WEAK_REF_HANDLE 117 #define ALLOW_LOCAL_TO_SHARE_WEAK_REF_HANDLE 118 #endif 119 120 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 121 #define CHECK_NO_GC ASSERT_PRINT(AllowGarbageCollection::IsAllowed(), "disallow execute garbage collection.") 122 // Some checks failed, need to check and fix 123 #undef CHECK_NO_GC 124 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 125 #define CHECK_NO_GC static_cast<void>(0) 126 127 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 128 #define CHECK_NO_HEAP_ALLOC ASSERT_PRINT(AllowHeapAlloc::IsAllowed(), "disallow execute heap alloc.") 129 130 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 131 #define CHECK_NO_HANDLE_ALLOC ASSERT_PRINT(AllowHandleAllocation::IsAllowed(), "disallow execute handle alloc.") 132 133 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 134 #define CHECK_NO_DEREF_HANDLE ASSERT_PRINT(AllowDeRefHandle::IsAllowed(), "disallow execute deref handle.") 135 136 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 137 #define CHECK_NO_LOCAL_TO_SHARE_WEAK_REF_HANDLE \ 138 ASSERT_PRINT(AllowLocalToShareWeakRefHandle::IsAllowed(), "disallow local to share weak ref handle.") 139 } // namespace panda::ecmascript 140 141 #endif // ECMASCRIPT_MEM_ASSERT_SCOPE_H 142