@@ -886,41 +886,46 @@ enum {
886
886
/*
887
887
***********************************************************************/
888
888
{
889
- REBFLG with = D_REF (2 );
889
+ REBFLG with = D_REF (ARG_TRY_WITH );
890
890
REBVAL handler ;
891
- REBVAL * last_error = Get_System (SYS_STATE , STATE_LAST_ERROR );
892
- SET_NONE (last_error );
891
+ REBVAL * error = Get_System (SYS_STATE , STATE_LAST_ERROR );
892
+ SET_NONE (error ); // reset the last error
893
+
893
894
894
895
// If not used the new /with refine, try to use the deprecated /except
895
896
if (with ) {
896
- handler = * D_ARG (3 );
897
+ handler = * D_ARG (ARG_TRY_HANDLER );
897
898
} else {
898
- with = D_REF (4 );
899
- handler = * D_ARG (5 );
899
+ with = D_REF (ARG_TRY_EXCEPT );
900
+ handler = * D_ARG (ARG_TRY_CODE );
900
901
}
901
902
// TRY exception will trim the stack
902
- if (Try_Block (VAL_SERIES (D_ARG (1 )), VAL_INDEX (D_ARG (1 )))) {
903
+ if (Try_Block (VAL_SERIES (D_ARG (ARG_TRY_BLOCK )), VAL_INDEX (D_ARG (ARG_TRY_BLOCK )))) {
903
904
// save the error as a system/state/last-error value
904
- * last_error = * DS_NEXT ;
905
+ on_error :
906
+ * error = * DS_NEXT ;
905
907
906
908
if (with ) {
907
909
if (IS_BLOCK (& handler )) {
908
910
DO_BLK (& handler );
909
911
}
910
912
else { // do func[err] error
911
- REBVAL error = * DS_NEXT ; // will get overwritten
912
913
REBVAL * args = BLK_SKIP (VAL_FUNC_ARGS (& handler ), 1 );
913
- if (NOT_END (args ) && !TYPE_CHECK (args , VAL_TYPE (& error ))) {
914
+ if (NOT_END (args ) && !TYPE_CHECK (args , VAL_TYPE (error ))) {
914
915
// TODO: This results in an error message such as "action!
915
916
// does not allow error! for its value1 argument". A better
916
917
// message would be more like "except handler does not
917
918
// allow error! for its value1 argument."
918
- Trap3 (RE_EXPECT_ARG , Of_Type (& handler ), args , Of_Type (& error ));
919
+ Trap3 (RE_EXPECT_ARG , Of_Type (& handler ), args , Of_Type (error ));
919
920
}
920
- Apply_Func (0 , & handler , & error , 0 );
921
+ Apply_Func (0 , & handler , error , 0 );
921
922
}
922
923
}
923
924
}
925
+ else if (D_REF (ARG_TRY_ALL ) && THROWN (DS_NEXT )) {
926
+ Disarm_Throw_Error (DS_NEXT );
927
+ goto on_error ;
928
+ }
924
929
925
930
return R_TOS1 ;
926
931
}
0 commit comments