Commit 4ed35f23 authored by Stefan Behnel's avatar Stefan Behnel

split Cython's Generator type into separate Coroutine and Generator types to...

split Cython's Generator type into separate Coroutine and Generator types to prepare PEP 492 implementation
parent be1d2f0d
...@@ -8669,7 +8669,7 @@ class YieldFromExprNode(YieldExprNode): ...@@ -8669,7 +8669,7 @@ class YieldFromExprNode(YieldExprNode):
self.arg = self.arg.coerce_to_pyobject(env) self.arg = self.arg.coerce_to_pyobject(env)
def generate_evaluation_code(self, code): def generate_evaluation_code(self, code):
code.globalstate.use_utility_code(UtilityCode.load_cached("YieldFrom", "Generator.c")) code.globalstate.use_utility_code(UtilityCode.load_cached("YieldFrom", "Coroutine.c"))
self.arg.generate_evaluation_code(code) self.arg.generate_evaluation_code(code)
code.putln("%s = __Pyx_Generator_Yield_From(%s, %s);" % ( code.putln("%s = __Pyx_Generator_Yield_From(%s, %s);" % (
......
...@@ -2071,17 +2071,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -2071,17 +2071,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln("%s = PyBytes_FromStringAndSize(\"\", 0); %s" % ( code.putln("%s = PyBytes_FromStringAndSize(\"\", 0); %s" % (
Naming.empty_bytes, code.error_goto_if_null(Naming.empty_bytes, self.pos))) Naming.empty_bytes, code.error_goto_if_null(Naming.empty_bytes, self.pos)))
code.putln("#ifdef __Pyx_CyFunction_USED") for ext_type in ('CyFunction', 'FusedFunction', 'Coroutine', 'Generator'):
code.put_error_if_neg(self.pos, "__Pyx_CyFunction_init()") code.putln("#ifdef __Pyx_%s_USED" % ext_type)
code.putln("#endif") code.put_error_if_neg(self.pos, "__pyx_%s_init()" % ext_type)
code.putln("#endif")
code.putln("#ifdef __Pyx_FusedFunction_USED")
code.put_error_if_neg(self.pos, "__pyx_FusedFunction_init()")
code.putln("#endif")
code.putln("#ifdef __Pyx_Generator_USED")
code.put_error_if_neg(self.pos, "__pyx_Generator_init()")
code.putln("#endif")
code.putln("/*--- Library function declarations ---*/") code.putln("/*--- Library function declarations ---*/")
env.generate_library_function_declarations(code) env.generate_library_function_declarations(code)
......
...@@ -3956,8 +3956,8 @@ class GeneratorDefNode(DefNode): ...@@ -3956,8 +3956,8 @@ class GeneratorDefNode(DefNode):
qualname = code.intern_identifier(self.qualname) qualname = code.intern_identifier(self.qualname)
code.putln('{') code.putln('{')
code.putln('__pyx_GeneratorObject *gen = __Pyx_Generator_New(' code.putln('__pyx_CoroutineObject *gen = __Pyx_Generator_New('
'(__pyx_generator_body_t) %s, (PyObject *) %s, %s, %s); %s' % ( '(__pyx_coroutine_body_t) %s, (PyObject *) %s, %s, %s); %s' % (
body_cname, Naming.cur_scope_cname, name, qualname, body_cname, Naming.cur_scope_cname, name, qualname,
code.error_goto_if_null('gen', self.pos))) code.error_goto_if_null('gen', self.pos)))
code.put_decref(Naming.cur_scope_cname, py_object_type) code.put_decref(Naming.cur_scope_cname, py_object_type)
...@@ -3972,7 +3972,7 @@ class GeneratorDefNode(DefNode): ...@@ -3972,7 +3972,7 @@ class GeneratorDefNode(DefNode):
code.putln('}') code.putln('}')
def generate_function_definitions(self, env, code): def generate_function_definitions(self, env, code):
env.use_utility_code(UtilityCode.load_cached("Generator", "Generator.c")) env.use_utility_code(UtilityCode.load_cached("Generator", "Coroutine.c"))
self.gbody.generate_function_header(code, proto=True) self.gbody.generate_function_header(code, proto=True)
super(GeneratorDefNode, self).generate_function_definitions(env, code) super(GeneratorDefNode, self).generate_function_definitions(env, code)
...@@ -4005,7 +4005,7 @@ class GeneratorBodyDefNode(DefNode): ...@@ -4005,7 +4005,7 @@ class GeneratorBodyDefNode(DefNode):
self.declare_generator_body(env) self.declare_generator_body(env)
def generate_function_header(self, code, proto=False): def generate_function_header(self, code, proto=False):
header = "static PyObject *%s(__pyx_GeneratorObject *%s, PyObject *%s)" % ( header = "static PyObject *%s(__pyx_CoroutineObject *%s, PyObject *%s)" % (
self.entry.func_cname, self.entry.func_cname,
Naming.generator_cname, Naming.generator_cname,
Naming.sent_value_cname) Naming.sent_value_cname)
...@@ -4070,7 +4070,7 @@ class GeneratorBodyDefNode(DefNode): ...@@ -4070,7 +4070,7 @@ class GeneratorBodyDefNode(DefNode):
code.put_label(code.error_label) code.put_label(code.error_label)
if Future.generator_stop in env.global_scope().context.future_directives: if Future.generator_stop in env.global_scope().context.future_directives:
# PEP 479: turn accidental StopIteration exceptions into a RuntimeError # PEP 479: turn accidental StopIteration exceptions into a RuntimeError
code.globalstate.use_utility_code(UtilityCode.load_cached("pep479", "Generator.c")) code.globalstate.use_utility_code(UtilityCode.load_cached("pep479", "Coroutine.c"))
code.putln("if (unlikely(PyErr_ExceptionMatches(PyExc_StopIteration))) " code.putln("if (unlikely(PyErr_ExceptionMatches(PyExc_StopIteration))) "
"__Pyx_Generator_Replace_StopIteration();") "__Pyx_Generator_Replace_StopIteration();")
for cname, type in code.funcstate.all_managed_temps(): for cname, type in code.funcstate.all_managed_temps():
...@@ -4082,7 +4082,7 @@ class GeneratorBodyDefNode(DefNode): ...@@ -4082,7 +4082,7 @@ class GeneratorBodyDefNode(DefNode):
code.put_xdecref(Naming.retval_cname, py_object_type) code.put_xdecref(Naming.retval_cname, py_object_type)
code.putln('%s->resume_label = -1;' % Naming.generator_cname) code.putln('%s->resume_label = -1;' % Naming.generator_cname)
# clean up as early as possible to help breaking any reference cycles # clean up as early as possible to help breaking any reference cycles
code.putln('__Pyx_Generator_clear((PyObject*)%s);' % Naming.generator_cname) code.putln('__Pyx_Coroutine_clear((PyObject*)%s);' % Naming.generator_cname)
code.put_finish_refcount_context() code.put_finish_refcount_context()
code.putln('return NULL;') code.putln('return NULL;')
code.putln("}") code.putln("}")
...@@ -5512,7 +5512,7 @@ class ReturnStatNode(StatNode): ...@@ -5512,7 +5512,7 @@ class ReturnStatNode(StatNode):
elif self.in_generator: elif self.in_generator:
# return value == raise StopIteration(value), but uncatchable # return value == raise StopIteration(value), but uncatchable
code.globalstate.use_utility_code( code.globalstate.use_utility_code(
UtilityCode.load_cached("ReturnWithStopIteration", "Generator.c")) UtilityCode.load_cached("ReturnWithStopIteration", "Coroutine.c"))
code.putln("%s = NULL; __Pyx_ReturnWithStopIteration(%s);" % ( code.putln("%s = NULL; __Pyx_ReturnWithStopIteration(%s);" % (
Naming.retval_cname, Naming.retval_cname,
self.value.py_result())) self.value.py_result()))
...@@ -7205,8 +7205,8 @@ utility_code_for_cimports = { ...@@ -7205,8 +7205,8 @@ utility_code_for_cimports = {
utility_code_for_imports = { utility_code_for_imports = {
# utility code used when special modules are imported. # utility code used when special modules are imported.
# TODO: Consider a generic user-level mechanism for importing # TODO: Consider a generic user-level mechanism for importing
'asyncio': ("__Pyx_patch_asyncio", "PatchAsyncIO", "Generator.c"), 'asyncio': ("__Pyx_patch_asyncio", "PatchAsyncIO", "Coroutine.c"),
'inspect': ("__Pyx_patch_inspect", "PatchInspect", "Generator.c"), 'inspect': ("__Pyx_patch_inspect", "PatchInspect", "Coroutine.c"),
} }
......
...@@ -68,7 +68,7 @@ static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, ...@@ -68,7 +68,7 @@ static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m,
PyObject *dict); PyObject *dict);
static int __Pyx_CyFunction_init(void); static int __pyx_CyFunction_init(void);
//////////////////// CythonFunction //////////////////// //////////////////// CythonFunction ////////////////////
//@substitute: naming //@substitute: naming
...@@ -693,7 +693,7 @@ static PyTypeObject __pyx_CyFunctionType_type = { ...@@ -693,7 +693,7 @@ static PyTypeObject __pyx_CyFunctionType_type = {
}; };
static int __Pyx_CyFunction_init(void) { static int __pyx_CyFunction_init(void) {
#if !CYTHON_COMPILING_IN_PYPY #if !CYTHON_COMPILING_IN_PYPY
// avoid a useless level of call indirection // avoid a useless level of call indirection
__pyx_CyFunctionType_type.tp_call = PyCFunction_Call; __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment