@@ -564,19 +564,24 @@ static void JimELAssocDataDeleProc(Jim_Interp *interp, void *data)
564564static int JimELVwaitCommand (Jim_Interp * interp , int argc , Jim_Obj * const * argv )
565565{
566566 Jim_EventLoop * eventLoop = Jim_CmdPrivData (interp );
567- Jim_Obj * oldValue ;
567+ Jim_Obj * oldValue = NULL ;
568+ Jim_Obj * scriptObjPtr = NULL ;
568569 int rc ;
569570 int signal = 0 ;
570571
571- if (argc == 3 && Jim_CompareStringImmediate (interp , argv [1 ], "-signal" )) {
572+ if (argc > 2 && Jim_CompareStringImmediate (interp , argv [1 ], "-signal" )) {
572573 signal ++ ;
573574 }
574575
575- if (argc - signal != 2 ) {
576+ if (argc - signal == 3 ) {
577+ scriptObjPtr = argv [2 + signal ];
578+ }
579+ else if (argc - signal != 2 ) {
576580 return JIM_USAGE ;
577581 }
578582
579583 oldValue = Jim_GetGlobalVariable (interp , argv [1 + signal ], JIM_NONE );
584+
580585 if (oldValue ) {
581586 Jim_IncrRefCount (oldValue );
582587 }
@@ -590,6 +595,8 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
590595 eventLoop -> suppress_bgerror = 0 ;
591596
592597 while ((rc = Jim_ProcessEvents (interp , JIM_ALL_EVENTS )) >= 0 ) {
598+ Jim_Obj * currValue ;
599+
593600 if (signal && interp -> sigmask ) {
594601 /* vwait -signal and handled signals were received, so transfer them
595602 * to ignored signals so that 'signal check -clear' will return them.
@@ -602,7 +609,7 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
602609 interp -> sigmask = 0 ;
603610 break ;
604611 }
605- Jim_Obj * currValue ;
612+
606613 currValue = Jim_GetGlobalVariable (interp , argv [1 + signal ], JIM_NONE );
607614 /* Stop the loop if the vwait-ed variable changed value,
608615 * or if was unset and now is set (or the contrary)
@@ -614,6 +621,16 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
614621 Jim_CheckSignal (interp )) {
615622 break ;
616623 }
624+ if (scriptObjPtr ) {
625+ /* Stop the loop if a provided script returns BREAK or ERR */
626+ int retval = Jim_EvalObj (interp , scriptObjPtr );
627+ if (retval == JIM_ERR || retval == JIM_BREAK ) {
628+ if (retval == JIM_ERR ) {
629+ rc = -2 ;
630+ }
631+ break ;
632+ }
633+ }
617634 }
618635 if (oldValue )
619636 Jim_DecrRefCount (interp , oldValue );
@@ -785,7 +802,7 @@ int Jim_eventloopInit(Jim_Interp *interp)
785802
786803 Jim_SetAssocData (interp , "eventloop" , JimELAssocDataDeleProc , eventLoop );
787804
788- Jim_RegisterCmd (interp , "vwait" , "?-signal? name" , 1 , 2 , JimELVwaitCommand , NULL , eventLoop , 0 );
805+ Jim_RegisterCmd (interp , "vwait" , "?-signal? name ?script? " , 1 , 3 , JimELVwaitCommand , NULL , eventLoop , 0 );
789806 Jim_RegisterCmd (interp , "update" , "?idletasks?" , 0 , 1 , JimELUpdateCommand , NULL , eventLoop , 0 );
790807 Jim_RegisterCmd (interp , "after" , "option ?arg ...?" , 1 , -1 , JimELAfterCommand , NULL , eventLoop , 0 );
791808
0 commit comments