Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(435)

Unified Diff: tools/gn/parse_tree.cc

Issue 2509333003: Change GN to disallow reading args defined in the same declare_args() call. (Closed)
Patch Set: initial patch for review Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/gn/parse_tree.cc
diff --git a/tools/gn/parse_tree.cc b/tools/gn/parse_tree.cc
index ecc438b245aee02c62551efaee117796786dc02f..17f9396290a85b28eb87e6d821380d55d2ccc0ac 100644
--- a/tools/gn/parse_tree.cc
+++ b/tools/gn/parse_tree.cc
@@ -487,13 +487,31 @@ const IdentifierNode* IdentifierNode::AsIdentifier() const {
}
Value IdentifierNode::Execute(Scope* scope, Err* err) const {
- const Value* value = scope->GetValue(value_.value(), true);
+ const Scope *found_in_scope = nullptr;
brettw 2016/11/18 22:07:43 Put the * next to the type like you do for Value b
Dirk Pranke 2016/11/18 22:35:40 ack.
+ const Value* value = scope->GetValueWithScope(value_.value(), true,
+ &found_in_scope);
Value result;
if (!value) {
*err = MakeErrorDescribing("Undefined identifier");
return result;
}
+ // Check that the scope that contains the defined value and the
brettw 2016/11/18 22:07:43 I think it would be easier to follow if this was i
Dirk Pranke 2016/11/18 22:35:39 Acknowledged.
+ // current scope are not part of the same declare_args() block, in
+ // order to prevent reading a value that might be overridden later.
+ const Scope *found_args_scope = nullptr;
+ if (found_in_scope)
+ found_in_scope->GetProperty(&kInDeclareArgsKey, &found_args_scope);
+
+ const Scope* cur_args_scope = nullptr;
+ scope->GetProperty(&kInDeclareArgsKey, &cur_args_scope);
+ if (found_args_scope && cur_args_scope &&
+ (found_args_scope == cur_args_scope)) {
+ *err = MakeErrorDescribing(
+ "Reading a variable defined in the same declare_args() call.");
+ return result;
+ }
+
result = *value;
result.set_origin(this);
return result;
« tools/gn/functions.cc ('K') | « tools/gn/functions.cc ('k') | tools/gn/scope.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698