Commit 477d7def authored by Stefan Behnel's avatar Stefan Behnel

comments, code cleanup

parent 21d0f992
...@@ -5007,27 +5007,30 @@ class YieldExprNode(ExprNode): ...@@ -5007,27 +5007,30 @@ class YieldExprNode(ExprNode):
code.put_init_to_py_none(Naming.retval_cname, py_object_type) code.put_init_to_py_none(Naming.retval_cname, py_object_type)
saved = [] saved = []
code.temp_allocator.reset() code.temp_allocator.reset()
code.putln('/* Save temporary variables */') temps_in_use = code.funcstate.temps_in_use()
for cname, type, manage_ref in code.funcstate.temps_in_use(): if temps_in_use:
save_cname = code.temp_allocator.allocate_temp(type) code.putln('/* Save temporary variables */')
saved.append((cname, save_cname, type)) for cname, type, manage_ref in temps_in_use:
if type.is_pyobject: save_cname = code.temp_allocator.allocate_temp(type)
code.put_xgiveref(cname) saved.append((cname, save_cname, type))
code.putln('%s->%s = %s;' % (Naming.cur_scope_cname, save_cname, cname)) if type.is_pyobject:
code.put_xgiveref(cname)
code.putln('%s->%s = %s;' % (Naming.cur_scope_cname, save_cname, cname))
code.put_xgiveref(Naming.retval_cname) code.put_xgiveref(Naming.retval_cname)
code.put_finish_refcount_context() code.put_finish_refcount_context()
code.putln("/* return from function, yielding value */") code.putln("/* return from generator, yielding value */")
code.putln("%s->%s.resume_label = %d;" % (Naming.cur_scope_cname, Naming.obj_base_cname, self.label_num)) code.putln("%s->%s.resume_label = %d;" % (Naming.cur_scope_cname, Naming.obj_base_cname, self.label_num))
code.putln("return %s;" % Naming.retval_cname); code.putln("return %s;" % Naming.retval_cname);
code.put_label(self.label_name) code.put_label(self.label_name)
code.putln('/* Restore temporary variables */') if saved:
for cname, save_cname, type in saved: code.putln('/* Restore temporary variables */')
code.putln('%s = %s->%s;' % (cname, Naming.cur_scope_cname, save_cname)) for cname, save_cname, type in saved:
if type.is_pyobject: code.putln('%s = %s->%s;' % (cname, Naming.cur_scope_cname, save_cname))
code.putln('%s->%s = 0;' % (Naming.cur_scope_cname, save_cname)) if type.is_pyobject:
if type.is_pyobject: code.putln('%s->%s = 0;' % (Naming.cur_scope_cname, save_cname))
code.put_xgotref(cname) if type.is_pyobject:
code.put_xgotref(cname)
if self.result_is_used: if self.result_is_used:
self.allocate_temp_result(code) self.allocate_temp_result(code)
code.putln('%s = %s; %s' % code.putln('%s = %s; %s' %
......
...@@ -1510,7 +1510,7 @@ class FuncDefNode(StatNode, BlockNode): ...@@ -1510,7 +1510,7 @@ class FuncDefNode(StatNode, BlockNode):
resume_code.putln("case 0: goto %s;" % first_run_label) resume_code.putln("case 0: goto %s;" % first_run_label)
for yield_expr in self.yields: for yield_expr in self.yields:
resume_code.putln("case %d: goto %s;" % (yield_expr.label_num, yield_expr.label_name)); resume_code.putln("case %d: goto %s;" % (yield_expr.label_num, yield_expr.label_name));
resume_code.putln("default: /* raise error here */"); resume_code.putln("default: /* CPython raises the right error here */");
resume_code.putln("return NULL;"); resume_code.putln("return NULL;");
resume_code.putln("}"); resume_code.putln("}");
# ----- Python version # ----- Python version
......
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