Esempio n. 1
0
def case(code, ctx, debug=False, cpython_compat=True):
    stmt = parse(code).result
    code_obj = py_compile(stmt, is_entrypoint=False)

    if debug:
        with open('out_yapypy_bc.log',
                  'w') as yapypy_bc, open('out_yapypy_info.log',
                                          'w') as yapypy_info:

            dis_code(code_obj, yapypy_bc)
            show_code(code_obj, yapypy_info)
            if cpython_compat:
                code_obj2 = compile(code, "", "exec")
                with open('out_cpy_bc.log',
                          'w') as cpy_bc, open('out_cpy_info.log',
                                               'w') as cpy_info:
                    dis_code(code_obj2, cpy_bc)
                    show_code(code_obj2, cpy_info)
                    print('python:')
                    exec(Bytecode.from_code(code_obj2).to_code(), ctx or {})
        print('yapypy')
        exec(Bytecode.from_code(code_obj).to_code(), ctx or {})

    else:
        exec(code_obj, ctx)
Esempio n. 2
0
    def test_all(self):
        for each in filter(lambda p: p[-1].endswith('.py'), yapypy.collect()):
            filename = each.__str__()

            if each.parent().exists():
                pass
            else:
                each.parent().mkdir()

            with each.open('r') as fr:
                collector = DocStringsCollector()
                mod = ast.parse(fr.read())
                collector.visit(mod)

            mod_name, _ = splitext(each.relative())

            for idx, [fn_name, lineno, title, prepare_code,
                      test_code] in enumerate(collector.docs):

                print(f'tests of {mod_name}.{title or fn_name} started...')

                context = {'self': self}
                prepare_code = dedent_all(prepare_code)
                test_code = dedent_all(test_code)
                fixer = FixLineno(lineno)
                try:
                    node = ast.parse(prepare_code, filename, mode='exec')

                    fixer.visit(node)
                    code = compile(node, filename, "exec")
                except SyntaxError as exc:
                    exc.lineno = lineno
                    exc.filename = filename
                    raise exc
                bc = Bytecode.from_code(code)
                bc.filename = filename
                bc.first_lineno = lineno
                exec(bc.to_code(), context)

                # not correct but as a workaround

                fixer = FixLineno(lineno + test_code.count('\n'))
                try:
                    node = parse(test_code, filename).result
                    # pprint(node)
                    fixer.visit(node)
                    code = py_compile(node, filename, is_entrypoint=True)
                except SyntaxError as exc:
                    exc.lineno = lineno
                    exc.filename = filename
                    raise exc
                bc = Bytecode.from_code(code)
                bc.filename = filename
                bc.first_lineno = lineno
                code_obj = bc.to_code()

                exec(code_obj, context)
                print(f'tests of {mod_name}.{title or fn_name} passed.')
Esempio n. 3
0
def yapypy_debug(code: str, should_exec=False, ctx=None):
    res = to_tagged_ast(parse(code).result)
    c = py_compile(res)
    print("-----------Code")
    print(code)
    print("-----------YaPyPy")
    print(dis.dis(c))
    print("-----------YaPyPy exec result")
    if should_exec:
        exec(c, ctx or {})
    else:
        print("\t(skip)")
Esempio n. 4
0
def get_yapypy_module_spec_from_path(names, module_path):
    with Path(module_path).open('r') as fr:
        spec = ModuleSpec(names, YAPyPyLoader(names, module_path))
        __source__ = fr.read()
        result = parse(__source__, module_path)
        # pprint(result.result)
        check_parsing_complete(__source__, result.tokens, result.state)
        __bytecode__ = py_compile(result.result,
                                  filename=module_path,
                                  is_entrypoint=False)
        spec.__source__ = __source__
        spec.__bytecode__ = __bytecode__
        return spec
Esempio n. 5
0
def easy_debug(code: str, should_exec=False, ctx=None):
    res = to_tagged_ast(parse(code).result)
    c = py_compile(res)
    print("-----------code")
    print(code)
    print("-----------Python")
    print(dis.dis(code))
    print("-----------YaPyPy")
    print(dis.dis(c))
    print("-----------astpretty")
    astpretty.pprint(ast.parse(code))
    print("----------- Python exec result")
    exec(code, ctx or {})
    print("-----------YaPyPy exec result")
    if should_exec:
        exec(c, ctx or {})
    else:
        print("\t(skip)")
Esempio n. 6
0
def yapypy_test_code(code: str, should_exec=False, ctx=None):
    res = to_tagged_ast(parse(code).result)
    c = py_compile(res)
    if should_exec:
        exec(c, ctx or {})
Esempio n. 7
0
def parse_expr(expr_code):
    return parse(expr_code).result.body[0].value
Esempio n. 8
0
from yapypy.extended_python.parser import parse
from yapypy.extended_python.symbol_analyzer import ASTTagger, SymTable, to_tagged_ast, Tag
from yapypy.extended_python.pybc_emit import py_compile
import dis


def parse_expr(expr_code):
    return parse(expr_code).result.body[0].value


stmt = parse("""
print(1)
def f(x):
    a = 1
    def g(y):
        a + 1
        def u(z):
            k = 1
            v + k
    v = 3
    k = 4
""").result

res: Tag = to_tagged_ast(stmt)
print(res.tag.show_resolution())

stmt = parse("""
from os.path import join
from os import *
from os.path import *
def f(x):
    x
Esempio n. 9
0
A = "A"

p (f'{A}')
p (f'{A!r}')
p (f'{A!s}')
p (f'{A!a}')

p (f'{A!r:>30}')
p (f'{A!r:<30}')

p (f'{A!r:^30}')
p (f'{A!r:*^20}')

p (f'{3.14:+f}')
p (f'{3.14:f}')
p (f'{3.14:-f}')
a = 233
p (f'{a:d} {a:x} {a:o} {a:b}')
p (f'{a:d} {a:#x} {a:#o} {a:#b}')

p (f'{123456789:,}')
p (f'{19/22:.2%}')

p (f'{datetime.now():%Y-%m-%d %H:%M:%S}' ) 

"""

res: Tag = to_tagged_ast(parse(code).result)

exec(py_compile(res))