aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xenvironment.py8
-rwxr-xr-xinterpreter.py23
2 files changed, 24 insertions, 7 deletions
diff --git a/environment.py b/environment.py
index ee1a952..45d0266 100755
--- a/environment.py
+++ b/environment.py
@@ -155,6 +155,7 @@ class Environment():
def get_object_suffix(self):
return self.object_suffix
+# This should be an InterpreterObject. Fix it.
class PkgConfigDependency():
pkgconfig_found = False
@@ -196,11 +197,12 @@ class PkgConfigDependency():
stderr=subprocess.PIPE)
(out, err) = p.communicate()
if p.returncode != 0:
- raise RuntimeError('Pkg-config not found.')
- print('Found pkg-config version %s\n', out.strip())
+ raise RuntimeError('Pkg-config executable not found.')
+ print('Found pkg-config version %s.' % out.decode().strip())
PkgConfigDependency.pkgconfig_found = True
-def find_external_dependency(self, name):
+# Fixme, move to environment.
+def find_external_dependency(name):
# Add detectors for non-pkg-config deps (e.g. Boost) etc here.
return PkgConfigDependency(name)
diff --git a/interpreter.py b/interpreter.py
index 632de0d..ff5e94f 100755
--- a/interpreter.py
+++ b/interpreter.py
@@ -84,10 +84,10 @@ class Interpreter():
statements = self.ast.get_statements()
while i < len(statements):
cur = statements[i]
- self.evaluate_expression(cur)
+ self.evaluate_statement(cur)
i += 1 # In THE FUTURE jump over blocks and stuff.
- def evaluate_expression(self, cur):
+ def evaluate_statement(self, cur):
if isinstance(cur, nodes.FunctionCall):
return self.function_call(cur)
elif isinstance(cur, nodes.Assignment):
@@ -138,6 +138,12 @@ class Interpreter():
self.executables[name] = exe
print('Creating executable %s with file %s' % (name, sources[0]))
return exe
+
+ def func_find_dep(self, node, args):
+ self.validate_arguments(args, 1, [nodes.StringStatement])
+ name = args[0].get_string()
+ dep = environment.find_external_dependency(name)
+ return dep
def function_call(self, node):
func_name = node.get_function_name()
@@ -150,17 +156,25 @@ class Interpreter():
return self.func_language(node, args)
elif func_name == 'executable':
return self.func_executable(node, args)
+ elif func_name == 'find_dep':
+ return self.func_find_dep(node, args)
else:
raise InvalidCode('Unknown function "%s".' % func_name)
+ def is_assignable(self, value):
+ if isinstance(value, InterpreterObject) or \
+ isinstance(value, environment.PkgConfigDependency):
+ return True
+ return False
+
def assignment(self, node):
var_name = node.var_name
if not isinstance(var_name, nodes.AtomExpression):
raise InvalidArguments('Line %d: Tried to assign value to a non-variable.' % node.lineno())
- value = self.evaluate_expression(node.value)
+ value = self.evaluate_statement(node.value)
if value is None:
raise InvalidCode('Line %d: Can not assign None to variable.' % node.lineno())
- if not isinstance(value, InterpreterObject):
+ if not self.is_assignable(value):
raise InvalidCode('Line %d: Tried to assign an invalid value to variable.' % node.lineno())
self.variables[var_name] = value
return value
@@ -170,6 +184,7 @@ if __name__ == '__main__':
message('I can haz text printed out?')
language('c')
prog = executable('prog', 'prog.c')
+ dep = find_dep('gtk+-3.0')
"""
i = Interpreter(code)
i.run()