예제 #1
0
 def get_args_and_retval(cls, dct):
     from itypes.typedb import TypeDB
     args = [arg.strip() for arg in dct['args'].split(',')]
     if args == ['']:
         args = []
     else:
         args = [TypeDB.get_type_by_name(arg) for arg in args]
     retval = TypeDB.get_type_by_name(dct['retval'])
     return args, retval
예제 #2
0
    def visit_ListComp(self, node):
        from parser.functions import FunctionImplementation

        # calculate result type
        if len(node.generators) > 1:
            raise InvalidOperation(
                "Only one for statement permitted in comprehensions")
        comp = node.generators[0]
        if len(comp.ifs) > 1:
            raise InvalidOperation(
                "Only one if statement allowed in List Comprehension")
        assign_node = ast.Assign(targets=[comp.target],
                                 value=ast.Subscript(value=comp.iter,
                                                     slice=ast.Index(
                                                         ast.Num(0))))
        return_node = ast.Return(value=node.elt)
        function_node = ast.FunctionDef(name="temp",
                                        args=ast.arguments(args=[],
                                                           vararg=None,
                                                           kwonlyargs=[],
                                                           kw_defaults=[],
                                                           kwarg=None,
                                                           defaults=[]),
                                        body=[assign_node, return_node])
        function_interpreter = FunctionImplementation(function_node, (),
                                                      self.context)
        result_type = TypeDB.get_list([function_interpreter.retval.tp])

        # create temp list to hold values
        result = self.context.get_temp_var(result_type)
        self.prepends.append(
            f"{result.code} = {result_type.as_literal([])};\n")
        # create for expression
        append_node = ast.Expr(
            ast.Call(func=ast.Attribute(value=ast.Name(id=result.code,
                                                       ctx=ast.Load()),
                                        attr="append",
                                        ctx=ast.Load()),
                     args=[node.elt],
                     keywords=[]))
        if comp.ifs:
            body = ast.If(test=comp.ifs[0], body=[append_node], orelse=[])
        else:
            body = append_node
        for_node = ast.For(target=comp.target,
                           iter=comp.iter,
                           body=[body],
                           orelse=[])
        self.prepends.append(for_node)
        return result
예제 #3
0
파일: module.py 프로젝트: furbrain/pymbo
 def visit_ClassDef(self, node: ast.ClassDef):
     cls = ClassParser(node, self)
     self.context[node.name] = Code(tp=cls.get_type(), code=node.name)
     tp = cls.get_type()
     TypeDB.add_type(tp)
     TypeDB.add_type(tp.instance)
예제 #4
0
파일: module.py 프로젝트: furbrain/pymbo
 def visit_FunctionDef(self, node: ast.FunctionDef):
     tp = MultiFunction(node, self.context)
     self.context[node.name] = Code(tp=tp, code=node.name)
     TypeDB.add_type(tp)
예제 #5
0
 def visit_List(self, node):
     types_and_codes = [self.visit(n) for n in node.elts]
     tp = TypeDB.get_list([t.tp for t in types_and_codes])
     code = tp.as_literal([t.code for t in types_and_codes])
     return Code(tp=tp, code=code)
예제 #6
0
 def visit_NameConstant(self, node):
     return Code(tp=TypeDB.get_type_by_value(node.value),
                 code=self.CONSTANTS_MAP[node.value])
예제 #7
0
 def visit_Bytes(self, node):
     tp = TypeDB.get_string()
     return Code(tp=tp, code=tp.as_literal(str(node.s, 'utf-8')))
예제 #8
0
 def visit_Str(self, node):
     tp = TypeDB.get_string()
     return Code(tp=tp, code=tp.as_literal(node.s))
예제 #9
0
 def visit_Num(self, node):
     return Code(tp=TypeDB.get_type_by_value(node.n), code=str(node.n))
예제 #10
0
파일: utils.py 프로젝트: furbrain/pymbo
 def setUp(self) -> None:
     TypeDB.reset()