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 PANDA_LIBPANDAFILE_CODE_DATA_ACCESSOR_INL_H_ 17 #define PANDA_LIBPANDAFILE_CODE_DATA_ACCESSOR_INL_H_ 18 19 #include "code_data_accessor.h" 20 21 namespace panda::panda_file { 22 23 template <class Callback> EnumerateCatchBlocks(const Callback & cb)24inline void CodeDataAccessor::TryBlock::EnumerateCatchBlocks(const Callback &cb) 25 { 26 auto sp = catch_blocks_sp_; 27 for (size_t i = 0; i < num_catches_; i++) { 28 CatchBlock catch_block(sp); 29 if (!cb(catch_block)) { 30 return; 31 } 32 sp = sp.SubSpan(catch_block.GetSize()); 33 } 34 size_ = sp.data() - data_.data(); 35 } 36 SkipCatchBlocks()37inline void CodeDataAccessor::TryBlock::SkipCatchBlocks() 38 { 39 EnumerateCatchBlocks([](const CatchBlock & /* unused */) { return true; }); 40 } 41 42 template <class Callback> EnumerateTryBlocks(const Callback & cb)43inline void CodeDataAccessor::EnumerateTryBlocks(const Callback &cb) 44 { 45 auto sp = try_blocks_sp_; 46 for (size_t i = 0; i < tries_size_; i++) { 47 TryBlock try_block(sp); 48 if (!cb(try_block)) { 49 return; 50 } 51 sp = sp.SubSpan(try_block.GetSize()); 52 } 53 size_ = panda_file_.GetIdFromPointer(sp.data()).GetOffset() - code_id_.GetOffset(); 54 } 55 SkipTryBlocks()56inline void CodeDataAccessor::SkipTryBlocks() 57 { 58 EnumerateTryBlocks([](const TryBlock & /* unused */) { return true; }); 59 } 60 61 } // namespace panda::panda_file 62 63 #endif // PANDA_LIBPANDAFILE_CODE_DATA_ACCESSOR_INL_H_ 64