Skip to content

C AST generalizer doesn't allow void functions #13

@sanjit-bhat

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

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