aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2013-01-27 22:18:40 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2013-01-27 22:18:40 +0200
commitaef5ef362d5f0934df44951d20028b64e5529384 (patch)
tree3d4e3c75595eebf2161633c80fc9fc540dfb928e
parentd4d8045d2ef18b0c3131572a970e25816d633de1 (diff)
downloadmeson-aef5ef362d5f0934df44951d20028b64e5529384.zip
meson-aef5ef362d5f0934df44951d20028b64e5529384.tar.gz
meson-aef5ef362d5f0934df44951d20028b64e5529384.tar.bz2
Added support for numbers.
-rwxr-xr-xbparser.py10
-rwxr-xr-xinterpreter.py25
-rw-r--r--nodes.py23
-rw-r--r--test cases/25 numbers/builder.txt7
-rw-r--r--test cases/25 numbers/prog.c10
5 files changed, 66 insertions, 9 deletions
diff --git a/bparser.py b/bparser.py
index ce01011..1611988 100755
--- a/bparser.py
+++ b/bparser.py
@@ -39,6 +39,7 @@ tokens = ['LPAREN',
'COMMA',
'DOT',
'STRING',
+ 'INT',
'EOL_CONTINUE',
'EOL',
] + list(reserved.values())
@@ -68,6 +69,11 @@ def t_STRING(t):
t.value = t.value[1:-1]
return t
+def t_INT(t):
+ '[0-9]+'
+ t.value = int(t.value)
+ return t
+
def t_EOL(t):
r'\n'
t.lexer.lineno += 1
@@ -103,6 +109,10 @@ def p_expression_atom(t):
'expression : ATOM'
t[0] = nodes.AtomExpression(t[1], t.lineno(1))
+def p_expression_int(t):
+ 'expression : INT'
+ t[0] = nodes.IntExpression(t[1], t.lineno(1))
+
def p_expression_bool(t):
'''expression : TRUE
| FALSE'''
diff --git a/interpreter.py b/interpreter.py
index 3194028..74689a2 100755
--- a/interpreter.py
+++ b/interpreter.py
@@ -38,23 +38,26 @@ class InterpreterObject():
return self.methods[method_name](args)
raise InvalidCode('Unknown method "%s" in object.' % method_name)
-
# This currently returns data for the current environment.
# It should return info for the target host.
class Host(InterpreterObject):
def __init__(self):
InterpreterObject.__init__(self)
+ self.methods.update({'pointer_size' : self.get_ptrsize_method,
+ 'name' : self.get_name_method,
+ 'is_little_endian' : self.is_little_endian_method,
+ })
- def get_ptrsize(self):
+ def get_ptrsize_method(self, args):
if sys.maxsize > 2**32:
return 64
return 32
- def get_name(self):
+ def get_name_method(self, args):
return platform.system().lower()
- def is_little_endian(self):
+ def is_little_endian_method(self, args):
return sys.byteorder == 'little'
class IncludeDirs(InterpreterObject):
@@ -114,7 +117,7 @@ class ConfigureFile(InterpreterObject):
def get_subdir(self):
return self.subdir
-
+
def get_source_name(self):
return self.sourcename
@@ -360,6 +363,8 @@ class Interpreter():
return self.evaluate_comparison(cur)
elif isinstance(cur, nodes.ArrayStatement):
return self.evaluate_arraystatement(cur)
+ elif isinstance(cur, nodes.IntStatement):
+ return cur
else:
raise InvalidCode("Line %d: Unknown statement." % cur.lineno())
@@ -595,8 +600,14 @@ class Interpreter():
def evaluate_comparison(self, node):
v1 = self.evaluate_statement(node.get_first())
v2 = self.evaluate_statement(node.get_second())
- val1 = v1.get_value()
- val2 = v2.get_value()
+ if isinstance(v1, int):
+ val1 = v1
+ else:
+ val1 = v1.get_value()
+ if(isinstance(v2, int)):
+ val2 = v2
+ else:
+ val2 = v2.get_value()
assert(type(val1) == type(val2))
if node.get_ctype() == '==':
return val1 == val2
diff --git a/nodes.py b/nodes.py
index e141eba..72b1edd 100644
--- a/nodes.py
+++ b/nodes.py
@@ -49,12 +49,20 @@ class StringExpression(Expression):
Expression.__init__(self, lineno)
self.value = value
+class IntExpression(Expression):
+ def __init__(self, value, lineno):
+ Expression.__init__(self, lineno)
+ self.value = value
+
+ def get_value(self):
+ return self.value
+
class AtomStatement(Statement):
def __init__(self, value, lineno):
Statement.__init__(self, lineno)
assert(type(value) == type(''))
self.value = value
-
+
def get_value(self):
return self.value
@@ -66,7 +74,16 @@ class BoolStatement(Statement):
def get_value(self):
return self.value
-
+
+class IntStatement(Statement):
+ def __init__(self, value, lineno):
+ Statement.__init__(self, lineno)
+ assert(isinstance(value, int))
+ self.value = value
+
+ def get_value(self):
+ return self.value
+
class IfStatement(Statement):
def __init__(self, clause, trueblock, falseblock, lineno):
Statement.__init__(self, lineno)
@@ -167,4 +184,6 @@ def statement_from_expression(expr):
return StringStatement(expr.value, expr.lineno())
if isinstance(expr, BoolExpression):
return BoolStatement(expr.value, expr.lineno())
+ if isinstance(expr, IntExpression):
+ return IntStatement(expr.get_value(), expr.lineno())
raise RuntimeError('Can not convert unknown expression to a statement.')
diff --git a/test cases/25 numbers/builder.txt b/test cases/25 numbers/builder.txt
new file mode 100644
index 0000000..557408a
--- /dev/null
+++ b/test cases/25 numbers/builder.txt
@@ -0,0 +1,7 @@
+project('numbers', 'c')
+
+if(host.pointer_size() == 64)
+ add_global_arguments('c', '-DIS64')
+endif
+
+add_test('sizetest', executable('prog', 'prog.c'))
diff --git a/test cases/25 numbers/prog.c b/test cases/25 numbers/prog.c
new file mode 100644
index 0000000..d4c7872
--- /dev/null
+++ b/test cases/25 numbers/prog.c
@@ -0,0 +1,10 @@
+int main(int argc, char **argv) {
+ int ptrsize = sizeof(void*);
+ int expsize;
+#ifdef IS64
+ expsize = 8;
+#else
+ expsize = 4;
+#endif
+ return ptrsize == expsize ? 0 : 1;
+}