@@ -433,6 +433,10 @@ void Trace_Arg(REBINT num, REBVAL *arg, REBVAL *path)
433
433
pvs -> value = pvs -> store ;
434
434
break ;
435
435
case PE_BAD_SELECT :
436
+ if (THROWN (pvs -> select )) {
437
+ pvs -> value = pvs -> select ;
438
+ return ;
439
+ }
436
440
Trap2 (RE_INVALID_PATH , pvs -> orig , pvs -> path );
437
441
case PE_BAD_SET :
438
442
Trap2 (RE_BAD_PATH_SET , pvs -> orig , pvs -> path );
@@ -491,15 +495,19 @@ void Trace_Arg(REBINT num, REBVAL *arg, REBVAL *path)
491
495
Next_Path (& pvs );
492
496
// Check for errors:
493
497
if (NOT_END (pvs .path + 1 ) && !ANY_FUNC (pvs .value )) {
498
+ if (THROWN (pvs .value )) goto thrown ;
494
499
// Only function refinements should get by this line:
495
500
Trap2 (RE_INVALID_PATH , pvs .orig , pvs .path );
496
501
}
497
502
}
498
- else if (NOT_END (pvs .path + 1 ) && !ANY_FUNC (pvs .value ))
503
+ else if (NOT_END (pvs .path + 1 ) && !ANY_FUNC (pvs .value )) {
504
+ if (THROWN (pvs .value )) goto thrown ;
499
505
Trap2 (RE_BAD_PATH_TYPE , pvs .orig , Of_Type (pvs .value ));
506
+ }
500
507
501
508
// If SET then we can drop result storage created above.
502
509
if (val ) {
510
+ if (THROWN (pvs .value )) goto thrown ;
503
511
DS_DROP ; // on SET, we do not care about returned value
504
512
return 0 ;
505
513
} else {
@@ -511,6 +519,10 @@ void Trace_Arg(REBINT num, REBVAL *arg, REBVAL *path)
511
519
* path_val = pvs .path ; // return new path (for func refinements)
512
520
return pvs .value ; // only used for functions
513
521
}
522
+ thrown :
523
+ if (val ) DS_DROP ;
524
+ * DS_TOP = * pvs .value ;
525
+ return 0 ;
514
526
}
515
527
516
528
0 commit comments