facebookincubator / cinder

Cinder is Meta's internal performance-oriented production version of CPython.
https://trycinder.com
Other
3.43k stars 122 forks source link

static compile: support chained comparison #28

Closed belm0 closed 2 years ago

belm0 commented 3 years ago
if 0 < 5 < 10:
    pass
$ python -m compiler --static foo.py
Traceback (most recent call last):
  File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3.8/compiler/__main__.py", line 81, in <module>
    codeobj = pycodegen.compile(
  File "/usr/lib/python3.8/compiler/pycodegen.py", line 111, in compile
    result = make_compiler(source, filename, mode, flags, optimize, compiler, modname)
  File "/usr/lib/python3.8/compiler/pycodegen.py", line 154, in make_compiler
    return generator.make_code_gen(
  File "/usr/lib/python3.8/compiler/static.py", line 6848, in make_code_gen
    code_gen.visit(tree)
  File "/usr/lib/python3.8/compiler/pycodegen.py", line 2815, in visit
    ret = super().visit(node, *args)
  File "/usr/lib/python3.8/compiler/visitor.py", line 70, in visit
    return meth(node, *args)
  File "/usr/lib/python3.8/compiler/static.py", line 6939, in visitModule
    super().visitModule(node)
  File "/usr/lib/python3.8/compiler/pycodegen.py", line 379, in visitModule
    self.visit(self.skip_docstring(node.body))
  File "/usr/lib/python3.8/compiler/pycodegen.py", line 2815, in visit
    ret = super().visit(node, *args)
  File "/usr/lib/python3.8/compiler/visitor.py", line 62, in visit
    return self.walk_list(node, *args)
  File "/usr/lib/python3.8/compiler/visitor.py", line 53, in walk_list
    self.visit(item, *args)
  File "/usr/lib/python3.8/compiler/pycodegen.py", line 2815, in visit
    ret = super().visit(node, *args)
  File "/usr/lib/python3.8/compiler/visitor.py", line 70, in visit
    return meth(node, *args)
  File "/usr/lib/python3.8/compiler/pycodegen.py", line 586, in visitIf
    self.compileJumpIf(test, orelse or end, False)
  File "/usr/lib/python3.8/compiler/static.py", line 7282, in compileJumpIf
    self.get_type(test).emit_jumpif(test, next, is_if_true, self)
  File "/usr/lib/python3.8/compiler/static.py", line 911, in emit_jumpif
    CinderCodeGenerator.compileJumpIf(code_gen, test, next, is_if_true)
  File "/usr/lib/python3.8/compiler/pycodegen.py", line 2277, in compileJumpIf
    self.emitChainedCompareStep(
  File "/usr/lib/python3.8/compiler/static.py", line 7112, in emitChainedCompareStep
    self.visit(value)
  File "/usr/lib/python3.8/compiler/pycodegen.py", line 2815, in visit
    ret = super().visit(node, *args)
  File "/usr/lib/python3.8/compiler/visitor.py", line 70, in visit
    return meth(node, *args)
  File "/usr/lib/python3.8/compiler/visitor.py", line 42, in generic_visit
    for _field, value in ast.iter_fields(node):
  File "/usr/lib/python3.8/ast.py", line 229, in iter_fields
    for field in node._fields:
AttributeError: 'Block' object has no attribute '_fields'
carljm commented 3 years ago

Thanks for the report! Should be fixed by 30b705e71334894a65d30e52fc1d50f0e1632060

belm0 commented 2 years ago

@carljm fix was reverted, please reopen

https://github.com/facebookincubator/cinder/commit/b2e06ede4ee83833e8bb83f749d15ae357ba41fb

carljm commented 2 years ago

Fix was re-landed in 1d1d69b616875c1df633bd4dd3ea51d8ad95c011