@@ -660,6 +660,8 @@ func do_END_FINALLY(vm *Vm, arg int32) {
660
660
switch vm .exit {
661
661
case exitYield :
662
662
panic ("Unexpected exitYield in END_FINALLY" )
663
+ case exitException :
664
+ panic ("Unexpected exitException in END_FINALLY" )
663
665
case exitReturn , exitContinue :
664
666
vm .result = vm .POP ()
665
667
case exitSilenced :
@@ -689,7 +691,7 @@ func do_END_FINALLY(vm *Vm, arg int32) {
689
691
} else {
690
692
vm .ClearException ()
691
693
}
692
-
694
+ debugf ( "END_FINALLY: vm.exit = %v \n " , vm . exit )
693
695
}
694
696
695
697
// Loads the __build_class__ helper function to the stack which
@@ -1201,7 +1203,7 @@ func do_DELETE_DEREF(vm *Vm, i int32) {
1201
1203
func (vm * Vm ) raise (exc , cause py.Object ) {
1202
1204
if exc == nil {
1203
1205
// raise (with no parameters == re-raise)
1204
- if vm .exc .Value == nil {
1206
+ if ! vm .exc .IsSet () {
1205
1207
vm .SetException (py .ExceptionNewf (py .RuntimeError , "No active exception to reraise" ))
1206
1208
} else {
1207
1209
// Signal the existing exception again
@@ -1211,6 +1213,7 @@ func (vm *Vm) raise(exc, cause py.Object) {
1211
1213
// raise <instance>
1212
1214
// raise <type>
1213
1215
excException := py .MakeException (exc )
1216
+ debugf ("raise: excException = %v\n " , excException )
1214
1217
vm .SetException (excException )
1215
1218
if cause != nil {
1216
1219
excException .Cause = py .MakeException (cause )
@@ -1431,24 +1434,17 @@ func (vm *Vm) UnwindBlock(frame *py.Frame, block *py.TryBlock) {
1431
1434
1432
1435
// Unwinds the stack in the presence of an exception
1433
1436
func (vm * Vm ) UnwindExceptHandler (frame * py.Frame , block * py.TryBlock ) {
1437
+ debugf ("** UnwindExceptHandler stack depth %v\n " , vm .STACK_LEVEL ())
1434
1438
if vm .STACK_LEVEL () < block .Level + 3 {
1435
1439
panic ("Couldn't find traceback on stack" )
1436
1440
} else {
1437
1441
frame .Stack = frame .Stack [:block .Level + 3 ]
1438
1442
}
1439
- // If have just raised an exception, don't overwrite it
1440
- //
1441
- // FIXME if have two exceptions python shows both tracebacks
1442
- //
1443
- // FIXME this is a departure from python's way not sure it is
1444
- // correct
1445
- if vm .exc .Value != nil {
1446
- vm .DROPN (3 )
1447
- } else {
1448
- vm .exc .Type = vm .POP ().(* py.Type )
1449
- vm .exc .Value = vm .POP ()
1450
- vm .exc .Traceback = vm .POP ().(* py.Traceback )
1451
- }
1443
+ debugf ("** UnwindExceptHandler stack depth now %v\n " , vm .STACK_LEVEL ())
1444
+ vm .exc .Type = vm .POP ().(* py.Type )
1445
+ vm .exc .Value = vm .POP ()
1446
+ vm .exc .Traceback = vm .POP ().(* py.Traceback )
1447
+ debugf ("** UnwindExceptHandler exc = (type: %v, value: %v, traceback: %v)\n " , vm .exc .Type , vm .exc .Value , vm .exc .Traceback )
1452
1448
}
1453
1449
1454
1450
// Run the virtual machine on a Frame object
@@ -1534,13 +1530,13 @@ func RunFrame(frame *py.Frame) (res py.Object, err error) {
1534
1530
frame .Lasti = b .Handler
1535
1531
break
1536
1532
}
1537
- if vm .exit & ( exitException | exitReraise ) != 0 && (b .Type == SETUP_EXCEPT || b .Type == SETUP_FINALLY ) {
1533
+ if ( vm .exit == exitException || vm . exit == exitReraise ) && (b .Type == SETUP_EXCEPT || b .Type == SETUP_FINALLY ) {
1538
1534
debugf ("*** Exception\n " )
1539
1535
handler := b .Handler
1540
1536
// This invalidates b
1541
1537
frame .PushBlock (EXCEPT_HANDLER , - 1 , vm .STACK_LEVEL ())
1542
- vm .PUSH (vm .old_exc .Traceback )
1543
- vm .PUSH (vm .old_exc .Value )
1538
+ vm .PUSH (vm .exc .Traceback )
1539
+ vm .PUSH (vm .exc .Value )
1544
1540
vm .PUSH (vm .exc .Type ) // can be nil
1545
1541
// FIXME PyErr_Fetch(&exc, &val, &tb)
1546
1542
exc := vm .exc .Type
@@ -1563,7 +1559,7 @@ func RunFrame(frame *py.Frame) (res py.Object, err error) {
1563
1559
break
1564
1560
}
1565
1561
if b .Type == SETUP_FINALLY {
1566
- if vm .exit & ( exitReturn | exitContinue ) != 0 {
1562
+ if vm .exit == exitReturn || vm . exit == exitContinue {
1567
1563
vm .PUSH (vm .result )
1568
1564
}
1569
1565
vm .PUSH (py .Int (vm .exit ))
@@ -1573,7 +1569,7 @@ func RunFrame(frame *py.Frame) (res py.Object, err error) {
1573
1569
}
1574
1570
}
1575
1571
}
1576
- if vm .exc .Value != nil {
1572
+ if vm .exc .IsSet () {
1577
1573
return vm .result , vm .exc
1578
1574
}
1579
1575
return vm .result , nil
0 commit comments