Skip to content

Cythonization of pure Python crashes with function that passes its argument splat to a class definition. #3338

@will-ca

Description

@will-ca

This doesn't translate properly:

def ClassMaker(*bases):
	class MadeClass(*bases):
		pass
	return MadeClass
Compiling testfile.py because it changed.
[1/1] Cythonizing testfile.py
Traceback (most recent call last):
  File "setup.py", line 12, in <module>
    distutils.core.setup(ext_modules=Cython.Build.cythonize(packpaths, nthreads=buildthreads, compiler_directives={'language_level': 3, 'profile': True}, annotate=True))
  File ".../Cython/Build/Dependencies.py", line 1096, in cythonize
    cythonize_one(*args)
  File ".../Cython/Build/Dependencies.py", line 1202, in cythonize_one
    result = compile_single(pyx_file, options, full_module_name=full_module_name)
  File ".../Cython/Compiler/Main.py", line 727, in compile_single
    return run_pipeline(source, options, full_module_name)
  File ".../Cython/Compiler/Main.py", line 515, in run_pipeline
    err, enddata = Pipeline.run_pipeline(pipeline, source)
  File ".../Cython/Compiler/Pipeline.py", line 355, in run_pipeline
    data = run(phase, data)
  File ".../Cython/Compiler/Pipeline.py", line 335, in run
    return phase(data)
  File ".../Cython/Compiler/Pipeline.py", line 52, in generate_pyx_code_stage
    module_node.process_implementation(options, result)
  File ".../Cython/Compiler/ModuleNode.py", line 143, in process_implementation
    self.generate_c_code(env, options, result)
  File ".../Cython/Compiler/ModuleNode.py", line 385, in generate_c_code
    self.body.generate_function_definitions(env, code)
  File ".../Cython/Compiler/Nodes.py", line 442, in generate_function_definitions
    stat.generate_function_definitions(env, code)
  File ".../Cython/Compiler/Nodes.py", line 442, in generate_function_definitions
    stat.generate_function_definitions(env, code)
  File ".../Cython/Compiler/Nodes.py", line 3176, in generate_function_definitions
    FuncDefNode.generate_function_definitions(self, env, code)
  File ".../Cython/Compiler/Nodes.py", line 1983, in generate_function_definitions
    self.generate_function_body(env, code)
  File ".../Cython/Compiler/Nodes.py", line 1745, in generate_function_body
    self.body.generate_execution_code(code)
  File ".../Cython/Compiler/Nodes.py", line 448, in generate_execution_code
    stat.generate_execution_code(code)
  File ".../Cython/Compiler/Nodes.py", line 4601, in generate_execution_code
    self.class_result.generate_evaluation_code(code)
  File ".../Cython/Compiler/ExprNodes.py", line 773, in generate_evaluation_code
    self.generate_result_code(code)
  File ".../Cython/Compiler/ExprNodes.py", line 9034, in generate_result_code
    self.bases.py_result(),
  File ".../Cython/Compiler/ExprNodes.py", line 525, in py_result
    return self.result_as(py_object_type)
  File ".../Cython/Compiler/ExprNodes.py", line 516, in result_as
    if (self.is_temp and self.type.is_pyobject and
AttributeError: 'NoneType' object has no attribute 'is_pyobject'

The two forms below compile fine though:

def ClassMaker(bases):
	class MadeClass(*bases):
		pass
	return MadeClass
def ClassMaker(*bases):
	class MadeClass(bases):
		pass
	return MadeClass

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions