⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tclproc.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 3 页
字号:
	}	if (framePtr == NULL) {	    goto levelError;	}    }    *framePtrPtr = framePtr;    return result;}/* *---------------------------------------------------------------------- * * Tcl_UplevelObjCmd -- * *	This object procedure is invoked to process the "uplevel" Tcl *	command. See the user documentation for details on what it does. * * Results: *	A standard Tcl object result value. * * Side effects: *	See the user documentation. * *---------------------------------------------------------------------- */	/* ARGSUSED */intTcl_UplevelObjCmd(dummy, interp, objc, objv)    ClientData dummy;		/* Not used. */    Tcl_Interp *interp;		/* Current interpreter. */    int objc;			/* Number of arguments. */    Tcl_Obj *CONST objv[];	/* Argument objects. */{    register Interp *iPtr = (Interp *) interp;    char *optLevel;    int length, result;    CallFrame *savedVarFramePtr, *framePtr;    if (objc < 2) {	uplevelSyntax:	Tcl_WrongNumArgs(interp, 1, objv, "?level? command ?arg ...?");	return TCL_ERROR;    }    /*     * Find the level to use for executing the command.     * THIS FAILS IF THE OBJECT RESULT'S STRING REP CONTAINS A NULL.     */    optLevel = Tcl_GetStringFromObj(objv[1], &length);    result = TclGetFrame(interp, optLevel, &framePtr);    if (result == -1) {	return TCL_ERROR;    }    objc -= (result+1);    if (objc == 0) {	goto uplevelSyntax;    }    objv += (result+1);    /*     * Modify the interpreter state to execute in the given frame.     */    savedVarFramePtr = iPtr->varFramePtr;    iPtr->varFramePtr = framePtr;    /*     * Execute the residual arguments as a command.     */    if (objc == 1) {	result = Tcl_EvalObj(interp, objv[0]);    } else {	Tcl_Obj *cmdObjPtr = Tcl_ConcatObj(objc, objv);	result = Tcl_EvalObj(interp, cmdObjPtr);	Tcl_DecrRefCount(cmdObjPtr); /* done with object */    }    if (result == TCL_ERROR) {	char msg[60];	sprintf(msg, "\n    (\"uplevel\" body line %d)", interp->errorLine);	Tcl_AddObjErrorInfo(interp, msg, -1);    }    /*     * Restore the variable frame, and return.     */    iPtr->varFramePtr = savedVarFramePtr;    return result;}/* *---------------------------------------------------------------------- * * TclFindProc -- * *	Given the name of a procedure, return a pointer to the *	record describing the procedure. * * Results: *	NULL is returned if the name doesn't correspond to any *	procedure.  Otherwise the return value is a pointer to *	the procedure's record. * * Side effects: *	None. * *---------------------------------------------------------------------- */Proc *TclFindProc(iPtr, procName)    Interp *iPtr;		/* Interpreter in which to look. */    char *procName;		/* Name of desired procedure. */{    Tcl_Command cmd;    Tcl_Command origCmd;    Command *cmdPtr;        cmd = Tcl_FindCommand((Tcl_Interp *) iPtr, procName,            (Tcl_Namespace *) NULL, /*flags*/ 0);    if (cmd == (Tcl_Command) NULL) {        return NULL;    }    cmdPtr = (Command *) cmd;    origCmd = TclGetOriginalCommand(cmd);    if (origCmd != NULL) {	cmdPtr = (Command *) origCmd;    }    if (cmdPtr->proc != TclProcInterpProc) {	return NULL;    }    return (Proc *) cmdPtr->clientData;}/* *---------------------------------------------------------------------- * * TclIsProc -- * *	Tells whether a command is a Tcl procedure or not. * * Results: *	If the given command is actually a Tcl procedure, the *	return value is the address of the record describing *	the procedure.  Otherwise the return value is 0. * * Side effects: *	None. * *---------------------------------------------------------------------- */Proc *TclIsProc(cmdPtr)    Command *cmdPtr;		/* Command to test. */{    Tcl_Command origCmd;    origCmd = TclGetOriginalCommand((Tcl_Command) cmdPtr);    if (origCmd != NULL) {	cmdPtr = (Command *) origCmd;    }    if (cmdPtr->proc == TclProcInterpProc) {	return (Proc *) cmdPtr->clientData;    }    return (Proc *) 0;}/* *---------------------------------------------------------------------- * * TclProcInterpProc -- * *	When a Tcl procedure gets invoked with an argc/argv array of *	strings, this routine gets invoked to interpret the procedure. * * Results: *	A standard Tcl result value, usually TCL_OK. * * Side effects: *	Depends on the commands in the procedure. * *---------------------------------------------------------------------- */intTclProcInterpProc(clientData, interp, argc, argv)    ClientData clientData;	/* Record describing procedure to be				 * interpreted. */    Tcl_Interp *interp;		/* Interpreter in which procedure was				 * invoked. */    int argc;			/* Count of number of arguments to this				 * procedure. */    register char **argv;	/* Argument values. */{    register Tcl_Obj *objPtr;    register int i;    int result;    /*     * This procedure generates an objv array for object arguments that hold     * the argv strings. It starts out with stack-allocated space but uses     * dynamically-allocated storage if needed.     */#define NUM_ARGS 20    Tcl_Obj *(objStorage[NUM_ARGS]);    register Tcl_Obj **objv = objStorage;    /*     * Create the object argument array "objv". Make sure objv is large     * enough to hold the objc arguments plus 1 extra for the zero     * end-of-objv word.     */    if ((argc + 1) > NUM_ARGS) {	objv = (Tcl_Obj **)	    ckalloc((unsigned)(argc + 1) * sizeof(Tcl_Obj *));    }    for (i = 0;  i < argc;  i++) {	objv[i] = Tcl_NewStringObj(argv[i], -1);	Tcl_IncrRefCount(objv[i]);    }    objv[argc] = 0;    /*     * Use TclObjInterpProc to actually interpret the procedure.     */    result = TclObjInterpProc(clientData, interp, argc, objv);    /*     * Move the interpreter's object result to the string result,      * then reset the object result.     * FAILS IF OBJECT RESULT'S STRING REPRESENTATION CONTAINS NULLS.     */        Tcl_SetResult(interp,	    TclGetStringFromObj(Tcl_GetObjResult(interp), (int *) NULL),	    TCL_VOLATILE);    /*     * Decrement the ref counts on the objv elements since we are done     * with them.     */    for (i = 0;  i < argc;  i++) {	objPtr = objv[i];	TclDecrRefCount(objPtr);    }        /*     * Free the objv array if malloc'ed storage was used.     */    if (objv != objStorage) {	ckfree((char *) objv);    }    return result;#undef NUM_ARGS}/* *---------------------------------------------------------------------- * * TclObjInterpProc -- * *	When a Tcl procedure gets invoked during bytecode evaluation, this  *	object-based routine gets invoked to interpret the procedure. * * Results: *	A standard Tcl object result value. * * Side effects: *	Depends on the commands in the procedure. * *---------------------------------------------------------------------- */intTclObjInterpProc(clientData, interp, objc, objv)    ClientData clientData;	/* Record describing procedure to be				 * interpreted. */    Tcl_Interp *interp;		/* Interpreter in which procedure was				 * invoked. */    int objc;			/* Count of number of arguments to this				 * procedure. */    Tcl_Obj *CONST objv[];	/* Argument value objects. */{    Interp *iPtr = (Interp *) interp;    Proc *procPtr = (Proc *) clientData;    Namespace *nsPtr = procPtr->cmdPtr->nsPtr;    CallFrame frame;    register CallFrame *framePtr = &frame;    register CompiledLocal *localPtr;    char *procName, *bytes;    int nameLen, localCt, numArgs, argCt, length, i, result;    Var *varPtr;    /*     * This procedure generates an array "compiledLocals" that holds the     * storage for local variables. It starts out with stack-allocated space     * but uses dynamically-allocated storage if needed.     */#define NUM_LOCALS 20    Var localStorage[NUM_LOCALS];    Var *compiledLocals = localStorage;    /*     * Get the procedure's name.     * THIS FAILS IF THE PROC NAME'S STRING REP HAS A NULL.     */        procName = Tcl_GetStringFromObj(objv[0], &nameLen);    /*     * If necessary, compile the procedure's body. The compiler will     * allocate frame slots for the procedure's non-argument local     * variables.  Note that compiling the body might increase     * procPtr->numCompiledLocals if new local variables are found     * while compiling.     */        result = TclProcCompileProc(interp, procPtr, procPtr->bodyPtr, nsPtr,	    "body of proc", procName);        if (result != TCL_OK) {        return result;    }    /*     * Create the "compiledLocals" array. Make sure it is large enough to     * hold all the procedure's compiled local variables, including its     * formal parameters.     */    localCt = procPtr->numCompiledLocals;    if (localCt > NUM_LOCALS) {	compiledLocals = (Var *) ckalloc((unsigned) localCt * sizeof(Var));    }        /*     * Set up and push a new call frame for the new procedure invocation.     * This call frame will execute in the proc's namespace, which might     * be different than the current namespace. The proc's namespace is     * that of its command, which can change if the command is renamed     * from one namespace to another.     */    result = Tcl_PushCallFrame(interp, (Tcl_CallFrame *) framePtr,            (Tcl_Namespace *) nsPtr, /*isProcCallFrame*/ 1);    if (result != TCL_OK) {        return result;    }    framePtr->objc = objc;    framePtr->objv = objv;  /* ref counts for args are incremented below */    /*     * Initialize and resolve compiled variable references.     */    framePtr->procPtr = procPtr;    framePtr->numCompiledLocals = localCt;    framePtr->compiledLocals = compiledLocals;    TclInitCompiledLocals(interp, framePtr, nsPtr);        /*     * Match and assign the call's actual parameters to the procedure's     * formal arguments. The formal arguments are described by the first     * numArgs entries in both the Proc structure's local variable list and     * the call frame's local variable array.     */    numArgs = procPtr->numArgs;    varPtr = framePtr->compiledLocals;    localPtr = procPtr->firstLocalPtr;    argCt = objc;    for (i = 1, argCt -= 1;  i <= numArgs;  i++, argCt--) {	if (!TclIsVarArgument(localPtr)) {	    panic("TclObjInterpProc: local variable %s is not argument but should be",		  localPtr->name);	    return TCL_ERROR;	}	if (TclIsVarTemporary(localPtr)) {	    panic("TclObjInterpProc: local variable %d is temporary but should be an argument", i);	    return TCL_ERROR;	}	/*	 * Handle the special case of the last formal being "args".  When	 * it occurs, assign it a list consisting of all the remaining	 * actual arguments.	 */	if ((i == numArgs) && ((localPtr->name[0] == 'a')	        && (strcmp(localPtr->name, "args") == 0))) {	    Tcl_Obj *listPtr = Tcl_NewListObj(argCt, &(objv[i]));	    varPtr->value.objPtr = listPtr;	    Tcl_IncrRefCount(listPtr); /* local var is a reference */	    varPtr->flags &= ~VAR_UNDEFINED;	    argCt = 0;	    break;		/* done processing args */	} else if (argCt > 0) {	    Tcl_Obj *objPtr = objv[i];	    varPtr->value.objPtr = objPtr;	    varPtr->flags &= ~VAR_UNDEFINED;	    Tcl_IncrRefCount(objPtr);  /* since the local variable now has					* another reference to object. */	} else if (localPtr->defValuePtr != NULL) {	    Tcl_Obj *objPtr = localPtr->defValuePtr;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -