Skip to content

C AST generalizer doesn't allow void functions #13

Description

@sanjit-bhat

TLDR: If you run the Transpyler AST Generalizer on a C program with void functions, it will throw an isinstance assertion error because pycparser returns None for the function declaration, while the AST Generalizer expects a typed_ast3.arguments type. Here's a link to the relevant Transpyler function.

Transpyle version: 0.8.0
Pycparser version: 2.19

Minimal code example:

import pathlib
import transpyle

path = pathlib.Path('my_script.c')
code_reader = transpyle.general.code_reader.CodeReader()
code = code_reader.read_file(path)

from_language = transpyle.Language.find('C11')
to_language = transpyle.Language.find('Python 3.6')
translator = transpyle.AutoTranslator(from_language, to_language)
c_code = translator.translate(code, path)
print(c_code)

with my_script.c set to

void foo() {
    int hello = 6;
}

My traceback is

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    c_code = translator.translate(code, path)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/general/translator.py", line 26, in translate
    general_ast = self.ast_generalizer.generalize(specific_ast, **ast_generalizer_kwargs)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 435, in generalize
    general_ast = backend.visit(syntax)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 80, in visit
    return super().visit(node)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pycparser/c_ast.py", line 158, in visit
    return visitor(node)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 83, in visit_FileAST
    ext = [self.visit(subnode) for subnode in node.ext]
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 83, in <listcomp>
    ext = [self.visit(subnode) for subnode in node.ext]
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 80, in visit
    return super().visit(node)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pycparser/c_ast.py", line 158, in visit
    return visitor(node)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 91, in visit_FuncDef
    name, args, return_type = self.visit(node.decl)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 80, in visit
    return super().visit(node)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pycparser/c_ast.py", line 158, in visit
    return visitor(node)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 266, in visit_Decl
    type_data = self.visit(node.type)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 80, in visit
    return super().visit(node)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pycparser/c_ast.py", line 158, in visit
    return visitor(node)
  File "/Users/sanjit/.pyenv/versions/3.8.1/lib/python3.8/site-packages/transpyle/c/ast_generalizer.py", line 106, in visit_FuncDecl
    assert isinstance(args, typed_ast3.arguments)
AssertionError

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions