aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/cython/Cython/Compiler/Interpreter.py
blob: 3d91db2e75c2baf9c79e7790f98ce42f7af75d37 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
""" 
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 __future__ import absolute_import 
 
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)