| Index: tools/gn/builder.cc
|
| diff --git a/tools/gn/builder.cc b/tools/gn/builder.cc
|
| index 50a027b389de3352afe54e67329c9ed2310a980e..d498b108e1bf02d9cc1198c1c676d66b68c2f463 100644
|
| --- a/tools/gn/builder.cc
|
| +++ b/tools/gn/builder.cc
|
| @@ -228,7 +228,7 @@ bool Builder::TargetDefined(BuilderRecord* record, Err* err) {
|
|
|
| if (!AddDeps(record, target->deps(), err) ||
|
| !AddDeps(record, target->datadeps(), err) ||
|
| - !AddDeps(record, target->configs(), err) ||
|
| + !AddDeps(record, target->configs().vector(), err) ||
|
| !AddDeps(record, target->all_dependent_configs(), err) ||
|
| !AddDeps(record, target->direct_dependent_configs(), err) ||
|
| !AddToolchainDep(record, target, err))
|
| @@ -337,6 +337,19 @@ bool Builder::AddDeps(BuilderRecord* record,
|
| }
|
|
|
| bool Builder::AddDeps(BuilderRecord* record,
|
| + const UniqueVector<LabelConfigPair>& configs,
|
| + Err* err) {
|
| + for (size_t i = 0; i < configs.size(); i++) {
|
| + BuilderRecord* dep_record = GetOrCreateRecordOfType(
|
| + configs[i].label, configs[i].origin, BuilderRecord::ITEM_CONFIG, err);
|
| + if (!dep_record)
|
| + return false;
|
| + record->AddDep(dep_record);
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +bool Builder::AddDeps(BuilderRecord* record,
|
| const LabelTargetVector& targets,
|
| Err* err) {
|
| for (size_t i = 0; i < targets.size(); i++) {
|
| @@ -440,16 +453,16 @@ bool Builder::ResolveDeps(LabelTargetVector* deps, Err* err) {
|
| return true;
|
| }
|
|
|
| -bool Builder::ResolveConfigs(LabelConfigVector* configs, Err* err) {
|
| +bool Builder::ResolveConfigs(UniqueVector<LabelConfigPair>* configs, Err* err) {
|
| for (size_t i = 0; i < configs->size(); i++) {
|
| - LabelConfigPair& cur = (*configs)[i];
|
| + const LabelConfigPair& cur = (*configs)[i];
|
| DCHECK(!cur.ptr);
|
|
|
| BuilderRecord* record = GetResolvedRecordOfType(
|
| cur.label, cur.origin, BuilderRecord::ITEM_CONFIG, err);
|
| if (!record)
|
| return false;
|
| - cur.ptr = record->item()->AsConfig();
|
| + const_cast<LabelConfigPair&>(cur).ptr = record->item()->AsConfig();
|
| }
|
| return true;
|
| }
|
| @@ -458,14 +471,18 @@ bool Builder::ResolveConfigs(LabelConfigVector* configs, Err* err) {
|
| // have their configs forwarded.
|
| bool Builder::ResolveForwardDependentConfigs(Target* target, Err* err) {
|
| const LabelTargetVector& deps = target->deps();
|
| - LabelTargetVector& configs = target->forward_dependent_configs();
|
| + const UniqueVector<LabelTargetPair>& configs =
|
| + target->forward_dependent_configs();
|
|
|
| // Assume that the lists are small so that brute-force n^2 is appropriate.
|
| for (size_t config_i = 0; config_i < configs.size(); config_i++) {
|
| for (size_t dep_i = 0; dep_i < deps.size(); dep_i++) {
|
| if (configs[config_i].label == deps[dep_i].label) {
|
| DCHECK(deps[dep_i].ptr); // Should already be resolved.
|
| - configs[config_i].ptr = deps[dep_i].ptr;
|
| + // UniqueVector's contents are constant so uniqueness is preserved, but
|
| + // we want to update this pointer which doesn't change uniqueness
|
| + // (uniqueness in this vector is determined by the label only).
|
| + const_cast<LabelTargetPair&>(configs[config_i]).ptr = deps[dep_i].ptr;
|
| break;
|
| }
|
| }
|
|
|