aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2016-09-02 16:39:16 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2016-09-02 18:52:45 +0100
commit00e5962aaada57215eaf32879041f92004e011d8 (patch)
tree6bbd52914314fe881e5ef092d1716346e2622410
parentc8213aaf1e3503855377e1372e1a7bbb19c5463d (diff)
downloadmeson-00e5962aaada57215eaf32879041f92004e011d8.zip
meson-00e5962aaada57215eaf32879041f92004e011d8.tar.gz
meson-00e5962aaada57215eaf32879041f92004e011d8.tar.bz2
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))
-rw-r--r--mesonbuild/interpreter.py4
-rw-r--r--mesonbuild/mparser.py9
-rw-r--r--test cases/common/68 number arithmetic/meson.build3
3 files changed, 15 insertions, 1 deletions
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.')
diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py
index 2f0eb2d..f593c8e 100644
--- a/mesonbuild/mparser.py
+++ b/mesonbuild/mparser.py
@@ -58,6 +58,7 @@ class Lexer:
('plus', re.compile(r'\+')),
('dash', re.compile(r'-')),
('star', re.compile(r'\*')),
+ ('percent', re.compile(r'\%')),
('fslash', re.compile(r'/')),
('colon', re.compile(r':')),
('equal', re.compile(r'==')),
@@ -434,11 +435,17 @@ class Parser:
return left
def e5sub(self):
- left = self.e5mul()
+ left = self.e5mod()
if self.accept('dash'):
return ArithmeticNode(left.lineno, left.colno, 'sub', left, self.e5sub())
return left
+ def e5mod(self):
+ left = self.e5mul()
+ if self.accept('percent'):
+ return ArithmeticNode(left.lineno, left.colno, 'mod', left, self.e5mod())
+ return left
+
def e5mul(self):
left = self.e5div()
if self.accept('star'):
diff --git a/test cases/common/68 number arithmetic/meson.build b/test cases/common/68 number arithmetic/meson.build
index 4b98d73..1bc8155 100644
--- a/test cases/common/68 number arithmetic/meson.build
+++ b/test cases/common/68 number arithmetic/meson.build
@@ -21,6 +21,9 @@ if (5 / 3) * 3 != 3
error('Integer division is broken')
endif
+assert((5 % 2) == 1, 'Integer modulo (odd) is broken')
+assert((4 % 2) == 0, 'Integer modulo (even) is broken')
+
assert(3 < 4, 'Lt broken')
assert(not(4 < 3), 'Lt broken')
assert(3 <= 4, 'Lte broken')