@@ -196,11 +196,13 @@ std::vector<int> parse_version(const std::string& version) {
196196 std::string part;
197197 while (std::getline (ss, part, ' .' )) {
198198 if (!part.empty ()) {
199- try {
200- result.push_back (std::stoi (part));
201- } catch (...) {
202- // Ignore non-numeric parts
199+ // Parse without exceptions
200+ char * end = nullptr ;
201+ long val = std::strtol (part.c_str (), &end, 10 );
202+ if (end != part.c_str ()) {
203+ result.push_back (static_cast <int >(val));
203204 }
205+ // Ignore non-numeric parts
204206 }
205207 }
206208 return result;
@@ -338,73 +340,71 @@ bool MicroarchitectureDatabase::load_from_file(const std::string& path) {
338340}
339341
340342bool MicroarchitectureDatabase::load_from_json_internal (const void * json_ptr) {
341- try {
342- const nlohmann::json& j = *static_cast <const nlohmann::json*>(json_ptr);
343-
344- // Parse microarchitectures
345- if (j.contains (" microarchitectures" )) {
346- const auto & uarchs = j[" microarchitectures" ];
347- for (auto it = uarchs.begin (); it != uarchs.end (); ++it) {
348- fill_target (it.key (), &it.value ());
349- }
343+ const nlohmann::json& j = *static_cast <const nlohmann::json*>(json_ptr);
344+
345+ if (j.is_discarded ()) {
346+ return false ;
347+ }
348+
349+ // Parse microarchitectures
350+ if (j.contains (" microarchitectures" )) {
351+ const auto & uarchs = j[" microarchitectures" ];
352+ for (auto it = uarchs.begin (); it != uarchs.end (); ++it) {
353+ fill_target (it.key (), &it.value ());
350354 }
355+ }
356+
357+ // Parse feature aliases
358+ if (j.contains (" feature_aliases" )) {
359+ const auto & aliases = j[" feature_aliases" ];
360+ for (auto it = aliases.begin (); it != aliases.end (); ++it) {
361+ const auto & alias_data = it.value ();
362+ std::set<std::string> features;
351363
352- // Parse feature aliases
353- if (j.contains (" feature_aliases" )) {
354- const auto & aliases = j[" feature_aliases" ];
355- for (auto it = aliases.begin (); it != aliases.end (); ++it) {
356- const auto & alias_data = it.value ();
357- std::set<std::string> features;
358-
359- if (alias_data.contains (" any_of" )) {
360- for (const auto & f : alias_data[" any_of" ]) {
361- features.insert (f.get <std::string>());
362- }
363- feature_aliases_[it.key ()] = features;
364+ if (alias_data.contains (" any_of" )) {
365+ for (const auto & f : alias_data[" any_of" ]) {
366+ features.insert (f.get <std::string>());
364367 }
368+ feature_aliases_[it.key ()] = features;
369+ }
365370
366- if (alias_data.contains (" families" )) {
367- std::set<std::string> families;
368- for (const auto & f : alias_data[" families" ]) {
369- families.insert (f.get <std::string>());
370- }
371- family_features_[it.key ()] = families;
371+ if (alias_data.contains (" families" )) {
372+ std::set<std::string> families;
373+ for (const auto & f : alias_data[" families" ]) {
374+ families.insert (f.get <std::string>());
372375 }
376+ family_features_[it.key ()] = families;
373377 }
374378 }
379+ }
375380
376- // Parse conversions
377- if (j.contains (" conversions" )) {
378- const auto & conv = j[" conversions" ];
381+ // Parse conversions
382+ if (j.contains (" conversions" )) {
383+ const auto & conv = j[" conversions" ];
379384
380- if (conv.contains (" darwin_flags" )) {
381- for (auto it = conv[" darwin_flags" ].begin (); it != conv[" darwin_flags" ].end ();
382- ++it) {
383- darwin_flags_[it.key ()] = it.value ().get <std::string>();
384- }
385+ if (conv.contains (" darwin_flags" )) {
386+ for (auto it = conv[" darwin_flags" ].begin (); it != conv[" darwin_flags" ].end (); ++it) {
387+ darwin_flags_[it.key ()] = it.value ().get <std::string>();
385388 }
389+ }
386390
387- if (conv.contains (" arm_vendors" )) {
388- for (auto it = conv[" arm_vendors" ].begin (); it != conv[" arm_vendors" ].end (); ++it) {
389- arm_vendors_[it.key ()] = it.value ().get <std::string>();
390- }
391+ if (conv.contains (" arm_vendors" )) {
392+ for (auto it = conv[" arm_vendors" ].begin (); it != conv[" arm_vendors" ].end (); ++it) {
393+ arm_vendors_[it.key ()] = it.value ().get <std::string>();
391394 }
392395 }
393-
394- loaded_ = true ;
395- return true ;
396- } catch (const std::exception& e) {
397- return false ;
398396 }
397+
398+ loaded_ = true ;
399+ return true ;
399400}
400401
401402bool MicroarchitectureDatabase::load_from_string (const std::string& json_data) {
402- try {
403- nlohmann::json j = nlohmann::json::parse (json_data);
404- return load_from_json_internal (&j);
405- } catch (const std::exception& e) {
403+ nlohmann::json j = nlohmann::json::parse (json_data, nullptr , false );
404+ if (j.is_discarded ()) {
406405 return false ;
407406 }
407+ return load_from_json_internal (&j);
408408}
409409
410410void MicroarchitectureDatabase::fill_target (const std::string& name, const void * json_ptr) {
0 commit comments