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
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)
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
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))
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
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