Ejemplo n.º 1
0
def _chr_to_value(c):
    if c == "n":
        return base_types.VNone()
    if c == "b":
        return base_types.VBool()
    if c == "i":
        return base_types.VInt()
    if c == "I":
        return base_types.VInt(64)
    raise ValueError
Ejemplo n.º 2
0
 def visit_Return(self, node):
     if node.value is None:
         val = base_types.VNone()
     else:
         val = self.exprv.visit_expression(node.value)
     ns = self.exprv.ns
     if "return" in ns:
         ns["return"].merge(val)
     else:
         ns["return"] = deepcopy(val)
Ejemplo n.º 3
0
 def _visit_expr_NameConstant(self, node):
     v = node.value
     if v is None:
         r = base_types.VNone()
     elif isinstance(v, bool):
         r = base_types.VBool()
     else:
         raise NotImplementedError
     if self.builder is not None:
         r.set_const_value(self.builder, v)
     return r
Ejemplo n.º 4
0
 def _visit_stmt_Return(self, node):
     if node.value is None:
         val = base_types.VNone()
     else:
         val = self.visit_expression(node.value)
     exception_levels = sum(self._exception_level_stack)
     if exception_levels:
         self.runtime.build_pop(self.builder, exception_levels)
     if isinstance(val, base_types.VNone):
         self.builder.ret_void()
     else:
         self.builder.ret(val.auto_load(self.builder))
Ejemplo n.º 5
0
 def _visit_expr_List(self, node):
     elts = [self.visit_expression(elt) for elt in node.elts]
     if elts:
         el_type = elts[0].new()
         for elt in elts[1:]:
             el_type.merge(elt)
     else:
         el_type = base_types.VNone()
     count = len(elts)
     r = lists.VList(el_type, count)
     r.elts = elts
     return r
Ejemplo n.º 6
0
def infer_function_types(env, node, param_types):
    ns = deepcopy(param_types)
    ts = _TypeScanner(env, ns)
    ts.visit(node)
    while True:
        prev_ns = deepcopy(ns)
        ts = _TypeScanner(env, ns)
        ts.visit(node)
        if all(v.same_type(prev_ns[k]) for k, v in ns.items()):
            # no more promotions - completed
            if "return" not in ns:
                ns["return"] = base_types.VNone()
            return ns