public TCL.CompletionCode cmdProc( Interp interp, TclObject[] argv ) { targetInterp.preserve(); targetInterp.nestLevel++; targetInterp.resetResult(); targetInterp.allowExceptions(); // Append the arguments to the command prefix and invoke the command // in the target interp's global namespace. TclObject[] prefv = TclList.getElements( interp, prefix ); TclObject cmd = TclList.newInstance(); cmd.preserve(); TclList.replace( interp, cmd, 0, 0, prefv, 0, prefv.Length - 1 ); TclList.replace( interp, cmd, prefv.Length, 0, argv, 1, argv.Length - 1 ); TclObject[] cmdv = TclList.getElements( interp, cmd ); TCL.CompletionCode result = targetInterp.invoke( cmdv, Interp.INVOKE_NO_TRACEBACK ); cmd.release(); targetInterp.nestLevel--; // Check if we are at the bottom of the stack for the target interpreter. // If so, check for special return codes. if ( targetInterp.nestLevel == 0 ) { if ( result == TCL.CompletionCode.RETURN ) { result = targetInterp.updateReturnInfo(); } if ( result != TCL.CompletionCode.OK && result != TCL.CompletionCode.ERROR ) { try { targetInterp.processUnexpectedResult( result ); } catch ( TclException e ) { result = e.getCompletionCode(); } } } targetInterp.release(); interp.transferResult( targetInterp, result ); return TCL.CompletionCode.RETURN; }
internal static void hide( Interp interp, Interp slaveInterp, int objIx, TclObject[] objv ) { if ( interp.isSafe ) { throw new TclException( interp, "permission denied: " + "safe interpreter cannot hide commands" ); } int nameIdx = objv.Length - objIx == 1 ? objIx : objIx + 1; try { slaveInterp.hideCommand( objv[objIx].ToString(), objv[nameIdx].ToString() ); } catch ( TclException e ) { interp.transferResult( slaveInterp, e.getCompletionCode() ); throw; } }
internal static void invokeHidden( Interp interp, Interp slaveInterp, bool global, int objIx, TclObject[] objv ) { TCL.CompletionCode result; if ( interp.isSafe ) { throw new TclException( interp, "not allowed to " + "invoke hidden commands from safe interpreter" ); } slaveInterp.preserve(); slaveInterp.allowExceptions(); TclObject[] localObjv = new TclObject[objv.Length - objIx]; for ( int i = 0; i < objv.Length - objIx; i++ ) { localObjv[i] = objv[i + objIx]; } try { if ( global ) { slaveInterp.invokeGlobal( localObjv, Interp.INVOKE_HIDDEN ); } else { slaveInterp.invoke( localObjv, Interp.INVOKE_HIDDEN ); } result = slaveInterp.returnCode; } catch ( TclException e ) { result = e.getCompletionCode(); } slaveInterp.release(); interp.transferResult( slaveInterp, result ); }
internal static void eval( Interp interp, Interp slaveInterp, int objIx, TclObject[] objv ) { TCL.CompletionCode result; slaveInterp.preserve(); slaveInterp.allowExceptions(); try { if ( objIx + 1 == objv.Length ) { slaveInterp.eval( objv[objIx], 0 ); } else { TclObject obj = TclList.newInstance(); for ( int ix = objIx; ix < objv.Length; ix++ ) { TclList.append( interp, obj, objv[ix] ); } obj.preserve(); slaveInterp.eval( obj, 0 ); obj.release(); } result = slaveInterp.returnCode; } catch ( TclException e ) { result = e.getCompletionCode(); } slaveInterp.release(); interp.transferResult( slaveInterp, result ); }