@@ -139,6 +139,7 @@ def visit_ClassDef(self, node):
139139 self .writer .write_temp_decls (body_visitor .block )
140140 self .writer .write_block (body_visitor .block ,
141141 body_visitor .writer .getvalue ())
142+ self .writer .write ('return nil, nil' )
142143 tmpl = textwrap .dedent ("""\
143144 }).Eval(πF, πF.Globals(), nil, nil)
144145 if πE != nil {
@@ -355,9 +356,8 @@ def visit_Return(self, node):
355356 raise util .ParseError (node , 'returning a value in a generator function' )
356357 if node .value :
357358 with self .visit_expr (node .value ) as value :
358- self .writer .write ('return {}, nil' .format (value .expr ))
359- else :
360- self .writer .write ('return nil, nil' )
359+ self .writer .write ('πR = {}' .format (value .expr ))
360+ self .writer .write ('continue' )
361361
362362 def visit_Try (self , node ):
363363 # The general structure generated by this method is shown below:
@@ -404,39 +404,38 @@ def visit_Try(self, node):
404404
405405 with self .block .alloc_temp ('*πg.BaseException' ) as exc :
406406 if except_label :
407- if (len (node .handlers ) == 1 and not node .handlers [0 ].type and
408- not node .orelse ):
409- # When there's just a bare except, no dispatch is required.
410- self ._write_except_block (except_label , exc .expr , node .handlers [0 ])
407+ with self .block .alloc_temp ('*πg.Traceback' ) as tb :
408+ self .writer .write_label (except_label )
409+ self .writer .write_tmpl (textwrap .dedent ("""\
410+ if πE == nil {
411+ continue
412+ }
413+ πE = nil
414+ $exc, $tb = πF.ExcInfo()""" ), exc = exc .expr , tb = tb .expr )
415+ handler_labels = self ._write_except_dispatcher (
416+ exc .expr , tb .expr , node .handlers )
417+
418+ # Write the bodies of each of the except handlers.
419+ for handler_label , except_node in zip (handler_labels , node .handlers ):
420+ self ._write_except_block (handler_label , exc .expr , except_node )
411421 if node .finalbody :
412422 self .writer .write ('πF.PopCheckpoint()' ) # finally_label
413423 self .writer .write ('goto Label{}' .format (finally_label ))
414- else :
415- with self .block .alloc_temp ('*πg.Traceback' ) as tb :
416- self .writer .write_label (except_label )
417- self .writer .write ('{}, {} = πF.ExcInfo()' .format (exc .expr , tb .expr ))
418- handler_labels = self ._write_except_dispatcher (
419- exc .expr , tb .expr , node .handlers )
420-
421- # Write the bodies of each of the except handlers.
422- for handler_label , except_node in zip (handler_labels , node .handlers ):
423- self ._write_except_block (handler_label , exc .expr , except_node )
424- if node .finalbody :
425- self .writer .write ('πF.PopCheckpoint()' ) # finally_label
426- self .writer .write ('goto Label{}' .format (finally_label ))
427424
428425 # Write the finally body.
429426 self .writer .write_label (finally_label )
430427 if node .finalbody :
431428 with self .block .alloc_temp ('*πg.Traceback' ) as tb :
432- self .writer .write ('πE = nil' )
433429 self .writer .write ('{}, {} = πF.RestoreExc(nil, nil)' .format (
434430 exc .expr , tb .expr ))
435431 self ._visit_each (node .finalbody )
436432 self .writer .write_tmpl (textwrap .dedent ("""\
437433 if $exc != nil {
438434 \t πE = πF.Raise($exc.ToObject(), nil, $tb.ToObject())
439435 \t continue
436+ }
437+ if πR != nil {
438+ \t continue
440439 }""" ), exc = exc .expr , tb = tb .expr )
441440
442441 def visit_While (self , node ):
@@ -532,6 +531,9 @@ def visit_With(self, node):
532531 if $exc != nil && $swallow_exc != true {
533532 \t πE = πF.Raise(nil, nil, nil)
534533 \t continue
534+ }
535+ if πR != nil {
536+ \t continue
535537 }""" ), exc = exc .expr , swallow_exc = swallow_exc_bool .expr )
536538
537539 def visit_function_inline (self , node ):
@@ -584,14 +586,25 @@ def visit_function_inline(self, node):
584586 self .writer .write (fmt .format (
585587 util .adjust_local_name (var .name ), var .init_expr ))
586588 self .writer .write_temp_decls (func_block )
589+ self .writer .write ('var πR *πg.Object; _ = πR' )
590+ self .writer .write ('var πE *πg.BaseException; _ = πE' )
587591 if func_block .is_generator :
588- self .writer .write ('return πg.NewGenerator(πF, func(πSent *πg.Object) '
589- '(*πg.Object, *πg.BaseException) {' )
592+ self .writer .write (
593+ 'return πg.NewGenerator(πF, func(πSent *πg.Object) '
594+ '(*πg.Object, *πg.BaseException) {' )
590595 with self .writer .indent_block ():
591596 self .writer .write_block (func_block , visitor .writer .getvalue ())
597+ self .writer .write ('return nil, πE' )
592598 self .writer .write ('}).ToObject(), nil' )
593599 else :
594600 self .writer .write_block (func_block , visitor .writer .getvalue ())
601+ self .writer .write (textwrap .dedent ("""\
602+ if πE != nil {
603+ \t πR = nil
604+ } else if πR == nil {
605+ \t πR = πg.None
606+ }
607+ return πR, πE""" ))
595608 self .writer .write ('}), πF.Globals()).ToObject()' )
596609 return result
597610
@@ -733,7 +746,6 @@ def _write_except_block(self, label, exc, except_node):
733746 self .block .bind_var (self .writer , except_node .name .id ,
734747 '{}.ToObject()' .format (exc ))
735748 self ._visit_each (except_node .body )
736- self .writer .write ('πE = nil' )
737749 self .writer .write ('πF.RestoreExc(nil, nil)' )
738750
739751 def _write_except_dispatcher (self , exc , tb , handlers ):
0 commit comments