diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2018-10-09 15:15:39 -0700 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2018-11-13 00:40:13 +0200 |
commit | de175aac0051b5625e21aeb5b9864ae7c376f9d7 (patch) | |
tree | 0b81d8364ccc058c31f9a89db6f3e1bfefd59f4d /mesonbuild/interpreter.py | |
parent | cecad3b9dbe06945c5131570bec9ce1406f4fb8a (diff) | |
download | meson-de175aac0051b5625e21aeb5b9864ae7c376f9d7.zip meson-de175aac0051b5625e21aeb5b9864ae7c376f9d7.tar.gz meson-de175aac0051b5625e21aeb5b9864ae7c376f9d7.tar.bz2 |
compilers: Use keyword only arguments for compiler interfaces
Because we need to inherit them in some cases, and python's
keyword-or-positional arguments make this really painful, especially
with inheritance. They do this in two ways:
1) If you want to intercept the arguments you need to check for both a
keyword and a positional argument, because you could get either. Then
you need to make sure that you only pass one of those down to the
next layer.
2) After you do that, if the layer below you decides to do the same
thing, but uses the other form (you used keyword by the lower level
uses positional or vice versa), then you'll get a TypeError since two
layers down got the argument as both a positional and a keyword.
All of this is bad. Fortunately python 3.x provides a mechanism to solve
this, keyword only arguments. These arguments cannot be based
positionally, the interpreter will give us an error in that case.
I have made a best effort to do this correctly, and I've verified it
with GCC, Clang, ICC, and MSVC, but there are other compilers like Arm
and Elbrus that I don't have access to.
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r-- | mesonbuild/interpreter.py | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index df74cc0..d7a5b66 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1018,7 +1018,9 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Prefix argument of sizeof must be a string.') extra_args = mesonlib.stringlistify(kwargs.get('args', [])) deps, msg = self.determine_dependencies(kwargs) - result = self.compiler.alignment(typename, prefix, self.environment, extra_args, deps) + result = self.compiler.alignment(typename, prefix, self.environment, + extra_args=extra_args, + dependencies=deps) mlog.log('Checking for alignment of', mlog.bold(typename, True), msg, result) return result @@ -1043,7 +1045,8 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Testname argument must be a string.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs, endl=None) - result = self.compiler.run(code, self.environment, extra_args, deps) + result = self.compiler.run(code, self.environment, extra_args=extra_args, + dependencies=deps) if len(testname) > 0: if not result.compiled: h = mlog.red('DID NOT COMPILE') @@ -1099,7 +1102,9 @@ class CompilerHolder(InterpreterObject): extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs) had = self.compiler.has_members(typename, [membername], prefix, - self.environment, extra_args, deps) + self.environment, + extra_args=extra_args, + dependencies=deps) if had: hadtxt = mlog.green('YES') else: @@ -1127,7 +1132,9 @@ class CompilerHolder(InterpreterObject): extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs) had = self.compiler.has_members(typename, membernames, prefix, - self.environment, extra_args, deps) + self.environment, + extra_args=extra_args, + dependencies=deps) if had: hadtxt = mlog.green('YES') else: @@ -1154,7 +1161,9 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Prefix argument of has_function must be a string.') extra_args = self.determine_args(kwargs) deps, msg = self.determine_dependencies(kwargs) - had = self.compiler.has_function(funcname, prefix, self.environment, extra_args, deps) + had = self.compiler.has_function(funcname, prefix, self.environment, + extra_args=extra_args, + dependencies=deps) if had: hadtxt = mlog.green('YES') else: @@ -1179,7 +1188,8 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Prefix argument of has_type must be a string.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs) - had = self.compiler.has_type(typename, prefix, self.environment, extra_args, deps) + had = self.compiler.has_type(typename, prefix, self.environment, + extra_args=extra_args, dependencies=deps) if had: hadtxt = mlog.green('YES') else: @@ -1217,7 +1227,9 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Guess argument of compute_int must be an int.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs) - res = self.compiler.compute_int(expression, low, high, guess, prefix, self.environment, extra_args, deps) + res = self.compiler.compute_int(expression, low, high, guess, prefix, + self.environment, extra_args=extra_args, + dependencies=deps) mlog.log('Computing int of', mlog.bold(expression, True), msg, res) return res @@ -1238,7 +1250,8 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Prefix argument of sizeof must be a string.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs) - esize = self.compiler.sizeof(element, prefix, self.environment, extra_args, deps) + esize = self.compiler.sizeof(element, prefix, self.environment, + extra_args=extra_args, dependencies=deps) mlog.log('Checking for size of', mlog.bold(element, True), msg, esize) return esize @@ -1260,7 +1273,9 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Prefix argument of get_define() must be a string.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs) - value = self.compiler.get_define(element, prefix, self.environment, extra_args, deps) + value = self.compiler.get_define(element, prefix, self.environment, + extra_args=extra_args, + dependencies=deps) mlog.log('Fetching value of define', mlog.bold(element, True), msg, value) return value @@ -1285,7 +1300,9 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Testname argument must be a string.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs, endl=None) - result = self.compiler.compiles(code, self.environment, extra_args, deps) + result = self.compiler.compiles(code, self.environment, + extra_args=extra_args, + dependencies=deps) if len(testname) > 0: if result: h = mlog.green('YES') @@ -1315,7 +1332,9 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Testname argument must be a string.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs, endl=None) - result = self.compiler.links(code, self.environment, extra_args, deps) + result = self.compiler.links(code, self.environment, + extra_args=extra_args, + dependencies=deps) if len(testname) > 0: if result: h = mlog.green('YES') @@ -1342,7 +1361,9 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Prefix argument of has_header must be a string.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs) - haz = self.compiler.check_header(hname, prefix, self.environment, extra_args, deps) + haz = self.compiler.check_header(hname, prefix, self.environment, + extra_args=extra_args, + dependencies=deps) if haz: h = mlog.green('YES') else: @@ -1367,7 +1388,8 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Prefix argument of has_header must be a string.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs) - haz = self.compiler.has_header(hname, prefix, self.environment, extra_args, deps) + haz = self.compiler.has_header(hname, prefix, self.environment, + extra_args=extra_args, dependencies=deps) if haz: h = mlog.green('YES') else: @@ -1393,7 +1415,9 @@ class CompilerHolder(InterpreterObject): raise InterpreterException('Prefix argument of has_header_symbol must be a string.') extra_args = functools.partial(self.determine_args, kwargs) deps, msg = self.determine_dependencies(kwargs) - haz = self.compiler.has_header_symbol(hname, symbol, prefix, self.environment, extra_args, deps) + haz = self.compiler.has_header_symbol(hname, symbol, prefix, self.environment, + extra_args=extra_args, + dependencies=deps) if haz: h = mlog.green('YES') else: |