From 00e5962aaada57215eaf32879041f92004e011d8 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 2 Sep 2016 16:39:16 +0100 Subject: Add support to integer modulo operator Having support for the '%' operator makes it easier to implement even/odd version checks, like: enable_debug = get_option('enable-debug') if enable_debug == 'auto' if minor_version % 2 == 0 enable_debug = 'minimum' else enable_debug = 'yes' endif endif which would be impossible without resorting to less obvious long-hand forms like: a - (b * (a / b)) --- mesonbuild/interpreter.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'mesonbuild/interpreter.py') diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index ac95e15..535a3f0 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2595,6 +2595,10 @@ class Interpreter(): if not isinstance(l, int) or not isinstance(r, int): raise InvalidCode('Division works only with integers.') return l // r + elif cur.operation == 'mod': + if not isinstance(l, int) or not isinstance(r, int): + raise InvalidCode('Modulo works only with integers.') + return l % r else: raise InvalidCode('You broke me.') -- cgit v1.1 From 2dd1ec6f8c82dc9a2d97c246664e92246a5af95b Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 2 Sep 2016 18:02:37 +0100 Subject: Add is_even() and is_odd() integer methods Convenience methods for modulo operations involving even and odd numbers. --- mesonbuild/interpreter.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'mesonbuild/interpreter.py') diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 535a3f0..abbeaf7 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2293,6 +2293,22 @@ class Interpreter(): else: 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 len(posargs) == 0: + return obj % 2 == 0 + else: + raise InterpreterException('int.is_even() must have no arguments.') + elif method_name == 'is_odd': + if len(posargs) == 0: + return obj % 2 != 0 + else: + raise InterpreterException('int.is_odd() must have no arguments.') + else: + 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) @@ -2379,6 +2395,8 @@ class Interpreter(): return self.string_method_call(obj, method_name, args) if isinstance(obj, bool): return self.bool_method_call(obj, method_name, args) + if isinstance(obj, int): + return self.int_method_call(obj, method_name, args) if isinstance(obj, list): return self.array_method_call(obj, method_name, self.reduce_arguments(args)[0]) if not isinstance(obj, InterpreterObject): -- cgit v1.1