# HG changeset patch # User Petter T. # Date 1712177447 -7200 # Wed Apr 03 22:50:47 2024 +0200 # Branch bytecode-interpreter # Node ID 864fd93a2cdbcb266ff5e08431d238e69d3487c8 # Parent 0b4118c91dc994306cf8b1b9eb56b3f631ccc809 Catch debug exit exceptions in nested bytecode contexts (bug #65547) When debugging is aborted, and there are nested bytecode interpreters, the exit debug exception would not be handled properly. Also, add some missed handling of exit exceptions. * pt-bytecode-vm-internal.h: Add CATCH_DEBUG_EXCEPTION macro def. Wrap tries with the macro. Add missing CATCH_EXIT_EXCEPTION. * pt-bytecode-vm.cc: Wrap tries with the CATCH_DEBUG_EXCEPTION macro diff -r 0b4118c91dc9 -r 864fd93a2cdb libinterp/parse-tree/pt-bytecode-vm-internal.h --- a/libinterp/parse-tree/pt-bytecode-vm-internal.h Wed Apr 03 12:30:26 2024 -0400 +++ b/libinterp/parse-tree/pt-bytecode-vm-internal.h Wed Apr 03 22:50:47 2024 +0200 @@ -95,6 +95,8 @@ CATCH_INDEX_EXCEPTION \ CATCH_EXECUTION_EXCEPTION \ CATCH_BAD_ALLOC \ + CATCH_EXIT_EXCEPTION \ + CATCH_DEBUG_EXCEPTION \ } \ #define MAKE_BINOP_SPECIALIZED(op_fn,jmp_target,op_target,target_type) \ @@ -121,6 +123,8 @@ CATCH_INDEX_EXCEPTION \ CATCH_EXECUTION_EXCEPTION \ CATCH_BAD_ALLOC \ + CATCH_EXIT_EXCEPTION \ + CATCH_DEBUG_EXCEPTION \ } \ #define MAKE_BINOP_CST_SPECIALIZED(op_fn,jmp_target,op_target,target_type) \ @@ -149,6 +153,8 @@ CATCH_INDEX_EXCEPTION \ CATCH_EXECUTION_EXCEPTION \ CATCH_BAD_ALLOC \ + CATCH_EXIT_EXCEPTION \ + CATCH_DEBUG_EXCEPTION \ } \ #define MAKE_UNOP_SPECIALIZED(op_fn, jmp_target, op_target, target_type) \ @@ -170,6 +176,8 @@ CATCH_INDEX_EXCEPTION \ CATCH_EXECUTION_EXCEPTION \ CATCH_BAD_ALLOC \ + CATCH_EXIT_EXCEPTION \ + CATCH_DEBUG_EXCEPTION \ } \ #define MAKE_BINOP_SELFMODIFYING(op, jmp_target, op_target) \ @@ -198,6 +206,8 @@ CATCH_INDEX_EXCEPTION \ CATCH_EXECUTION_EXCEPTION \ CATCH_BAD_ALLOC \ + CATCH_EXIT_EXCEPTION \ + CATCH_DEBUG_EXCEPTION \ } #define MAKE_BINOP_CST_SELFMODIFYING(op, jmp_target, op_target) \ @@ -231,6 +241,8 @@ CATCH_INDEX_EXCEPTION \ CATCH_EXECUTION_EXCEPTION \ CATCH_BAD_ALLOC \ + CATCH_EXIT_EXCEPTION \ + CATCH_DEBUG_EXCEPTION \ } #define CATCH_INDEX_EXCEPTION \ @@ -314,6 +326,14 @@ goto unwind; \ } +#define CATCH_DEBUG_EXCEPTION \ +catch (const quit_debug_exception &qde) \ +{ \ + (*sp++).i = qde.all (); \ + (*sp++).i = static_cast(error_type::DEBUG_QUIT); \ + goto unwind; \ +} + #define MAKE_BYTECODE_CALL \ if (sp + stack_min_for_new_call >= m_stack + stack_size) \ { \ diff -r 0b4118c91dc9 -r 864fd93a2cdb libinterp/parse-tree/pt-bytecode-vm.cc --- a/libinterp/parse-tree/pt-bytecode-vm.cc Wed Apr 03 12:30:26 2024 -0400 +++ b/libinterp/parse-tree/pt-bytecode-vm.cc Wed Apr 03 22:50:47 2024 +0200 @@ -1713,6 +1713,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } else { @@ -1791,6 +1792,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } else { @@ -1949,6 +1951,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } else @@ -1974,6 +1977,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } @@ -2123,6 +2127,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } else @@ -2215,6 +2220,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH(); @@ -2279,6 +2285,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH(); @@ -2553,6 +2560,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION ov = octave_value (); @@ -2626,6 +2634,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } break; @@ -2729,6 +2738,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH_1BYTEOP(); uadd: @@ -2750,6 +2760,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH_1BYTEOP(); @@ -2782,6 +2793,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH_1BYTEOP(); trans: @@ -2804,6 +2816,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH_1BYTEOP(); herm: @@ -2826,6 +2839,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH_1BYTEOP(); @@ -2885,6 +2899,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH(); @@ -2942,6 +2957,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH(); incr_id_postfix_dbl: @@ -2998,6 +3014,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH(); decr_id_postfix_dbl: @@ -3054,6 +3071,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH(); for_setup: @@ -3160,6 +3178,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION // Increase counter TOP ().i++; // Wraps to zero first iteration @@ -3314,6 +3333,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION STACK_DESTROY (1); @@ -3530,6 +3550,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION STACK_DESTROY (3); } @@ -3593,6 +3614,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION STACK_DESTROY (2); } @@ -3684,6 +3706,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION // Destroy the args on the operand stack aswell as rhs STACK_DESTROY (nargs + 1); @@ -3726,6 +3749,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } else end_idx = octave_value (ov.end_index (idx, nargs)); @@ -3768,6 +3792,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } else end_idx = octave_value (ov.end_index (idx, nargs)); @@ -3841,6 +3866,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } else @@ -3878,6 +3904,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION EXPAND_CSLIST_PUSH_N_OVL_ELEMENTS_TO_STACK (retval, nargout); } @@ -4104,6 +4131,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH (); matrix_big: @@ -4151,6 +4179,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } else { @@ -4181,6 +4210,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } DISPATCH (); @@ -4290,6 +4320,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } @@ -4313,6 +4344,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH_1BYTEOP (); push_cst_dbl_0: @@ -4610,6 +4642,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION bool is_fcn = (retval.length () ? retval(0).is_function() : false); @@ -4647,6 +4680,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } idx.clear (); @@ -4719,6 +4753,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } @@ -5146,6 +5181,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } DISPATCH (); @@ -5517,6 +5553,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION STACK_DESTROY (1); } @@ -5792,6 +5829,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } @@ -5847,6 +5885,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION STACK_DESTROY (1); EXPAND_CSLIST_PUSH_N_OVL_ELEMENTS_TO_STACK (retval, nargout); @@ -5894,6 +5933,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION STACK_DESTROY (1); } @@ -5947,6 +5987,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION // Destroy the args on the operand stack aswell as rhs STACK_DESTROY (nargs + 1); @@ -5996,6 +6037,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION // We want lhs on the top of the stack after dropping all // the args to SUBASSIGN_OBJ, so we move it to where rhs is @@ -6050,6 +6092,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION bool is_fcn = (retval.length () ? retval(0).is_function() : false); @@ -6087,6 +6130,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } idx.clear (); @@ -6180,6 +6224,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } @@ -6351,6 +6396,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH (); @@ -6758,12 +6804,8 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION - catch (const quit_debug_exception &qde) - { - (*sp++).i = qde.all (); - (*sp++).i = static_cast(error_type::DEBUG_QUIT); - goto unwind; - } + CATCH_DEBUG_EXCEPTION + } } } @@ -6824,6 +6866,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } DISPATCH (); @@ -7074,6 +7117,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION ov = octave_value (); STACK_DESTROY (1); // Destroy the object being indexed @@ -7190,6 +7234,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } break; @@ -7272,6 +7317,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION // TODO: Kludge for e.g. "m = containsers.Map;" which returns a function. // Should preferably be done by subsref()/call()? @@ -7356,6 +7402,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } } break; @@ -7368,6 +7415,7 @@ CATCH_EXECUTION_EXCEPTION CATCH_BAD_ALLOC CATCH_EXIT_EXCEPTION + CATCH_DEBUG_EXCEPTION } DISPATCH (); }