options: early convert project default options to dictionary

This makes it possible to remove all list cases from first_handle_prefix
and callees.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2025-05-05 13:20:16 +02:00 committed by Dylan Baker
parent e092bed1a4
commit 82bcab13d3
1 changed files with 17 additions and 33 deletions

View File

@ -1222,24 +1222,15 @@ class OptionStore:
perproject_global_options.append(strvaluetuple)
return (global_options, perproject_global_options, project_options)
def optlist2optdict(self, optlist: T.List[str]) -> T.Dict[str, str]:
optdict = {}
def optlist2optdict(self, optlist: T.List[str]) -> OptionStringLikeDict:
optdict: OptionStringLikeDict = {}
for p in optlist:
k, v = p.split('=', 1)
optdict[k] = v
return optdict
def prefix_split_options(self, coll: T.Union[T.List[str], OptionStringLikeDict]) -> T.Tuple[str, T.Union[T.List[str], OptionStringLikeDict]]:
def prefix_split_options(self, coll: OptionStringLikeDict) -> T.Tuple[str, OptionStringLikeDict]:
prefix = None
if isinstance(coll, list):
others: T.List[str] = []
for e in coll:
if e.startswith('prefix='):
prefix = e.split('=', 1)[1]
else:
others.append(e)
return (prefix, others)
else:
others_d: OptionStringLikeDict = {}
for k, v in coll.items():
if isinstance(k, OptionKey) and k.name == 'prefix':
@ -1251,11 +1242,11 @@ class OptionStore:
return (prefix, others_d)
def first_handle_prefix(self,
project_default_options: T.Union[T.List[str], OptionStringLikeDict],
project_default_options: OptionStringLikeDict,
cmd_line_options: OptionStringLikeDict,
machine_file_options: T.Mapping[OptionKey, ElementaryOptionValues]) \
-> T.Tuple[T.Union[T.List[str], OptionStringLikeDict],
T.Union[T.List[str], OptionStringLikeDict],
-> T.Tuple[OptionStringLikeDict,
OptionStringLikeDict,
T.MutableMapping[OptionKey, ElementaryOptionValues]]:
# Copy to avoid later mutation
nopref_machine_file_options = T.cast(
@ -1294,16 +1285,11 @@ class OptionStore:
cmd_line_options_in: OptionStringLikeDict,
machine_file_options_in: T.Mapping[OptionKey, ElementaryOptionValues]) -> None:
first_invocation = True
if isinstance(project_default_options_in, list):
project_default_options_in = self.optlist2optdict(project_default_options_in)
(project_default_options, cmd_line_options, machine_file_options) = self.first_handle_prefix(project_default_options_in,
cmd_line_options_in,
machine_file_options_in)
if isinstance(project_default_options, str):
project_default_options = [project_default_options]
if isinstance(project_default_options, list):
project_default_options = self.optlist2optdict(project_default_options) # type: ignore [assignment]
if project_default_options is None:
project_default_options = {}
assert isinstance(machine_file_options, dict)
for key, valstr in machine_file_options.items():
# Due to backwards compatibility we ignore all build-machine options
# when building natively.
@ -1320,7 +1306,6 @@ class OptionStore:
self.set_option(proj_key, valstr, first_invocation)
else:
self.pending_options[key] = valstr
assert isinstance(project_default_options, dict)
for keystr, valstr in project_default_options.items():
# Ths is complicated by the fact that a string can have two meanings:
#
@ -1356,7 +1341,6 @@ class OptionStore:
self.set_option(proj_key, valstr)
else:
self.pending_options[key] = valstr
assert isinstance(cmd_line_options, dict)
for keystr, valstr in cmd_line_options.items():
if isinstance(keystr, str):
key = OptionKey.from_string(keystr)