public static void evalObjv( Interp interp, TclObject[] objv, int length, int flags ) { Command cmd; WrappedCommand wCmd = null; TclObject[] newObjv; int i; CallFrame savedVarFrame; //Saves old copy of interp.varFrame // in case TCL.EVAL_GLOBAL was set. interp.resetResult(); if ( objv.Length == 0 ) { return; } // If the interpreter was deleted, return an error. if ( interp.deleted ) { interp.setResult( "attempt to call eval in deleted interpreter" ); interp.setErrorCode( TclString.newInstance( "CORE IDELETE {attempt to call eval in deleted interpreter}" ) ); throw new TclException( TCL.CompletionCode.ERROR ); } // Check depth of nested calls to eval: if this gets too large, // it's probably because of an infinite loop somewhere. if ( interp.nestLevel >= interp.maxNestingDepth ) { throw new TclException( interp, "too many nested calls to eval (infinite loop?)" ); } interp.nestLevel++; try { // Find the procedure to execute this command. If there isn't one, // then see if there is a command "unknown". If so, create a new // word array with "unknown" as the first word and the original // command words as arguments. Then call ourselves recursively // to execute it. cmd = interp.getCommand( objv[0].ToString() ); if ( cmd == null ) wCmd = interp.getObjCommand( objv[0].ToString() ); // See if we are running as a slave interpretor, and this is a windows command if ( cmd == null && wCmd == null && interp.slave != null ) { wCmd = interp.slave.masterInterp.getObjCommand( objv[0].ToString() ); } if ( cmd == null && wCmd == null ) { newObjv = new TclObject[objv.Length + 1]; for ( i = ( objv.Length - 1 ); i >= 0; i-- ) { newObjv[i + 1] = objv[i]; } newObjv[0] = TclString.newInstance( "unknown" ); newObjv[0].preserve(); cmd = interp.getCommand( "unknown" ); if ( cmd == null ) { Debug.Assert( false, "invalid command name \"" + objv[0].ToString() + "\"" ); throw new TclException( interp, "invalid command name \"" + objv[0].ToString() + "\"" ); } else { evalObjv( interp, newObjv, length, 0 ); } newObjv[0].release(); return; } // Finally, invoke the Command's cmdProc. interp.cmdCount++; savedVarFrame = interp.varFrame; if ( ( flags & TCL.EVAL_GLOBAL ) != 0 ) { interp.varFrame = null; } int rc = 0; if ( cmd != null ) { if ( cmd.cmdProc( interp, objv ) == TCL.CompletionCode.EXIT ) throw new TclException( TCL.CompletionCode.EXIT ); } else { rc = wCmd.objProc( wCmd.objClientData, interp, objv.Length, objv ); if ( rc != 0 ) { if ( rc == TCL.TCL_RETURN ) throw new TclException( TCL.CompletionCode.RETURN ); throw new TclException( TCL.CompletionCode.ERROR ); } } interp.varFrame = savedVarFrame; } finally { interp.nestLevel--; } }
public TCL.CompletionCode cmdProc(Interp interp, TclObject[] objv) { if (objv.Length < 2) { throw new TclNumArgsException(interp, 1, objv, "cmd ?arg ...?"); } int cmd = TclIndex.get(interp, objv[1], options, "option", 0); switch (cmd) { case OPT_ALIAS: { if (objv.Length >= 4) { Interp slaveInterp = getInterp(interp, objv[2]); if (objv.Length == 4) { InterpAliasCmd.describe(interp, slaveInterp, objv[3]); return TCL.CompletionCode.RETURN; } if ((objv.Length == 5) && ("".Equals(objv[4].ToString()))) { InterpAliasCmd.delete(interp, slaveInterp, objv[3]); return TCL.CompletionCode.RETURN; } if (objv.Length > 5) { Interp masterInterp = getInterp(interp, objv[4]); if ("".Equals(objv[5].ToString())) { if (objv.Length == 6) { InterpAliasCmd.delete(interp, slaveInterp, objv[3]); return TCL.CompletionCode.RETURN; } } else { InterpAliasCmd.create(interp, slaveInterp, masterInterp, objv[3], objv[5], 6, objv); return TCL.CompletionCode.RETURN; } } } throw new TclNumArgsException(interp, 2, objv, "slavePath slaveCmd ?masterPath masterCmd? ?args ..?"); } case OPT_ALIASES: { Interp slaveInterp = getInterp(interp, objv); InterpAliasCmd.list(interp, slaveInterp); break; } case OPT_CREATE: { // Weird historical rules: "-safe" is accepted at the end, too. bool safe = interp.isSafe; TclObject slaveNameObj = null; bool last = false; for (int i = 2; i < objv.Length; i++) { if ((!last) && (objv[i].ToString()[0] == '-')) { int index = TclIndex.get(interp, objv[i], createOptions, "option", 0); if (index == OPT_CREATE_SAFE) { safe = true; continue; } i++; last = true; } if (slaveNameObj != null) { throw new TclNumArgsException(interp, 2, objv, "?-safe? ?--? ?path?"); } slaveNameObj = objv[i]; } if (slaveNameObj == null) { // Create an anonymous interpreter -- we choose its name and // the name of the command. We check that the command name // that we use for the interpreter does not collide with an // existing command in the master interpreter. int i = 0; while (interp.getCommand("interp" + i) != null) { i++; } slaveNameObj = TclString.newInstance("interp" + i); } InterpSlaveCmd.create(interp, slaveNameObj, safe); interp.setResult(slaveNameObj); break; } case OPT_DELETE: { for (int i = 2; i < objv.Length; i++) { Interp slaveInterp = getInterp(interp, objv[i]); if (slaveInterp == interp) { throw new TclException(interp, "cannot delete the current interpreter"); } InterpSlaveCmd slave = slaveInterp.slave; slave.masterInterp.deleteCommandFromToken(slave.interpCmd); } break; } case OPT_EVAL: { if (objv.Length < 4) { throw new TclNumArgsException(interp, 2, objv, "path arg ?arg ...?"); } Interp slaveInterp = getInterp(interp, objv[2]); InterpSlaveCmd.eval(interp, slaveInterp, 3, objv); break; } case OPT_EXISTS: { bool exists = true; try { getInterp(interp, objv); } catch (TclException e) { if (objv.Length > 3) { throw ; } exists = false; } interp.setResult(exists); break; } case OPT_EXPOSE: { if (objv.Length < 4 || objv.Length > 5) { throw new TclNumArgsException(interp, 2, objv, "path hiddenCmdName ?cmdName?"); } Interp slaveInterp = getInterp(interp, objv[2]); InterpSlaveCmd.expose(interp, slaveInterp, 3, objv); break; } case OPT_HIDE: { if (objv.Length < 4 || objv.Length > 5) { throw new TclNumArgsException(interp, 2, objv, "path cmdName ?hiddenCmdName?"); } Interp slaveInterp = getInterp(interp, objv[2]); InterpSlaveCmd.hide(interp, slaveInterp, 3, objv); break; } case OPT_HIDDEN: { Interp slaveInterp = getInterp(interp, objv); InterpSlaveCmd.hidden(interp, slaveInterp); break; } case OPT_ISSAFE: { Interp slaveInterp = getInterp(interp, objv); interp.setResult(slaveInterp.isSafe); break; } case OPT_INVOKEHIDDEN: { bool global = false; int i; for (i = 3; i < objv.Length; i++) { if (objv[i].ToString()[0] != '-') { break; } int index = TclIndex.get(interp, objv[i], hiddenOptions, "option", 0); if (index == OPT_HIDDEN_GLOBAL) { global = true; } else { i++; break; } } if (objv.Length - i < 1) { throw new TclNumArgsException(interp, 2, objv, "path ?-global? ?--? cmd ?arg ..?"); } Interp slaveInterp = getInterp(interp, objv[2]); InterpSlaveCmd.invokeHidden(interp, slaveInterp, global, i, objv); break; } case OPT_MARKTRUSTED: { if (objv.Length != 3) { throw new TclNumArgsException(interp, 2, objv, "path"); } Interp slaveInterp = getInterp(interp, objv[2]); InterpSlaveCmd.markTrusted(interp, slaveInterp); break; } case OPT_SLAVES: { Interp slaveInterp = getInterp(interp, objv); TclObject result = TclList.newInstance(); interp.setResult(result); IEnumerator keys = slaveInterp.slaveTable.Keys.GetEnumerator(); while (keys.MoveNext()) { string inString = (string) keys.Current; TclList.append(interp, result, TclString.newInstance(inString)); } break; } case OPT_SHARE: { if (objv.Length != 5) { throw new TclNumArgsException(interp, 2, objv, "srcPath channelId destPath"); } Interp masterInterp = getInterp(interp, objv[2]); Channel chan = TclIO.getChannel(masterInterp, objv[3].ToString()); if (chan == null) { throw new TclException(interp, "can not find channel named \"" + objv[3].ToString() + "\""); } Interp slaveInterp = getInterp(interp, objv[4]); TclIO.registerChannel(slaveInterp, chan); break; } case OPT_TARGET: { if (objv.Length != 4) { throw new TclNumArgsException(interp, 2, objv, "path alias"); } Interp slaveInterp = getInterp(interp, objv[2]); string aliasName = objv[3].ToString(); Interp targetInterp = InterpAliasCmd.getTargetInterp(slaveInterp, aliasName); if (targetInterp == null) { throw new TclException(interp, "alias \"" + aliasName + "\" in path \"" + objv[2].ToString() + "\" not found"); } if (!getInterpPath(interp, targetInterp)) { throw new TclException(interp, "target interpreter for alias \"" + aliasName + "\" in path \"" + objv[2].ToString() + "\" is not my descendant"); } break; } case OPT_TRANSFER: { if (objv.Length != 5) { throw new TclNumArgsException(interp, 2, objv, "srcPath channelId destPath"); } Interp masterInterp = getInterp(interp, objv[2]); Channel chan = TclIO.getChannel(masterInterp, objv[3].ToString()); if (chan == null) { throw new TclException(interp, "can not find channel named \"" + objv[3].ToString() + "\""); } Interp slaveInterp = getInterp(interp, objv[4]); TclIO.registerChannel(slaveInterp, chan); TclIO.unregisterChannel(masterInterp, chan); break; } } return TCL.CompletionCode.RETURN; }