Esempio n. 1
0
    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--;
      }
    }
Esempio n. 2
0
		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;
      }