@@ -256,6 +256,9 @@ static int ChildInvokeHidden(Tcl_Interp *interp,
256256static int ChildMarkTrusted (Tcl_Interp * interp ,
257257 Tcl_Interp * childInterp );
258258static Tcl_CmdDeleteProc ChildObjCmdDeleteProc ;
259+ static int ChildSet (Tcl_Interp * interp ,
260+ Tcl_Interp * childInterp , Tcl_Obj * varNameObj ,
261+ Tcl_Obj * valueObj );
259262static int ChildRecursionLimit (Tcl_Interp * interp ,
260263 Tcl_Interp * childInterp , Tcl_Size objc ,
261264 Tcl_Obj * const objv []);
@@ -635,7 +638,7 @@ NRInterpCmd(
635638 "eval" , "exists" , "expose" , "hide" ,
636639 "hidden" , "issafe" , "invokehidden" ,
637640 "limit" , "marktrusted" , "recursionlimit" ,
638- "share" ,
641+ "set" , " share" ,
639642#ifndef TCL_NO_DEPRECATED
640643 "slaves" ,
641644#endif
@@ -647,15 +650,16 @@ NRInterpCmd(
647650 "eval" , "exists" , "expose" ,
648651 "hide" , "hidden" , "issafe" ,
649652 "invokehidden" , "limit" , "marktrusted" , "recursionlimit" ,
650- "share" , "target" , "transfer" ,
653+ "set" , " share" , "target" , "transfer" ,
651654 NULL
652655 };
653656 enum interpOptionEnum {
654657 OPT_ALIAS , OPT_ALIASES , OPT_BGERROR , OPT_CANCEL ,
655658 OPT_CHILDREN , OPT_CREATE , OPT_DEBUG , OPT_DELETE ,
656659 OPT_EVAL , OPT_EXISTS , OPT_EXPOSE , OPT_HIDE ,
657660 OPT_HIDDEN , OPT_ISSAFE , OPT_INVOKEHID ,
658- OPT_LIMIT , OPT_MARKTRUSTED , OPT_RECLIMIT , OPT_SHARE ,
661+ OPT_LIMIT , OPT_MARKTRUSTED , OPT_RECLIMIT , OPT_SET ,
662+ OPT_SHARE ,
659663#ifndef TCL_NO_DEPRECATED
660664 OPT_SLAVES ,
661665#endif
@@ -903,6 +907,17 @@ NRInterpCmd(
903907 return TCL_ERROR ;
904908 }
905909 return ChildEval (interp , childInterp , objc - 3 , objv + 3 );
910+ case OPT_SET :
911+ if (objc < 4 || objc > 5 ) {
912+ Tcl_WrongNumArgs (interp , 2 , objv , "path varName ?value?" );
913+ return TCL_ERROR ;
914+ }
915+ childInterp = GetInterp (interp , objv [2 ]);
916+ if (childInterp == NULL ) {
917+ return TCL_ERROR ;
918+ }
919+ return ChildSet (interp , childInterp , objv [3 ],
920+ objc > 4 ? objv [4 ] : NULL );
906921 case OPT_EXISTS : {
907922 int exists = 1 ;
908923
@@ -2521,13 +2536,13 @@ NRChildCmd(
25212536 "alias" , "aliases" , "bgerror" , "debug" ,
25222537 "eval" , "expose" , "hide" , "hidden" ,
25232538 "issafe" , "invokehidden" , "limit" , "marktrusted" ,
2524- "recursionlimit" , NULL
2539+ "recursionlimit" , "set" , NULL
25252540 };
25262541 enum childCmdOptionsEnum {
25272542 OPT_ALIAS , OPT_ALIASES , OPT_BGERROR , OPT_DEBUG ,
25282543 OPT_EVAL , OPT_EXPOSE , OPT_HIDE , OPT_HIDDEN ,
25292544 OPT_ISSAFE , OPT_INVOKEHIDDEN , OPT_LIMIT , OPT_MARKTRUSTED ,
2530- OPT_RECLIMIT
2545+ OPT_RECLIMIT , OPT_SET
25312546 } index ;
25322547
25332548 if (childInterp == NULL ) {
@@ -2689,6 +2704,12 @@ NRChildCmd(
26892704 return TCL_ERROR ;
26902705 }
26912706 return ChildRecursionLimit (interp , childInterp , objc - 2 , objv + 2 );
2707+ case OPT_SET :
2708+ if (objc < 3 || objc > 4 ) {
2709+ Tcl_WrongNumArgs (interp , 2 , objv , "varName ?value?" );
2710+ return TCL_ERROR ;
2711+ }
2712+ return ChildSet (interp , childInterp , objv [2 ], objc > 3 ? objv [3 ] : NULL );
26922713 default :
26932714 TCL_UNREACHABLE ();
26942715 }
@@ -2878,6 +2899,51 @@ ChildEval(
28782899 return result ;
28792900}
28802901
2902+ /*
2903+ *----------------------------------------------------------------------
2904+ *
2905+ * ChildSet --
2906+ *
2907+ * Helper function to read and write a variable in a child interpreter.
2908+ *
2909+ * Results:
2910+ * A standard Tcl result.
2911+ *
2912+ * Side effects:
2913+ * Depends on whether the variable has traces. If so, this can have
2914+ * extensive arbitrary side effects.
2915+ *
2916+ *----------------------------------------------------------------------
2917+ */
2918+ static int
2919+ ChildSet (
2920+ Tcl_Interp * interp ,
2921+ Tcl_Interp * childInterp ,
2922+ Tcl_Obj * varNameObj ,
2923+ Tcl_Obj * valueObj )
2924+ {
2925+ int result = TCL_ERROR ;
2926+ Tcl_Obj * resultObj ;
2927+ Tcl_Preserve (childInterp );
2928+
2929+ // Modelled after the guts of Tcl_SetObjCmd().
2930+ if (valueObj ) {
2931+ resultObj = Tcl_ObjSetVar2 (childInterp , varNameObj , NULL , valueObj ,
2932+ TCL_LEAVE_ERR_MSG );
2933+ } else {
2934+ resultObj = Tcl_ObjGetVar2 (childInterp , varNameObj , NULL ,
2935+ TCL_LEAVE_ERR_MSG );
2936+ }
2937+ if (resultObj ) {
2938+ Tcl_SetObjResult (childInterp , resultObj );
2939+ result = TCL_OK ;
2940+ }
2941+
2942+ Tcl_TransferResult (childInterp , result , interp );
2943+ Tcl_Release (childInterp );
2944+ return result ;
2945+ }
2946+
28812947/*
28822948 *----------------------------------------------------------------------
28832949 *
0 commit comments