summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Cole Faust <colefaust@google.com> 2021-12-21 14:15:12 -0800
committer Cole Faust <colefaust@google.com> 2021-12-21 14:34:51 -0800
commitf7ed5343de735232c14b9cb92a16bb4b82ebc385 (patch)
tree05b0373f70a671288e8f596ea0a068832a5b6998
parent68542bfcb5674a0e2661407c03563f6a90a9243c (diff)
Prevent duplicate entries in ctx.include_tops
The include_tops hints are global for the whole parse context (which is probably also something to fix), which means that if an include_top hint is duplicated there will be duplicated keys generated in the _entry starlark dictionary. Bug: 193566316 Test: go test Change-Id: I01a0546ac9be91ef46c5248e87e1a40e0f211193
-rw-r--r--mk2rbc/mk2rbc.go7
-rw-r--r--mk2rbc/mk2rbc_test.go34
2 files changed, 41 insertions, 0 deletions
diff --git a/mk2rbc/mk2rbc.go b/mk2rbc/mk2rbc.go
index 024311e0e..2a80e560e 100644
--- a/mk2rbc/mk2rbc.go
+++ b/mk2rbc/mk2rbc.go
@@ -1629,6 +1629,13 @@ func (ctx *parseContext) maybeHandleAnnotation(cnode *mkparser.Comment) {
return
}
if p, ok := maybeTrim(annotation, "include_top"); ok {
+ // Don't allow duplicate include tops, because then we will generate
+ // invalid starlark code. (duplicate keys in the _entry dictionary)
+ for _, top := range ctx.includeTops {
+ if top == p {
+ return
+ }
+ }
ctx.includeTops = append(ctx.includeTops, p)
return
}
diff --git a/mk2rbc/mk2rbc_test.go b/mk2rbc/mk2rbc_test.go
index 94c4fe6fa..1e53c3071 100644
--- a/mk2rbc/mk2rbc_test.go
+++ b/mk2rbc/mk2rbc_test.go
@@ -1078,6 +1078,40 @@ def init(g, handle):
`,
},
{
+ desc: "Dynamic inherit with duplicated hint",
+ mkname: "product.mk",
+ in: `
+MY_PATH:=foo
+#RBC# include_top vendor/foo1
+$(call inherit-product,$(MY_PATH)/cfg.mk)
+#RBC# include_top vendor/foo1
+$(call inherit-product,$(MY_PATH)/cfg.mk)
+`,
+ expected: `load("//build/make/core:product_config.rbc", "rblf")
+load("//vendor/foo1:cfg.star|init", _cfg_init = "init")
+
+def init(g, handle):
+ cfg = rblf.cfg(handle)
+ g["MY_PATH"] = "foo"
+ #RBC# include_top vendor/foo1
+ _entry = {
+ "vendor/foo1/cfg.mk": ("_cfg", _cfg_init),
+ }.get("%s/cfg.mk" % g["MY_PATH"])
+ (_varmod, _varmod_init) = _entry if _entry else (None, None)
+ if not _varmod_init:
+ rblf.mkerror("cannot")
+ rblf.inherit(handle, _varmod, _varmod_init)
+ #RBC# include_top vendor/foo1
+ _entry = {
+ "vendor/foo1/cfg.mk": ("_cfg", _cfg_init),
+ }.get("%s/cfg.mk" % g["MY_PATH"])
+ (_varmod, _varmod_init) = _entry if _entry else (None, None)
+ if not _varmod_init:
+ rblf.mkerror("cannot")
+ rblf.inherit(handle, _varmod, _varmod_init)
+`,
+ },
+ {
desc: "Ignore make rules",
mkname: "product.mk",
in: `