More stringlist refactoring.

pull/102/head
Jussi Pakkanen 10 years ago
parent 8e58bb16ad
commit d1d15cec41
  1. 60
      interpreter.py

@ -38,6 +38,13 @@ class InvalidArguments(InterpreterException):
# Decorators for method calls.
def check_stringlist(a, msg='Arguments must be strings.'):
if not isinstance(a, list):
raise InvalidArguments('Argument not a list.')
for s in a:
if not isinstance(s, str):
raise InvalidArguments(msg)
def noKwargs(f):
@wraps(f)
def wrapped(self, node, args, kwargs):
@ -50,9 +57,7 @@ def stringArgs(f):
@wraps(f)
def wrapped(self, node, args, kwargs):
assert(isinstance(args, list))
for s in args:
if not isinstance(s, str):
raise InvalidArguments('Arguments must be strings.')
check_stringlist(args)
return f(self, node, args, kwargs)
return wrapped
@ -257,11 +262,7 @@ class GeneratorHolder(InterpreterObject):
def process_method(self, args, kwargs):
if len(kwargs) > 0:
raise InvalidArguments('Process does not take keyword arguments.')
if not isinstance(args, list):
raise InvalidArguments('Argument to "process" must be a string or a list of strings.')
for a in args:
if not isinstance(a, str):
raise InvalidArguments('A non-string object in "process" arguments.')
check_stringlist(args)
gl = GeneratedListHolder(self)
[gl.add_file(os.path.join(self.interpreter.subdir, a)) for a in args]
return gl
@ -346,9 +347,7 @@ class Data(InterpreterObject):
if not isinstance(kwsource, list):
kwsource = [kwsource]
self.sources += kwsource
for s in self.sources:
if not isinstance(s, str):
raise InterpreterException('Install file name must be a string.')
check_stringlist(self.sources)
self.install_dir = kwargs.get('install_dir', None)
if not isinstance(self.install_dir, str):
raise InterpreterException('Custom_install_dir must be a string.')
@ -505,9 +504,8 @@ class CompilerHolder(InterpreterObject):
def alignment_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('Alignment method takes exactly one positional argument.')
check_stringlist(args)
typename = args[0]
if not isinstance(typename, str):
raise InterpreterException('First argument is not a string.')
result = self.compiler.alignment(typename, self.environment)
mlog.log('Checking for alignment of "', mlog.bold(typename), '": ', result, sep='')
return result
@ -515,12 +513,11 @@ class CompilerHolder(InterpreterObject):
def run_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('Run method takes exactly one positional argument.')
check_stringlist(args)
code = args[0]
testname = kwargs.get('name', '')
if not isinstance(testname, str):
raise InterpreterException('Testname argument must be a string.')
if not isinstance(code, str):
raise InterpreterException('First argument is not a string.')
result = self.compiler.run(code)
if len(testname) > 0:
if not result.compiled:
@ -538,12 +535,9 @@ class CompilerHolder(InterpreterObject):
def has_member_method(self, args, kwargs):
if len(args) != 2:
raise InterpreterException('Has_member takes exactly two arguments.')
check_stringlist(args)
typename = args[0]
if not isinstance(typename, str):
raise InterpreterException('Name of type must be a string.')
membername = args[1]
if not isinstance(membername, str):
raise InterpreterException('Name of member must be a string.')
prefix = kwargs.get('prefix', '')
if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of has_function must be a string.')
@ -559,9 +553,8 @@ class CompilerHolder(InterpreterObject):
def has_function_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('Has_function takes exactly one argument.')
check_stringlist(args)
funcname = args[0]
if not isinstance(funcname, str):
raise InterpreterException('Argument to has_function must be a string.')
prefix = kwargs.get('prefix', '')
if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of has_function must be a string.')
@ -576,9 +569,8 @@ class CompilerHolder(InterpreterObject):
def sizeof_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('Sizeof takes exactly one argument.')
check_stringlist(args)
element = args[0]
if not isinstance(element, str):
raise InterpreterException('Argument to sizeof must be a string.')
prefix = kwargs.get('prefix', '')
if not isinstance(prefix, str):
raise InterpreterException('Prefix argument of sizeof must be a string.')
@ -589,12 +581,11 @@ class CompilerHolder(InterpreterObject):
def compiles_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('compiles method takes exactly one argument.')
check_stringlist(args)
string = args[0]
testname = kwargs.get('name', '')
if not isinstance(testname, str):
raise InterpreterException('Testname argument must be a string.')
if not isinstance(string, str):
raise InterpreterException('Argument to compiles() must be a string')
result = self.compiler.compiles(string)
if len(testname) > 0:
if result:
@ -607,9 +598,8 @@ class CompilerHolder(InterpreterObject):
def has_header_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('has_header method takes exactly one argument.')
check_stringlist(args)
string = args[0]
if not isinstance(string, str):
raise InterpreterException('Argument to has_header() must be a string')
haz = self.compiler.has_header(string)
if haz:
h = mlog.green('YES')
@ -666,9 +656,8 @@ class MesonMain(InterpreterObject):
def set_install_script_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('Set_install_script takes exactly one argument.')
check_stringlist(args)
scriptbase = args[0]
if not isinstance(scriptbase, str):
raise InterpreterException('Set_install_script argument is not a string.')
scriptfile = os.path.join(self.interpreter.environment.source_dir,
self.interpreter.subdir, scriptbase)
if not os.path.isfile(scriptfile):
@ -888,25 +877,23 @@ class Interpreter():
value = self.to_native(args[1])
self.set_variable(varname, value)
@stringArgs
@noKwargs
def func_import(self, node, args, kwargs):
if len(args) != 1:
raise InvalidCode('Import takes one argument.')
modname = args[0]
if not isinstance(modname, str):
raise InvalidCode('Argument to import was not a string')
if not modname in self.environment.coredata.modules:
module = importlib.import_module('modules.' + modname).initialize()
self.environment.coredata.modules[modname] = module
return ModuleHolder(modname, self.environment.coredata.modules[modname], self)
@stringArgs
@noKwargs
def func_file(self, node, args, kwargs):
if len(args) != 1:
raise InvalidCode('File takes one argument.')
fname = args[0]
if not isinstance(fname, str):
raise InvalidCode('Argument to import was not a string')
fobj = File.from_source_file(self.environment.source_dir, self.subdir, fname)
return fobj
@ -982,9 +969,7 @@ class Interpreter():
cmd = [cmd]
else:
raise InterpreterException('First argument is of incorrect type.')
for i in cargs:
if not isinstance(i, str):
raise InterpreterException('Run_command arguments must be strings.')
check_stringlist(cargs, 'Run_command arguments must be strings.')
args = cmd + cargs
in_builddir = kwargs.get('in_builddir', False)
if not isinstance(in_builddir, bool):
@ -998,8 +983,7 @@ class Interpreter():
raise InterpreterException('Gettext requires one positional argument (package name).')
packagename = args[0]
languages = kwargs.get('languages', None)
if not isinstance(languages, list):
raise InterpreterException('Argument languages must be a list of strings.')
check_stringlist(languages, 'Argument languages must be a list of strings.')
# TODO: check that elements are strings
if len(self.build.pot) > 0:
raise InterpreterException('More than one gettext definition currently not supported.')

Loading…
Cancel
Save