Index: third_party/cython/src/Cython/Compiler/Interpreter.py |
diff --git a/third_party/cython/src/Cython/Compiler/Interpreter.py b/third_party/cython/src/Cython/Compiler/Interpreter.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..da3d1a0a57714d505d642ec05adc1936f4ff5546 |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Compiler/Interpreter.py |
@@ -0,0 +1,62 @@ |
+""" |
+This module deals with interpreting the parse tree as Python |
+would have done, in the compiler. |
+ |
+For now this only covers parse tree to value conversion of |
+compile-time values. |
+""" |
+ |
+from Nodes import * |
+from ExprNodes import * |
+from Errors import CompileError |
+ |
+ |
+class EmptyScope(object): |
+ def lookup(self, name): |
+ return None |
+ |
+empty_scope = EmptyScope() |
+ |
+def interpret_compiletime_options(optlist, optdict, type_env=None, type_args=()): |
+ """ |
+ Tries to interpret a list of compile time option nodes. |
+ The result will be a tuple (optlist, optdict) but where |
+ all expression nodes have been interpreted. The result is |
+ in the form of tuples (value, pos). |
+ |
+ optlist is a list of nodes, while optdict is a DictNode (the |
+ result optdict is a dict) |
+ |
+ If type_env is set, all type nodes will be analysed and the resulting |
+ type set. Otherwise only interpretateable ExprNodes |
+ are allowed, other nodes raises errors. |
+ |
+ A CompileError will be raised if there are problems. |
+ """ |
+ |
+ def interpret(node, ix): |
+ if ix in type_args: |
+ if type_env: |
+ type = node.analyse_as_type(type_env) |
+ if not type: |
+ raise CompileError(node.pos, "Invalid type.") |
+ return (type, node.pos) |
+ else: |
+ raise CompileError(node.pos, "Type not allowed here.") |
+ else: |
+ if (sys.version_info[0] >=3 and |
+ isinstance(node, StringNode) and |
+ node.unicode_value is not None): |
+ return (node.unicode_value, node.pos) |
+ return (node.compile_time_value(empty_scope), node.pos) |
+ |
+ if optlist: |
+ optlist = [interpret(x, ix) for ix, x in enumerate(optlist)] |
+ if optdict: |
+ assert isinstance(optdict, DictNode) |
+ new_optdict = {} |
+ for item in optdict.key_value_pairs: |
+ new_key, dummy = interpret(item.key, None) |
+ new_optdict[new_key] = interpret(item.value, item.key.value) |
+ optdict = new_optdict |
+ return (optlist, new_optdict) |