@@ -3160,8 +3160,6 @@ ChildInvokeHidden(
31603160 Tcl_Size objc , /* Number of arguments. */
31613161 Tcl_Obj * const objv []) /* Argument objects. */
31623162{
3163- int result ;
3164-
31653163 if (Tcl_IsSafe (interp )) {
31663164 Tcl_SetObjResult (interp , Tcl_NewStringObj (
31673165 "not allowed to invoke hidden commands from safe interpreter" ,
@@ -3170,33 +3168,35 @@ ChildInvokeHidden(
31703168 (char * )NULL );
31713169 return TCL_ERROR ;
31723170 }
3171+ if (objc < 1 ) {
3172+ Tcl_Panic ("need at least one word: hidden command name" );
3173+ }
31733174
31743175 Tcl_Preserve (childInterp );
31753176 Tcl_AllowExceptions (childInterp );
31763177
3177- if (namespaceName == NULL ) {
3178- NRE_callback * rootPtr = TOP_CB (childInterp );
3179-
3180- Tcl_NRAddCallback (interp , NRPostInvokeHidden , childInterp ,
3181- rootPtr , NULL , NULL );
3182- return TclNRInvoke (NULL , childInterp , objc , objv );
3183- } else {
3178+ // Push the namespace if one has been requested.
3179+ Tcl_CallFrame * framePtr = NULL ;
3180+ if (namespaceName != NULL ) {
31843181 Namespace * nsPtr , * dummy1 , * dummy2 ;
31853182 const char * tail ;
31863183
3187- result = TclGetNamespaceForQualName (childInterp , namespaceName , NULL ,
3184+ int result = TclGetNamespaceForQualName (childInterp , namespaceName , NULL ,
31883185 TCL_FIND_ONLY_NS | TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG
31893186 | TCL_CREATE_NS_IF_UNKNOWN , & nsPtr , & dummy1 , & dummy2 , & tail );
3190- if (result == TCL_OK ) {
3191- result = TclObjInvokeNamespace (childInterp , objc , objv ,
3192- (Tcl_Namespace * ) nsPtr , TCL_INVOKE_HIDDEN );
3187+ if (result != TCL_OK ) {
3188+ Tcl_TransferResult (childInterp , result , interp );
3189+ Tcl_Release (childInterp );
3190+ return result ;
31933191 }
3194- }
31953192
3196- Tcl_TransferResult (childInterp , result , interp );
3193+ (void ) TclPushStackFrame (childInterp , & framePtr , (Tcl_Namespace * ) nsPtr ,
3194+ /*isProcFrame*/ 0 );
3195+ }
31973196
3198- Tcl_Release (childInterp );
3199- return result ;
3197+ Tcl_NRAddCallback (interp , NRPostInvokeHidden , childInterp ,
3198+ TOP_CB (childInterp ), framePtr , NULL );
3199+ return TclNRInvoke (NULL , childInterp , objc , objv );
32003200}
32013201
32023202static int
@@ -3207,11 +3207,15 @@ NRPostInvokeHidden(
32073207{
32083208 Tcl_Interp * childInterp = (Tcl_Interp * ) data [0 ];
32093209 NRE_callback * rootPtr = (NRE_callback * ) data [1 ];
3210+ CallFrame * framePtr = (CallFrame * ) data [2 ];
32103211
32113212 if (interp != childInterp ) {
32123213 result = TclNRRunCallbacks (childInterp , result , rootPtr );
32133214 Tcl_TransferResult (childInterp , result , interp );
32143215 }
3216+ if (framePtr ) {
3217+ TclPopStackFrame (childInterp );
3218+ }
32153219 Tcl_Release (childInterp );
32163220 return result ;
32173221}
0 commit comments