From 65b1d339310b2e8d7304d9b2f394bfb968b6c55b Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 03:42:16 -0400 Subject: Remove unused imports. --- mesonbuild/backend/ninjabackend.py | 2 +- mesonbuild/backend/vs2015backend.py | 1 - mesonbuild/environment.py | 8 ++++---- mesonbuild/scripts/dist.py | 3 +-- 4 files changed, 6 insertions(+), 8 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index de03db4..928e9bf 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -21,7 +21,7 @@ from .. import dependencies from .. import compilers from ..compilers import CompilerArgs from ..mesonlib import File, MesonException, OrderedSet -from ..mesonlib import get_meson_script, get_compiler_for_source, Popen_safe +from ..mesonlib import get_meson_script, get_compiler_for_source from .backends import CleanTrees, InstallData from ..build import InvalidArguments import os, sys, pickle, re diff --git a/mesonbuild/backend/vs2015backend.py b/mesonbuild/backend/vs2015backend.py index b8e3504..eb543ee 100644 --- a/mesonbuild/backend/vs2015backend.py +++ b/mesonbuild/backend/vs2015backend.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from xml.etree import ElementTree as ET from .vs2010backend import Vs2010Backend diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index 13bbe62..c34b2e7 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -12,10 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os, re, subprocess, platform -from . import coredata -from . import mesonlib -from . import mlog +import os +import platform +import re + from .compilers import * from .mesonlib import EnvironmentException, Popen_safe import configparser diff --git a/mesonbuild/scripts/dist.py b/mesonbuild/scripts/dist.py index ba6df7d..4184a5b 100644 --- a/mesonbuild/scripts/dist.py +++ b/mesonbuild/scripts/dist.py @@ -13,9 +13,8 @@ # limitations under the License. -import os, sys +import os import shutil -import argparse import subprocess import pickle import hashlib -- cgit v1.1 From faf114299bd6e2ac9c5569493d1974f2de41e13b Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 03:54:49 -0400 Subject: Remove unnecessary __init__ methods. --- mesonbuild/compilers.py | 3 +-- mesonbuild/mconf.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py index fa06ae9..a325600 100644 --- a/mesonbuild/compilers.py +++ b/mesonbuild/compilers.py @@ -329,8 +329,7 @@ def build_unix_rpath_args(build_dir, rpath_paths, install_rpath): return ['-Wl,-rpath,' + paths] class CrossNoRunException(MesonException): - def __init(self, *args, **kwargs): - Exception.__init__(self, *args, **kwargs) + pass class RunResult: def __init__(self, compiled, returncode=999, stdout='UNDEFINED', stderr='UNDEFINED'): diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py index 585e11c..55860a4 100644 --- a/mesonbuild/mconf.py +++ b/mesonbuild/mconf.py @@ -26,8 +26,7 @@ parser.add_argument('--clearcache', action='store_true', default=False, help='Clear cached state (e.g. found dependencies)') class ConfException(mesonlib.MesonException): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + pass class Conf: def __init__(self, build_dir): -- cgit v1.1 From e66465369d3150cf4efcff8682c07197935ef3bc Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 04:24:18 -0400 Subject: Use more direct dictionary literals. --- mesonbuild/backend/backends.py | 4 +--- mesonbuild/mintro.py | 12 +++--------- 2 files changed, 4 insertions(+), 12 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index b903f4c..a95294b 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -529,9 +529,7 @@ class Backend: return ifilename = os.path.join(self.environment.get_build_dir(), 'depmf.json') ofilename = os.path.join(self.environment.get_prefix(), self.build.dep_manifest_name) - mfobj = {'type': 'dependency manifest', - 'version': '1.0'} - mfobj['projects'] = self.build.dep_manifest + mfobj = {'type': 'dependency manifest', 'version': '1.0', 'projects': self.build.dep_manifest} with open(ifilename, 'w') as f: f.write(json.dumps(mfobj)) # Copy file from, to, and with mode unchanged diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py index 88ea16e..525a41d 100644 --- a/mesonbuild/mintro.py +++ b/mesonbuild/mintro.py @@ -79,9 +79,7 @@ def list_installed(installdata): def list_targets(coredata, builddata, installdata): tlist = [] for (idname, target) in builddata.get_targets().items(): - t = {} - t['name'] = target.get_basename() - t['id'] = idname + t = {'name': target.get_basename(), 'id': idname} fname = target.get_filename() if isinstance(fname, list): fname = [os.path.join(target.subdir, x) for x in fname] @@ -132,9 +130,7 @@ def add_keys(optlist, options): keys.sort() for key in keys: opt = options[key] - optdict = {} - optdict['name'] = key - optdict['value'] = opt.value + optdict = {'name': key, 'value': opt.value} if isinstance(opt, coredata.UserStringOption): typestr = 'string' elif isinstance(opt, coredata.UserBooleanOption): @@ -190,9 +186,7 @@ def list_tests(testdata): print(json.dumps(result)) def list_projinfo(builddata): - result = {} - result['name'] = builddata.project_name - result['version'] = builddata.project_version + result = {'name': builddata.project_name, 'version': builddata.project_version} subprojects = [] for k, v in builddata.subprojects.items(): c = {'name': k, -- cgit v1.1 From ea636fcd518f69c52e2a2753c5802e2bae66ab0d Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 04:41:54 -0400 Subject: Remove unused variables. --- mesonbuild/backend/ninjabackend.py | 17 +++++++++-------- mesonbuild/build.py | 10 ++++------ mesonbuild/dependencies/misc.py | 1 - mesonbuild/mconf.py | 2 +- mesonbuild/modules/gnome.py | 2 +- mesonbuild/scripts/delwithsuffix.py | 6 +++--- mesonbuild/scripts/meson_install.py | 2 +- mesonbuild/wrap/wrap.py | 1 - 8 files changed, 19 insertions(+), 22 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 928e9bf..4b12da6 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -315,14 +315,14 @@ int dummy; # Now we handle the following languages: # ObjC++, ObjC, C++, C, D, Fortran, Vala - # Pre-existing target C/C++ sources to be built; dict of full path to - # source relative to build root and the original File object. - target_sources = OrderedDict() - # GeneratedList and CustomTarget sources to be built; dict of the full - # path to source relative to build root and the generating target/list - generated_sources = OrderedDict() - # Array of sources generated by valac that have to be compiled - vala_generated_sources = [] + # target_sources: + # Pre-existing target C/C++ sources to be built; dict of full path to + # source relative to build root and the original File object. + # generated_sources: + # GeneratedList and CustomTarget sources to be built; dict of the full + # path to source relative to build root and the generating target/list + # vala_generated_sources: + # Array of sources generated by valac that have to be compiled if 'vala' in target.compilers: # Sources consumed by valac are filtered out. These only contain # C/C++ sources, objects, generated libs, and unknown sources now. @@ -331,6 +331,7 @@ int dummy; else: target_sources = self.get_target_sources(target) generated_sources = self.get_target_generated_sources(target) + vala_generated_sources = [] self.scan_fortran_module_outputs(target) # Generate rules for GeneratedLists self.generate_generator_list_rules(target, outfile) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index ce6405b..242ce6f 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -227,8 +227,6 @@ class ExtractedObjects: 'You can only extract all the object files at once.' raise MesonException(msg) - def get_want_all_objects(self): - return self.want_all_objects class EnvironmentVariables: def __init__(self): @@ -238,7 +236,7 @@ class EnvironmentVariables: repr_str = "<{0}: {1}>" return repr_str.format(self.__class__.__name__, self.envvars) - def get_value(self, name, values, kwargs): + def get_value(self, values, kwargs): separator = kwargs.get('separator', os.pathsep) value = '' @@ -247,16 +245,16 @@ class EnvironmentVariables: return separator, value.strip(separator) def set(self, env, name, values, kwargs): - return self.get_value(name, values, kwargs)[1] + return self.get_value(values, kwargs)[1] def append(self, env, name, values, kwargs): - sep, value = self.get_value(name, values, kwargs) + sep, value = self.get_value(values, kwargs) if name in env: return env[name] + sep + value return value def prepend(self, env, name, values, kwargs): - sep, value = self.get_value(name, values, kwargs) + sep, value = self.get_value(values, kwargs) if name in env: return value + sep + env[name] diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py index 3374c6e..e997807 100644 --- a/mesonbuild/dependencies/misc.py +++ b/mesonbuild/dependencies/misc.py @@ -95,7 +95,6 @@ class BoostDependency(Dependency): def get_compile_args(self): args = [] - include_dir = '' if self.boost_root is not None: if mesonlib.is_windows(): include_dir = self.boost_root diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py index 55860a4..14eddf5 100644 --- a/mesonbuild/mconf.py +++ b/mesonbuild/mconf.py @@ -61,7 +61,7 @@ class Conf: len_name = longest_name = len(titles['name']) len_descr = longest_descr = len(titles['descr']) len_value = longest_value = len(titles['value']) - len_choices = longest_choices = 0 # not printed if we don't get any optional values + longest_choices = 0 # not printed if we don't get any optional values # calculate the max length of each for x in arr: diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 134060f..b8092b2 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -730,7 +730,7 @@ class GnomeModule(ExtensionModule): return args - def gtkdoc_html_dir(self, state, args, kwarga): + def gtkdoc_html_dir(self, state, args, kwargs): if len(args) != 1: raise MesonException('Must have exactly one argument.') modulename = args[0] diff --git a/mesonbuild/scripts/delwithsuffix.py b/mesonbuild/scripts/delwithsuffix.py index bd34202..0d410ae 100644 --- a/mesonbuild/scripts/delwithsuffix.py +++ b/mesonbuild/scripts/delwithsuffix.py @@ -15,12 +15,12 @@ import os, sys def run(args): - if len(sys.argv) != 3: + if len(args) != 2: print('delwithsuffix.py ') sys.exit(1) - topdir = sys.argv[1] - suffix = sys.argv[2] + topdir = args[0] + suffix = args[1] if suffix[0] != '.': suffix = '.' + suffix diff --git a/mesonbuild/scripts/meson_install.py b/mesonbuild/scripts/meson_install.py index fbcc2a4..d949090 100644 --- a/mesonbuild/scripts/meson_install.py +++ b/mesonbuild/scripts/meson_install.py @@ -34,7 +34,7 @@ def set_mode(path, mode): except PermissionError as e: msg = '{!r}: Unable to set owner {!r} and group {!r}: {}, ignoring...' print(msg.format(path, mode.owner, mode.group, e.strerror)) - except LookupError as e: + except LookupError: msg = '{!r}: Non-existent owner {!r} or group {!r}: ignoring...' print(msg.format(path, mode.owner, mode.group)) except OSError as e: diff --git a/mesonbuild/wrap/wrap.py b/mesonbuild/wrap/wrap.py index 713d685..4dc539a 100644 --- a/mesonbuild/wrap/wrap.py +++ b/mesonbuild/wrap/wrap.py @@ -178,7 +178,6 @@ class Resolver: if is_there: try: subprocess.check_call(['git', 'rev-parse'], cwd=checkoutdir) - is_there = True except subprocess.CalledProcessError: raise RuntimeError('%s is not empty but is not a valid ' 'git repository, we can not work with it' -- cgit v1.1 From f8fe9939e4e97aac2c1199cfcc88276d1a571c77 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 04:56:59 -0400 Subject: Avoid shadowing outer variables. Though actually, just rename them into something clearer. --- mesonbuild/compilers.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py index a325600..97a1064 100644 --- a/mesonbuild/compilers.py +++ b/mesonbuild/compilers.py @@ -51,8 +51,8 @@ c_suffixes = lang_suffixes['c'] + ('h',) # used in build.py:process_compilers() and build.py:get_dynamic_linker() clike_langs = ('objcpp', 'objc', 'd', 'cpp', 'c', 'fortran',) clike_suffixes = () -for l in clike_langs: - clike_suffixes += lang_suffixes[l] +for _l in clike_langs: + clike_suffixes += lang_suffixes[_l] clike_suffixes += ('h', 'll', 's') # All these are only for C-like languages; see `clike_langs` above. @@ -1017,31 +1017,31 @@ class CCompiler(Compiler): int main() {{ static int a[1-2*!({expression})]; a[0]=0; return 0; }}''' return self.compiles(t.format(**fargs), env, extra_args, dependencies) - def cross_compute_int(self, expression, l, h, guess, prefix, env, extra_args, dependencies): + def cross_compute_int(self, expression, low, high, guess, prefix, env, extra_args, dependencies): if isinstance(guess, int): if self._compile_int('%s == %d' % (expression, guess), prefix, env, extra_args, dependencies): return guess - cur = l - while l < h: - cur = int((l + h) / 2) - if cur == l: + cur = low + while low < high: + cur = int((low + high) / 2) + if cur == low: break if self._compile_int('%s >= %d' % (expression, cur), prefix, env, extra_args, dependencies): - l = cur + low = cur else: - h = cur + high = cur if self._compile_int('%s == %d' % (expression, cur), prefix, env, extra_args, dependencies): return cur raise EnvironmentException('Cross-compile check overflowed') - def compute_int(self, expression, l, h, guess, prefix, env, extra_args=None, dependencies=None): + def compute_int(self, expression, low, high, guess, prefix, env, extra_args=None, dependencies=None): if extra_args is None: extra_args = [] if self.is_cross: - return self.cross_compute_int(expression, l, h, guess, prefix, env, extra_args, dependencies) + return self.cross_compute_int(expression, low, high, guess, prefix, env, extra_args, dependencies) fargs = {'prefix': prefix, 'expression': expression} t = '''#include {prefix} -- cgit v1.1 From 83d1c7f06323775c3f75a6bc37b77c348c74de25 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 05:10:40 -0400 Subject: Rearrange trys to avoid possible undefined vars. --- mesonbuild/environment.py | 8 ++++---- mesonbuild/wrap/wrap.py | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index c34b2e7..cd35285 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -459,11 +459,11 @@ class Environment: for compiler in compilers: if isinstance(compiler, str): compiler = [compiler] + if 'cl' in compiler or 'cl.exe' in compiler: + arg = '/?' + else: + arg = '--version' try: - if 'cl' in compiler or 'cl.exe' in compiler: - arg = '/?' - else: - arg = '--version' p, out, err = Popen_safe(compiler + [arg]) except OSError as e: popen_exceptions[' '.join(compiler + [arg])] = e diff --git a/mesonbuild/wrap/wrap.py b/mesonbuild/wrap/wrap.py index 4dc539a..b17d931 100644 --- a/mesonbuild/wrap/wrap.py +++ b/mesonbuild/wrap/wrap.py @@ -301,12 +301,13 @@ class Resolver: try: import lzma del lzma + except ImportError: + pass + else: try: shutil.register_unpack_format('xztar', ['.tar.xz', '.txz'], shutil._unpack_tarfile, [], "xz'ed tar-file") except shutil.RegistryError: pass - except ImportError: - pass target_dir = os.path.join(self.subdir_root, package.get('directory')) if os.path.isdir(target_dir): return -- cgit v1.1 From 00f89b0f6ec3cd73bd9859b815548f2267a4fcdc Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 05:24:40 -0400 Subject: Fix undefined variables/methods. --- mesonbuild/environment.py | 2 +- mesonbuild/interpreter.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index cd35285..bf58472 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -738,7 +738,7 @@ class Environment: if p.returncode == 1 and err.startswith('usage'): # OSX return ArLinker(linker) self._handle_exceptions(popen_exceptions, linkers, 'linker') - raise EnvironmentException('Unknown static linker "%s"' % ' '.join(linker)) + raise EnvironmentException('Unknown static linker "%s"' % ' '.join(linkers)) def detect_ccache(self): try: diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 5df26cc..3beb8b0 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -100,7 +100,7 @@ class RunProcess(InterpreterObject): try: return Popen_safe(command_array, env=child_env, cwd=cwd) except FileNotFoundError: - raise InterpreterException('Could not execute command "%s".' % cmd_name) + raise InterpreterException('Could not execute command "%s".' % ' '.join(command_array)) def returncode_method(self, args, kwargs): return self.returncode -- cgit v1.1 From 07bad04a8687e3e0586b0e3172ea4ea19e81365e Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 05:25:50 -0400 Subject: Handle required `ExtraFrameworkDependency`s. --- mesonbuild/dependencies/base.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'mesonbuild') diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index f4ecd57..139ff39 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -547,6 +547,7 @@ class ExtraFrameworkDependency(Dependency): def __init__(self, name, required, path, kwargs): Dependency.__init__(self, 'extraframeworks', kwargs) self.name = None + self.required = required self.detect(name, path) if self.found(): mlog.log('Dependency', mlog.bold(name), 'found:', mlog.green('YES'), @@ -570,6 +571,8 @@ class ExtraFrameworkDependency(Dependency): self.path = p self.name = d return + if not self.found() and self.required: + raise DependencyException('Framework dependency %s not found.' % (name, )) def get_compile_args(self): if self.found(): -- cgit v1.1 From 34e4d32ac75fa757373bfb60fa22233ab1f38ef6 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 05:27:22 -0400 Subject: Remove dead code paths. --- mesonbuild/interpreter.py | 1 - mesonbuild/scripts/dist.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 3beb8b0..c782265 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1353,7 +1353,6 @@ class Interpreter(InterpreterBase): def module_method_callback(self, return_object): if not isinstance(return_object, ModuleReturnValue): - assert False raise InterpreterException('Bug in module, it returned an invalid object') invalues = return_object.new_objects self.process_new_values(invalues) diff --git a/mesonbuild/scripts/dist.py b/mesonbuild/scripts/dist.py index 4184a5b..5ec7ca3 100644 --- a/mesonbuild/scripts/dist.py +++ b/mesonbuild/scripts/dist.py @@ -140,8 +140,7 @@ def run(args): error_count = 0 for name in names: rc = check_dist(name, meson_command) # Check only one. - rc = 0 if rc == 0: create_hash(name) error_count += rc - return rc + return 1 if error_count else 0 -- cgit v1.1 From 1846eb3c772542563cf3d30b0fa865deb26ffdba Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 05:27:49 -0400 Subject: Add super call in RunTargetHolder. --- mesonbuild/interpreter.py | 1 + 1 file changed, 1 insertion(+) (limited to 'mesonbuild') diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index c782265..987e32b 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -573,6 +573,7 @@ class CustomTargetHolder(TargetHolder): class RunTargetHolder(InterpreterObject): def __init__(self, name, command, args, dependencies, subdir): + super().__init__() self.held_object = build.RunTarget(name, command, args, dependencies, subdir) def __repr__(self): -- cgit v1.1 From c69d82795ce543dbba0fc4fd50356628f7afc62d Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 05:28:13 -0400 Subject: Delete the correct directory in dist check. --- mesonbuild/scripts/dist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mesonbuild') diff --git a/mesonbuild/scripts/dist.py b/mesonbuild/scripts/dist.py index 5ec7ca3..f17b296 100644 --- a/mesonbuild/scripts/dist.py +++ b/mesonbuild/scripts/dist.py @@ -112,7 +112,7 @@ def check_dist(packagename, meson_command): print('Installing the distribution package failed.') return 1 finally: - shutil.rmtree(srcdir) + shutil.rmtree(unpackdir) shutil.rmtree(builddir) shutil.rmtree(installdir) print('Distribution package %s tested.' % packagename) -- cgit v1.1 From 30645ed54b4e08611ae4883137d774a4c02b0278 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 19:40:49 -0400 Subject: Remove extra casts on InterpreterBase.evaluate_statement. The result of this method is always a "native" object, and code coverage (plus a manual inspection) shows that this conversion is never done. --- mesonbuild/interpreter.py | 3 +-- mesonbuild/interpreterbase.py | 44 +++++-------------------------------------- 2 files changed, 6 insertions(+), 41 deletions(-) (limited to 'mesonbuild') diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 987e32b..948a6d4 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2625,11 +2625,10 @@ different subdirectory. raise InterpreterException('Tried to add non-existing source file %s.' % s) def format_string(self, templ, args): - templ = self.to_native(templ) if isinstance(args, mparser.ArgumentNode): args = args.arguments for (i, arg) in enumerate(args): - arg = self.to_native(self.evaluate_statement(arg)) + arg = self.evaluate_statement(arg) if isinstance(arg, bool): # Python boolean is upper case. arg = str(arg).lower() templ = templ.replace('@{}@'.format(i), str(arg)) diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py index 86a6b47..2fe21d9 100644 --- a/mesonbuild/interpreterbase.py +++ b/mesonbuild/interpreterbase.py @@ -198,8 +198,6 @@ class InterpreterBase: def evaluate_notstatement(self, cur): v = self.evaluate_statement(cur.value) - if isinstance(v, mparser.BooleanNode): - v = v.value if not isinstance(v, bool): raise InterpreterException('Argument to "not" is not a boolean.') return not v @@ -217,16 +215,8 @@ class InterpreterBase: self.evaluate_codeblock(node.elseblock) def evaluate_comparison(self, node): - v1 = self.evaluate_statement(node.left) - v2 = self.evaluate_statement(node.right) - if self.is_elementary_type(v1): - val1 = v1 - else: - val1 = v1.value - if self.is_elementary_type(v2): - val2 = v2 - else: - val2 = v2.value + val1 = self.evaluate_statement(node.left) + val2 = self.evaluate_statement(node.right) if node.ctype == '==': return val1 == val2 elif node.ctype == '!=': @@ -244,45 +234,35 @@ class InterpreterBase: def evaluate_andstatement(self, cur): l = self.evaluate_statement(cur.left) - if isinstance(l, mparser.BooleanNode): - l = l.value if not isinstance(l, bool): raise InterpreterException('First argument to "and" is not a boolean.') if not l: return False r = self.evaluate_statement(cur.right) - if isinstance(r, mparser.BooleanNode): - r = r.value if not isinstance(r, bool): raise InterpreterException('Second argument to "and" is not a boolean.') return r def evaluate_orstatement(self, cur): l = self.evaluate_statement(cur.left) - if isinstance(l, mparser.BooleanNode): - l = l.get_value() if not isinstance(l, bool): raise InterpreterException('First argument to "or" is not a boolean.') if l: return True r = self.evaluate_statement(cur.right) - if isinstance(r, mparser.BooleanNode): - r = r.get_value() if not isinstance(r, bool): raise InterpreterException('Second argument to "or" is not a boolean.') return r def evaluate_uminusstatement(self, cur): v = self.evaluate_statement(cur.value) - if isinstance(v, mparser.NumberNode): - v = v.value if not isinstance(v, int): raise InterpreterException('Argument to negation is not an integer.') return -v def evaluate_arithmeticstatement(self, cur): - l = self.to_native(self.evaluate_statement(cur.left)) - r = self.to_native(self.evaluate_statement(cur.right)) + l = self.evaluate_statement(cur.left) + r = self.evaluate_statement(cur.right) if cur.operation == 'add': try: @@ -382,8 +362,6 @@ class InterpreterBase: obj = self.evaluate_statement(invokable) method_name = node.name args = node.args - if isinstance(obj, mparser.StringNode): - obj = obj.get_value() if isinstance(obj, str): return self.string_method_call(obj, method_name, args) if isinstance(obj, bool): @@ -402,7 +380,6 @@ class InterpreterBase: return obj.method_call(method_name, self.flatten(args), kwargs) def bool_method_call(self, obj, method_name, args): - obj = self.to_native(obj) (posargs, _) = self.reduce_arguments(args) if method_name == 'to_string': if not posargs: @@ -426,7 +403,6 @@ class InterpreterBase: raise InterpreterException('Unknown method "%s" for a boolean.' % method_name) def int_method_call(self, obj, method_name, args): - obj = self.to_native(obj) (posargs, _) = self.reduce_arguments(args) if method_name == 'is_even': if not posargs: @@ -442,7 +418,6 @@ class InterpreterBase: raise InterpreterException('Unknown method "%s" for an integer.' % method_name) def string_method_call(self, obj, method_name, args): - obj = self.to_native(obj) (posargs, _) = self.reduce_arguments(args) if method_name == 'strip': return obj.strip() @@ -534,8 +509,6 @@ class InterpreterBase: raise InvalidArguments('Keyword argument name is not a string.') a = args.kwargs[key] reduced_kw[key] = self.evaluate_statement(a) - if not isinstance(reduced_pos, list): - reduced_pos = [reduced_pos] self.argument_depth -= 1 return reduced_pos, reduced_kw @@ -564,7 +537,6 @@ To specify a keyword argument, use : instead of =.''') if not isinstance(var_name, str): raise InvalidArguments('Tried to assign value to a non-variable.') value = self.evaluate_statement(node.value) - value = self.to_native(value) if not self.is_assignable(value): raise InvalidCode('Tried to assign an invalid value to variable.') # For mutable objects we need to make a copy on assignment @@ -593,12 +565,6 @@ To specify a keyword argument, use : instead of =.''') return self.variables[varname] raise InvalidCode('Unknown variable "%s".' % varname) - def to_native(self, arg): - if isinstance(arg, (mparser.StringNode, mparser.NumberNode, - mparser.BooleanNode)): - return arg.value - return arg - def is_assignable(self, value): return isinstance(value, (InterpreterObject, dependencies.Dependency, str, int, list, mesonlib.File)) @@ -624,7 +590,7 @@ To specify a keyword argument, use : instead of =.''') if len(args) != 2: raise InvalidCode('Set_variable takes two arguments.') varname = args[0] - value = self.to_native(args[1]) + value = args[1] self.set_variable(varname, value) # @noKwargs -- cgit v1.1 From b36513a5b68fa4e34fbbf827a8704e0dc9d25f54 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 21:39:14 -0400 Subject: Only allow equality comparisons for non-elementary types. --- mesonbuild/interpreterbase.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'mesonbuild') diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py index 2fe21d9..8b951b3 100644 --- a/mesonbuild/interpreterbase.py +++ b/mesonbuild/interpreterbase.py @@ -221,6 +221,10 @@ class InterpreterBase: return val1 == val2 elif node.ctype == '!=': return val1 != val2 + elif not self.is_elementary_type(val1): + raise InterpreterException('{} can only be compared for equality.'.format(node.left.value)) + elif not self.is_elementary_type(val2): + raise InterpreterException('{} can only be compared for equality.'.format(node.right.value)) elif node.ctype == '<': return val1 < val2 elif node.ctype == '<=': -- cgit v1.1 From 0e56ec2dbdbbd463d608c42e0aa117357e18936a Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Wed, 17 May 2017 22:00:02 -0400 Subject: Don't allow non-equality comparisons across types. --- mesonbuild/interpreterbase.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'mesonbuild') diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py index 8b951b3..fb87ea2 100644 --- a/mesonbuild/interpreterbase.py +++ b/mesonbuild/interpreterbase.py @@ -221,6 +221,11 @@ class InterpreterBase: return val1 == val2 elif node.ctype == '!=': return val1 != val2 + elif not isinstance(val1, type(val2)): + raise InterpreterException( + 'Values of different types ({}, {}) cannot be compared using {}.'.format(type(val1).__name__, + type(val2).__name__, + node.ctype)) elif not self.is_elementary_type(val1): raise InterpreterException('{} can only be compared for equality.'.format(node.left.value)) elif not self.is_elementary_type(val2): -- cgit v1.1