From: Soeren Apel Date: Fri, 3 Jul 2020 13:45:30 +0000 (+0200) Subject: DecodeSignal: Don't use exceptions for regular program flow X-Git-Url: http://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=1774d669023d26029bbc19ac6c3f5a564ab1fed4 DecodeSignal: Don't use exceptions for regular program flow Doing so makes debugging exceptions more difficult. --- diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index 98275bad..6c193789 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -395,18 +395,20 @@ int64_t DecodeSignal::get_working_sample_count(uint32_t segment_id) const for (const decode::DecodeChannel& ch : channels_) if (ch.assigned_signal) { + if (!ch.assigned_signal->logic_data()) + return 0; + no_signals_assigned = false; const shared_ptr logic_data = ch.assigned_signal->logic_data(); - if (!logic_data || logic_data->logic_segments().empty()) + if (logic_data->logic_segments().empty()) return 0; - try { - const shared_ptr segment = logic_data->logic_segments().at(segment_id); - count = min(count, (int64_t)segment->get_sample_count()); - } catch (out_of_range&) { + if (segment_id >= logic_data->logic_segments().size()) return 0; - } + + const shared_ptr segment = logic_data->logic_segments()[segment_id]; + count = min(count, (int64_t)segment->get_sample_count()); } return (no_signals_assigned ? 0 : count); @@ -513,18 +515,14 @@ void DecodeSignal::get_annotation_subset(deque &dest, uint32_t DecodeSignal::get_binary_data_chunk_count(uint32_t segment_id, const Decoder* dec, uint32_t bin_class_id) const { - if (segments_.size() == 0) + if ((segments_.size() == 0) || (segment_id >= segments_.size())) return 0; - try { - const DecodeSegment *segment = &(segments_.at(segment_id)); + const DecodeSegment *segment = &(segments_[segment_id]); - for (const DecodeBinaryClass& bc : segment->binary_classes) - if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) - return bc.chunks.size(); - } catch (out_of_range&) { - // Do nothing - } + for (const DecodeBinaryClass& bc : segment->binary_classes) + if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) + return bc.chunks.size(); return 0; } @@ -533,18 +531,17 @@ void DecodeSignal::get_binary_data_chunk(uint32_t segment_id, const Decoder* dec, uint32_t bin_class_id, uint32_t chunk_id, const vector **dest, uint64_t *size) { - try { - const DecodeSegment *segment = &(segments_.at(segment_id)); + if (segment_id >= segments_.size()) + return; - for (const DecodeBinaryClass& bc : segment->binary_classes) - if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) { - if (dest) *dest = &(bc.chunks.at(chunk_id).data); - if (size) *size = bc.chunks.at(chunk_id).data.size(); - return; - } - } catch (out_of_range&) { - // Do nothing - } + const DecodeSegment *segment = &(segments_[segment_id]); + + for (const DecodeBinaryClass& bc : segment->binary_classes) + if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) { + if (dest) *dest = &(bc.chunks.at(chunk_id).data); + if (size) *size = bc.chunks.at(chunk_id).data.size(); + return; + } } void DecodeSignal::get_merged_binary_data_chunks_by_sample(uint32_t segment_id, @@ -553,39 +550,38 @@ void DecodeSignal::get_merged_binary_data_chunks_by_sample(uint32_t segment_id, { assert(dest != nullptr); - try { - const DecodeSegment *segment = &(segments_.at(segment_id)); - - const DecodeBinaryClass* bin_class = nullptr; - for (const DecodeBinaryClass& bc : segment->binary_classes) - if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) - bin_class = &bc; - - // Determine overall size before copying to resize dest vector only once - uint64_t size = 0; - uint64_t matches = 0; - for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) - if ((chunk.sample >= start_sample) && (chunk.sample < end_sample)) { - size += chunk.data.size(); - matches++; - } - dest->resize(size); - - uint64_t offset = 0; - uint64_t matches2 = 0; - for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) - if ((chunk.sample >= start_sample) && (chunk.sample < end_sample)) { - memcpy(dest->data() + offset, chunk.data.data(), chunk.data.size()); - offset += chunk.data.size(); - matches2++; - - // Make sure we don't overwrite memory if the array grew in the meanwhile - if (matches2 == matches) - break; - } - } catch (out_of_range&) { - // Do nothing - } + if (segment_id >= segments_.size()) + return; + + const DecodeSegment *segment = &(segments_[segment_id]); + + const DecodeBinaryClass* bin_class = nullptr; + for (const DecodeBinaryClass& bc : segment->binary_classes) + if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) + bin_class = &bc; + + // Determine overall size before copying to resize dest vector only once + uint64_t size = 0; + uint64_t matches = 0; + for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) + if ((chunk.sample >= start_sample) && (chunk.sample < end_sample)) { + size += chunk.data.size(); + matches++; + } + dest->resize(size); + + uint64_t offset = 0; + uint64_t matches2 = 0; + for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) + if ((chunk.sample >= start_sample) && (chunk.sample < end_sample)) { + memcpy(dest->data() + offset, chunk.data.data(), chunk.data.size()); + offset += chunk.data.size(); + matches2++; + + // Make sure we don't overwrite memory if the array grew in the meanwhile + if (matches2 == matches) + break; + } } void DecodeSignal::get_merged_binary_data_chunks_by_offset(uint32_t segment_id, @@ -594,54 +590,52 @@ void DecodeSignal::get_merged_binary_data_chunks_by_offset(uint32_t segment_id, { assert(dest != nullptr); - try { - const DecodeSegment *segment = &(segments_.at(segment_id)); - - const DecodeBinaryClass* bin_class = nullptr; - for (const DecodeBinaryClass& bc : segment->binary_classes) - if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) - bin_class = &bc; - - // Determine overall size before copying to resize dest vector only once - uint64_t size = 0; - uint64_t offset = 0; - for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) { - if (offset >= start) - size += chunk.data.size(); - offset += chunk.data.size(); - if (offset >= end) - break; - } - dest->resize(size); - - offset = 0; - uint64_t dest_offset = 0; - for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) { - if (offset >= start) { - memcpy(dest->data() + dest_offset, chunk.data.data(), chunk.data.size()); - dest_offset += chunk.data.size(); - } - offset += chunk.data.size(); - if (offset >= end) - break; + if (segment_id >= segments_.size()) + return; + + const DecodeSegment *segment = &(segments_[segment_id]); + + const DecodeBinaryClass* bin_class = nullptr; + for (const DecodeBinaryClass& bc : segment->binary_classes) + if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) + bin_class = &bc; + + // Determine overall size before copying to resize dest vector only once + uint64_t size = 0; + uint64_t offset = 0; + for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) { + if (offset >= start) + size += chunk.data.size(); + offset += chunk.data.size(); + if (offset >= end) + break; + } + dest->resize(size); + + offset = 0; + uint64_t dest_offset = 0; + for (const DecodeBinaryDataChunk& chunk : bin_class->chunks) { + if (offset >= start) { + memcpy(dest->data() + dest_offset, chunk.data.data(), chunk.data.size()); + dest_offset += chunk.data.size(); } - } catch (out_of_range&) { - // Do nothing + offset += chunk.data.size(); + if (offset >= end) + break; } } const DecodeBinaryClass* DecodeSignal::get_binary_data_class(uint32_t segment_id, const Decoder* dec, uint32_t bin_class_id) const { - try { - const DecodeSegment *segment = &(segments_.at(segment_id)); + if (segment_id >= segments_.size()) + return nullptr; - for (const DecodeBinaryClass& bc : segment->binary_classes) - if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) - return &bc; - } catch (out_of_range&) { - // Do nothing - } + const DecodeSegment *segment = &(segments_[segment_id]); + + for (const DecodeBinaryClass& bc : segment->binary_classes) + if ((bc.decoder == dec) && (bc.info->bin_class_id == bin_class_id)) + return &bc; return nullptr; } @@ -649,14 +643,12 @@ const DecodeBinaryClass* DecodeSignal::get_binary_data_class(uint32_t segment_id const deque* DecodeSignal::get_all_annotations_by_segment( uint32_t segment_id) const { - try { - const DecodeSegment *segment = &(segments_.at(segment_id)); - return &(segment->all_annotations); - } catch (out_of_range&) { - // Do nothing - } + if (segment_id >= segments_.size()) + return nullptr; - return nullptr; + const DecodeSegment *segment = &(segments_[segment_id]); + + return &(segment->all_annotations); } void DecodeSignal::save_settings(QSettings &settings) const