Merge "Check missing uncoditionally loaded missing modules at runtime"

This commit is contained in:
Alexander Smundak
2022-01-14 17:56:27 +00:00
committed by Gerrit Code Review
3 changed files with 50 additions and 26 deletions

View File

@@ -254,19 +254,19 @@ func (gctx *generationContext) emitPreamble() {
gctx.writef("load(%q, %q)", baseUri, baseName) gctx.writef("load(%q, %q)", baseUri, baseName)
// Emit exactly one load statement for each URI. // Emit exactly one load statement for each URI.
loadedSubConfigs := make(map[string]string) loadedSubConfigs := make(map[string]string)
for _, sc := range gctx.starScript.inherited { for _, mi := range gctx.starScript.inherited {
uri := sc.path uri := mi.path
if m, ok := loadedSubConfigs[uri]; ok { if m, ok := loadedSubConfigs[uri]; ok {
// No need to emit load statement, but fix module name. // No need to emit load statement, but fix module name.
sc.moduleLocalName = m mi.moduleLocalName = m
continue continue
} }
if sc.optional { if mi.optional || mi.missing {
uri += "|init" uri += "|init"
} }
gctx.newLine() gctx.newLine()
gctx.writef("load(%q, %s = \"init\")", uri, sc.entryName()) gctx.writef("load(%q, %s = \"init\")", uri, mi.entryName())
loadedSubConfigs[uri] = sc.moduleLocalName loadedSubConfigs[uri] = mi.moduleLocalName
} }
gctx.write("\n") gctx.write("\n")
} }
@@ -298,6 +298,20 @@ func (gctx *generationContext) emitConversionError(el ErrorLocation, message str
gctx.writef(`rblf.mk2rbc_error("%s", %q)`, el, message) gctx.writef(`rblf.mk2rbc_error("%s", %q)`, el, message)
} }
func (gctx *generationContext) emitLoadCheck(im inheritedModule) {
if !im.needsLoadCheck() {
return
}
gctx.newLine()
gctx.writef("if not %s:", im.entryName())
gctx.indentLevel++
gctx.newLine()
gctx.write(`rblf.mkerror("`, gctx.starScript.mkFile, `", "Cannot find %s" % (`)
im.pathExpr().emit(gctx)
gctx.write("))")
gctx.indentLevel--
}
type knownVariable struct { type knownVariable struct {
name string name string
class varClass class varClass
@@ -751,11 +765,13 @@ func (ctx *parseContext) newDependentModule(path string, optional bool) *moduleI
moduleLocalName += fmt.Sprintf("%d", n) moduleLocalName += fmt.Sprintf("%d", n)
} }
ctx.moduleNameCount[moduleName] = n + 1 ctx.moduleNameCount[moduleName] = n + 1
_, err := fs.Stat(ctx.script.sourceFS, path)
mi := &moduleInfo{ mi := &moduleInfo{
path: modulePath, path: modulePath,
originalPath: path, originalPath: path,
moduleLocalName: moduleLocalName, moduleLocalName: moduleLocalName,
optional: optional, optional: optional,
missing: err != nil,
} }
ctx.dependentModules[modulePath] = mi ctx.dependentModules[modulePath] = mi
ctx.script.inherited = append(ctx.script.inherited, mi) ctx.script.inherited = append(ctx.script.inherited, mi)

View File

@@ -121,7 +121,7 @@ $(call inherit-product, part.mk)
ifdef PRODUCT_NAME ifdef PRODUCT_NAME
$(call inherit-product, part1.mk) $(call inherit-product, part1.mk)
else # Comment else # Comment
$(call inherit-product, $(LOCAL_PATH)/part1.mk) $(call inherit-product, $(LOCAL_PATH)/part.mk)
endif endif
`, `,
expected: `load("//build/make/core:product_config.rbc", "rblf") expected: `load("//build/make/core:product_config.rbc", "rblf")
@@ -132,10 +132,12 @@ def init(g, handle):
cfg = rblf.cfg(handle) cfg = rblf.cfg(handle)
rblf.inherit(handle, "part", _part_init) rblf.inherit(handle, "part", _part_init)
if g.get("PRODUCT_NAME") != None: if g.get("PRODUCT_NAME") != None:
if not _part1_init:
rblf.mkerror("product.mk", "Cannot find %s" % (":part1.star"))
rblf.inherit(handle, "part1", _part1_init) rblf.inherit(handle, "part1", _part1_init)
else: else:
# Comment # Comment
rblf.inherit(handle, "part1", _part1_init) rblf.inherit(handle, "part", _part_init)
`, `,
}, },
{ {
@@ -173,6 +175,8 @@ def init(g, handle):
cfg = rblf.cfg(handle) cfg = rblf.cfg(handle)
_part_init(g, handle) _part_init(g, handle)
if g.get("PRODUCT_NAME") != None: if g.get("PRODUCT_NAME") != None:
if not _part1_init:
rblf.mkerror("product.mk", "Cannot find %s" % (":part1.star"))
_part1_init(g, handle) _part1_init(g, handle)
else: else:
if _part1_init != None: if _part1_init != None:

View File

@@ -47,6 +47,7 @@ type moduleInfo struct {
originalPath string // Makefile file path originalPath string // Makefile file path
moduleLocalName string moduleLocalName string
optional bool optional bool
missing bool // a module may not exist if a module that depends on it is loaded dynamically
} }
func (im moduleInfo) entryName() string { func (im moduleInfo) entryName() string {
@@ -57,7 +58,8 @@ type inheritedModule interface {
name() string name() string
entryName() string entryName() string
emitSelect(gctx *generationContext) emitSelect(gctx *generationContext)
shouldExist() bool pathExpr() starlarkExpr
needsLoadCheck() bool
} }
type inheritedStaticModule struct { type inheritedStaticModule struct {
@@ -72,8 +74,12 @@ func (im inheritedStaticModule) name() string {
func (im inheritedStaticModule) emitSelect(_ *generationContext) { func (im inheritedStaticModule) emitSelect(_ *generationContext) {
} }
func (im inheritedStaticModule) shouldExist() bool { func (im inheritedStaticModule) pathExpr() starlarkExpr {
return im.loadAlways return &stringLiteralExpr{im.path}
}
func (im inheritedStaticModule) needsLoadCheck() bool {
return im.missing
} }
type inheritedDynamicModule struct { type inheritedDynamicModule struct {
@@ -105,20 +111,14 @@ func (i inheritedDynamicModule) emitSelect(gctx *generationContext) {
gctx.write(")") gctx.write(")")
gctx.newLine() gctx.newLine()
gctx.writef("(%s, %s) = _entry if _entry else (None, None)", i.name(), i.entryName()) gctx.writef("(%s, %s) = _entry if _entry else (None, None)", i.name(), i.entryName())
if i.loadAlways {
gctx.newLine()
gctx.writef("if not %s:", i.entryName())
gctx.indentLevel++
gctx.newLine()
gctx.write(`rblf.mkerror("`, gctx.starScript.mkFile, `", "Cannot find %s" % (`)
i.path.emit(gctx)
gctx.write("))")
gctx.indentLevel--
}
} }
func (i inheritedDynamicModule) shouldExist() bool { func (i inheritedDynamicModule) pathExpr() starlarkExpr {
return i.loadAlways return &i.path
}
func (i inheritedDynamicModule) needsLoadCheck() bool {
return true
} }
type inheritNode struct { type inheritNode struct {
@@ -128,20 +128,22 @@ type inheritNode struct {
func (inn *inheritNode) emit(gctx *generationContext) { func (inn *inheritNode) emit(gctx *generationContext) {
// Unconditional case: // Unconditional case:
// maybe check that loaded
// rblf.inherit(handle, <module>, module_init) // rblf.inherit(handle, <module>, module_init)
// Conditional case: // Conditional case:
// if <module>_init != None: // if <module>_init != None:
// same as above // same as above
inn.module.emitSelect(gctx) inn.module.emitSelect(gctx)
name := inn.module.name() name := inn.module.name()
entry := inn.module.entryName() entry := inn.module.entryName()
gctx.newLine()
if inn.loadAlways { if inn.loadAlways {
gctx.emitLoadCheck(inn.module)
gctx.newLine()
gctx.writef("%s(handle, %s, %s)", cfnInherit, name, entry) gctx.writef("%s(handle, %s, %s)", cfnInherit, name, entry)
return return
} }
gctx.newLine()
gctx.writef("if %s:", entry) gctx.writef("if %s:", entry)
gctx.indentLevel++ gctx.indentLevel++
gctx.newLine() gctx.newLine()
@@ -157,12 +159,14 @@ type includeNode struct {
func (inn *includeNode) emit(gctx *generationContext) { func (inn *includeNode) emit(gctx *generationContext) {
inn.module.emitSelect(gctx) inn.module.emitSelect(gctx)
entry := inn.module.entryName() entry := inn.module.entryName()
gctx.newLine()
if inn.loadAlways { if inn.loadAlways {
gctx.emitLoadCheck(inn.module)
gctx.newLine()
gctx.writef("%s(g, handle)", entry) gctx.writef("%s(g, handle)", entry)
return return
} }
gctx.newLine()
gctx.writef("if %s != None:", entry) gctx.writef("if %s != None:", entry)
gctx.indentLevel++ gctx.indentLevel++
gctx.newLine() gctx.newLine()