mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-26 23:01:05 +08:00
194e23910c
From cl/304219049: Optimize C++11 range-based for loops where the variable is copied in each iteration but it would suffice to obtain it by const reference. This is only applied to loop variables of types that are expensive to copy which means they are not trivially copyable or have a non-trivial copy constructor or destructor. To ensure that it is safe to replace the copy with a const reference, the following heuristic is employed: - The loop variable is const qualified. - The loop variable is not const, but only const methods or operators are invoked on it, or it is used as const reference or value argument in constructors or function calls. Change-Id: I5755eb523f60744079b0eb50424395079dcb0f02 Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/2132844 Reviewed-by: Joshua Peraza <jperaza@chromium.org> Commit-Queue: Mark Mentovai <mark@chromium.org>
88 lines
2.9 KiB
C++
88 lines
2.9 KiB
C++
// Copyright 2017 The Crashpad Authors. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#include "handler/minidump_to_upload_parameters.h"
|
|
|
|
#include "base/logging.h"
|
|
#include "client/annotation.h"
|
|
#include "snapshot/module_snapshot.h"
|
|
#include "snapshot/process_snapshot.h"
|
|
#include "util/stdlib/map_insert.h"
|
|
|
|
namespace crashpad {
|
|
|
|
namespace {
|
|
|
|
void InsertOrReplaceMapEntry(std::map<std::string, std::string>* map,
|
|
const std::string& key,
|
|
const std::string& value) {
|
|
std::string old_value;
|
|
if (!MapInsertOrReplace(map, key, value, &old_value)) {
|
|
LOG(WARNING) << "duplicate key " << key << ", discarding value "
|
|
<< old_value;
|
|
}
|
|
}
|
|
|
|
} // namespace
|
|
|
|
std::map<std::string, std::string> BreakpadHTTPFormParametersFromMinidump(
|
|
const ProcessSnapshot* process_snapshot) {
|
|
std::map<std::string, std::string> parameters =
|
|
process_snapshot->AnnotationsSimpleMap();
|
|
|
|
std::string list_annotations;
|
|
for (const ModuleSnapshot* module : process_snapshot->Modules()) {
|
|
for (const auto& kv : module->AnnotationsSimpleMap()) {
|
|
if (!parameters.insert(kv).second) {
|
|
LOG(WARNING) << "duplicate key " << kv.first << ", discarding value "
|
|
<< kv.second;
|
|
}
|
|
}
|
|
|
|
for (const std::string& annotation : module->AnnotationsVector()) {
|
|
list_annotations.append(annotation);
|
|
list_annotations.append("\n");
|
|
}
|
|
|
|
for (const AnnotationSnapshot& annotation : module->AnnotationObjects()) {
|
|
if (annotation.type != static_cast<uint16_t>(Annotation::Type::kString)) {
|
|
continue;
|
|
}
|
|
|
|
std::string value(reinterpret_cast<const char*>(annotation.value.data()),
|
|
annotation.value.size());
|
|
std::pair<std::string, std::string> entry(annotation.name, value);
|
|
if (!parameters.insert(entry).second) {
|
|
LOG(WARNING) << "duplicate annotation name " << annotation.name
|
|
<< ", discarding value " << value;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!list_annotations.empty()) {
|
|
// Remove the final newline character.
|
|
list_annotations.resize(list_annotations.size() - 1);
|
|
|
|
InsertOrReplaceMapEntry(¶meters, "list_annotations", list_annotations);
|
|
}
|
|
|
|
UUID client_id;
|
|
process_snapshot->ClientID(&client_id);
|
|
InsertOrReplaceMapEntry(¶meters, "guid", client_id.ToString());
|
|
|
|
return parameters;
|
|
}
|
|
|
|
} // namespace crashpad
|