11// Evaluate opcodes
22package vm
33
4- // FIXME vm.result -> retval
5- // vm.exit -> vm.why
6- // why codes
7-
84// FIXME make opcode its own type so can stringer
95
106// FIXME use LocalVars instead of storing everything in the Locals dict
@@ -119,13 +115,13 @@ func (vm *Vm) AddTraceback(exc *py.ExceptionInfo) {
119115// The exception must be a valid exception instance (eg as returned by
120116// py.MakeException)
121117//
122- // It sets vm.curexc.* and sets vm.exit to exitException
118+ // It sets vm.curexc.* and sets vm.why to whyException
123119func (vm * Vm ) SetException (exception py.Object ) {
124120 vm .curexc .Value = exception
125121 vm .curexc .Type = exception .Type ()
126122 vm .curexc .Traceback = nil
127123 vm .AddTraceback (& vm .curexc )
128- vm .exit = exitException
124+ vm .why = whyException
129125}
130126
131127// Check for an exception (panic)
@@ -136,7 +132,7 @@ func (vm *Vm) CheckExceptionRecover(r interface{}) {
136132 if exc , ok := r .(py.ExceptionInfo ); ok {
137133 vm .curexc = exc
138134 vm .AddTraceback (& vm .curexc )
139- vm .exit = exitException
135+ vm .why = whyException
140136 debugf ("*** Propagating exception: %s\n " , exc .Error ())
141137 } else {
142138 // Coerce whatever was raised into a *Exception
@@ -489,15 +485,15 @@ func do_PRINT_EXPR(vm *Vm, arg int32) {
489485// Terminates a loop due to a break statement.
490486func do_BREAK_LOOP (vm * Vm , arg int32 ) {
491487 defer vm .CheckException ()
492- vm .exit = exitBreak
488+ vm .why = whyBreak
493489}
494490
495491// Continues a loop due to a continue statement. target is the address
496492// to jump to (which should be a FOR_ITER instruction).
497493func do_CONTINUE_LOOP (vm * Vm , target int32 ) {
498494 defer vm .CheckException ()
499- vm .result = py .Int (target )
500- vm .exit = exitContinue
495+ vm .retval = py .Int (target )
496+ vm .why = whyContinue
501497}
502498
503499// Iterate v argcnt times and store the results on the stack (via decreasing
@@ -599,13 +595,13 @@ func do_MAP_ADD(vm *Vm, i int32) {
599595// Returns with TOS to the caller of the function.
600596func do_RETURN_VALUE (vm * Vm , arg int32 ) {
601597 defer vm .CheckException ()
602- vm .result = vm .POP ()
598+ vm .retval = vm .POP ()
603599 if len (vm .frame .Stack ) != 0 {
604600 debugf ("vmstack = %#v\n " , vm .frame .Stack )
605601 panic ("vm stack should be empty at this point" )
606602 }
607603 vm .frame .Yielded = false
608- vm .exit = exitReturn
604+ vm .why = whyReturn
609605}
610606
611607// Pops TOS and delegates to it as a subiterator from a generator.
@@ -627,21 +623,21 @@ func do_YIELD_FROM(vm *Vm, arg int32) {
627623 }
628624 // x remains on stack, retval is value to be yielded
629625 // FIXME vm.frame.Stacktop = stack_pointer
630- //why = exitYield
626+ //why = whyYield
631627 // and repeat...
632628 vm .frame .Lasti --
633629
634- vm .result = retval
630+ vm .retval = retval
635631 vm .frame .Yielded = true
636- vm .exit = exitYield
632+ vm .why = whyYield
637633}
638634
639635// Pops TOS and yields it from a generator.
640636func do_YIELD_VALUE (vm * Vm , arg int32 ) {
641637 defer vm .CheckException ()
642- vm .result = vm .POP ()
638+ vm .retval = vm .POP ()
643639 vm .frame .Yielded = true
644- vm .exit = exitYield
640+ vm .why = whyYield
645641}
646642
647643// Loads all symbols not starting with '_' directly from the module
@@ -702,16 +698,16 @@ func do_END_FINALLY(vm *Vm, arg int32) {
702698 // None exception
703699 debugf (" END_FINALLY: None\n " )
704700 } else if vInt , ok := v .(py.Int ); ok {
705- vm .exit = vmExit (vInt )
706- debugf (" END_FINALLY: Int %v\n " , vm .exit )
707- switch vm .exit {
708- case exitYield :
709- panic ("Unexpected exitYield in END_FINALLY" )
710- case exitException :
711- panic ("Unexpected exitException in END_FINALLY" )
712- case exitReturn , exitContinue :
713- vm .result = vm .POP ()
714- case exitSilenced :
701+ vm .why = vmStatus (vInt )
702+ debugf (" END_FINALLY: Int %v\n " , vm .why )
703+ switch vm .why {
704+ case whyYield :
705+ panic ("Unexpected whyYield in END_FINALLY" )
706+ case whyException :
707+ panic ("Unexpected whyException in END_FINALLY" )
708+ case whyReturn , whyContinue :
709+ vm .retval = vm .POP ()
710+ case whySilenced :
715711 // An exception was silenced by 'with', we must
716712 // manually unwind the EXCEPT_HANDLER block which was
717713 // created when the exception was caught, otherwise
@@ -723,7 +719,7 @@ func do_END_FINALLY(vm *Vm, arg int32) {
723719 panic ("Expecting EXCEPT_HANDLER in END_FINALLY" )
724720 }
725721 vm .UnwindExceptHandler (frame , b )
726- vm .exit = exitNot
722+ vm .why = whyNot
727723 }
728724 } else if py .ExceptionClassCheck (v ) {
729725 w := vm .POP ()
@@ -733,11 +729,11 @@ func do_END_FINALLY(vm *Vm, arg int32) {
733729 vm .curexc .Type , _ = v .(* py.Type )
734730 vm .curexc .Value = w
735731 vm .curexc .Traceback , _ = u .(* py.Traceback )
736- vm .exit = exitException
732+ vm .why = whyException
737733 } else {
738734 vm .SetException (py .ExceptionNewf (py .SystemError , "'finally' pops bad exception %#v" , v ))
739735 }
740- debugf ("END_FINALLY: vm.exit = %v\n " , vm .exit )
736+ debugf ("END_FINALLY: vm.why = %v\n " , vm .why )
741737}
742738
743739// Loads the __build_class__ helper function to the stack which
@@ -1250,7 +1246,7 @@ func (vm *Vm) raise(exc, cause py.Object) {
12501246 // Resignal the exception
12511247 vm .curexc = vm .exc
12521248 // Signal the existing exception again
1253- vm .exit = exitException
1249+ vm .why = whyException
12541250
12551251 }
12561252 } else {
@@ -1518,7 +1514,7 @@ func RunFrame(frame *py.Frame) (res py.Object, err error) {
15181514
15191515 var opcode byte
15201516 var arg int32
1521- for vm .exit == exitNot {
1517+ for vm .why == whyNot {
15221518 frame := vm .frame
15231519 debugf ("* %4d:" , frame .Lasti )
15241520 opcodes := frame .Code .Code
@@ -1546,21 +1542,21 @@ func RunFrame(frame *py.Frame) (res py.Object, err error) {
15461542 // }
15471543 // }
15481544 }
1549- if vm .exit == exitYield {
1545+ if vm .why == whyYield {
15501546 goto fast_yield
15511547 }
15521548
15531549 // Something exceptional has happened - unwind the block stack
15541550 // and find out what
1555- for vm .exit != exitNot && vm .frame .Block != nil {
1551+ for vm .why != whyNot && vm .frame .Block != nil {
15561552 // Peek at the current block.
15571553 frame := vm .frame
15581554 b := frame .Block
15591555 debugf ("*** Unwinding %#v vm %#v\n " , b , vm )
15601556
1561- if b .Type == SETUP_LOOP && vm .exit == exitContinue {
1562- vm .exit = exitNot
1563- dest := vm .result .(py.Int )
1557+ if b .Type == SETUP_LOOP && vm .why == whyContinue {
1558+ vm .why = whyNot
1559+ dest := vm .retval .(py.Int )
15641560 frame .Lasti = int32 (dest )
15651561 break
15661562 }
@@ -1574,13 +1570,13 @@ func RunFrame(frame *py.Frame) (res py.Object, err error) {
15741570 continue
15751571 }
15761572 vm .UnwindBlock (frame , b )
1577- if b .Type == SETUP_LOOP && vm .exit == exitBreak {
1573+ if b .Type == SETUP_LOOP && vm .why == whyBreak {
15781574 debugf ("*** Loop\n " )
1579- vm .exit = exitNot
1575+ vm .why = whyNot
15801576 frame .Lasti = b .Handler
15811577 break
15821578 }
1583- if vm .exit == exitException && (b .Type == SETUP_EXCEPT || b .Type == SETUP_FINALLY ) {
1579+ if vm .why == whyException && (b .Type == SETUP_EXCEPT || b .Type == SETUP_FINALLY ) {
15841580 debugf ("*** Exception\n " )
15851581 handler := b .Handler
15861582 // This invalidates b
@@ -1615,29 +1611,29 @@ func RunFrame(frame *py.Frame) (res py.Object, err error) {
16151611 } else {
16161612 vm .PUSH (exc )
16171613 }
1618- vm .exit = exitNot
1614+ vm .why = whyNot
16191615 frame .Lasti = handler
16201616 break
16211617 }
16221618 if b .Type == SETUP_FINALLY {
1623- if vm .exit == exitReturn || vm .exit == exitContinue {
1624- vm .PUSH (vm .result )
1619+ if vm .why == whyReturn || vm .why == whyContinue {
1620+ vm .PUSH (vm .retval )
16251621 }
1626- vm .PUSH (py .Int (vm .exit ))
1627- vm .exit = exitNot
1622+ vm .PUSH (py .Int (vm .why ))
1623+ vm .why = whyNot
16281624 frame .Lasti = b .Handler
16291625 break
16301626 }
16311627 }
16321628 }
1633- debugf ("EXIT with %v\n " , vm .exit )
1634- if vm .exit != exitReturn {
1635- vm .result = nil
1629+ debugf ("EXIT with %v\n " , vm .why )
1630+ if vm .why != whyReturn {
1631+ vm .retval = nil
16361632 }
1637- if vm .result == nil && ! vm .curexc .IsSet () {
1633+ if vm .retval == nil && ! vm .curexc .IsSet () {
16381634 panic ("vm: no result or exception" )
16391635 }
1640- if vm .result != nil && vm .curexc .IsSet () {
1636+ if vm .retval != nil && vm .curexc .IsSet () {
16411637 panic ("vm: result and exception" )
16421638 }
16431639
@@ -1664,9 +1660,9 @@ fast_yield:
16641660 // }
16651661
16661662 if vm .curexc .IsSet () {
1667- return vm .result , vm .curexc
1663+ return vm .retval , vm .curexc
16681664 }
1669- return vm .result , nil
1665+ return vm .retval , nil
16701666}
16711667
16721668// Run the virtual machine on a Code object
0 commit comments