rem: AdpEval(itPtr, &ipagePtr->pagePtr->code, ipagePtr->objs);
add: status = AdpEval(itPtr, &ipagePtr->pagePtr->code, ipagePtr->objs);
context: AdpRun(NsInterp *itPtr, char *file, int objc, Tcl_Obj *objv[],       Tcl_DString *outputPtr){    NsServer  *servPtr = itPtr->servPtr;    Tcl_Interp *interp = itPtr->interp;    Tcl_HashEntry *hPtr;    struct stat st;    Ns_DString tmp, path;    Frame frame;    InterpPage *ipagePtr;    Page *pagePtr, *oldPagePtr;    Ns_Entry *ePtr;    int new, n;    char *p, *key;    FileKey ukey;    ipagePtr = NULL;    pagePtr = NULL;        Ns_DStringInit(&tmp);    Ns_DStringInit(&path);    key = (char *) &ukey;        /*     * Construct the full, normalized path to the ADP file.     */    if (Ns_PathIsAbsolute(file)) {	Ns_NormalizePath(&path, file);    } else {	Ns_MakePath(&tmp, itPtr->adp.cwd, file, NULL);	Ns_NormalizePath(&path, tmp.string);	Ns_DStringTrunc(&tmp, 0);    }    file = path.string;    /*     * Check for TclPro debugging.     */    if (itPtr->adp.debugLevel > 0) {	++itPtr->adp.debugLevel;    } else if (servPtr->adp.enabledebug != NS_FALSE &&	itPtr->adp.debugFile != NULL &&	(p = strrchr(file, '/')) != NULL &&	Tcl_StringMatch(p+1, itPtr->adp.debugFile)) {	Ns_Set *hdrs;	char *host, *port, *procs;	hdrs = Ns_ConnGetQuery(itPtr->conn);	host = Ns_SetIGet(hdrs, "dhost");	port = Ns_SetIGet(hdrs, "dport");	procs = Ns_SetIGet(hdrs, "dprocs");	if (NsAdpDebug(itPtr, host, port, procs) != TCL_OK) {	    Ns_ConnReturnNotice(itPtr->conn, 200, "Debug Init Failed",				(char *) Tcl_GetStringResult(interp));	    itPtr->adp.exception = ADP_ABORT;	    goto done;	}    }    if (itPtr->adp.cache == NULL) {	Ns_DStringPrintf(&tmp, "nsadp:%s:%p", itPtr->servPtr->server, itPtr);#ifdef _WIN32    itPtr->adp.cache = Ns_CacheCreateSz(tmp.string, TCL_STRING_KEYS,				itPtr->servPtr->adp.cachesize, FreeInterpPage);#else    itPtr->adp.cache = Ns_CacheCreateSz(tmp.string, FILE_KEYS,				itPtr->servPtr->adp.cachesize, FreeInterpPage);#endif	Ns_DStringTrunc(&tmp, 0);    }    /*     * Verify the file is an existing, ordinary file and get page code.     */    if (stat(file, &st) != 0) {	Tcl_AppendResult(interp, "could not stat \"",	    file, "\": ", Tcl_PosixError(interp), NULL);    } else if (S_ISREG(st.st_mode) == 0) {    	Tcl_AppendResult(interp, "not an ordinary file: ", file, NULL);    } else {	/*	 * Check for valid code in interp page cache.	 */	 #ifdef _WIN32    key = file;#else	ukey.dev = st.st_dev;	ukey.ino = st.st_ino;#endif        ePtr = Ns_CacheFindEntry(itPtr->adp.cache, key);	if (ePtr != NULL) {    	    ipagePtr = Ns_CacheGetValue(ePtr);    	    if (ipagePtr->pagePtr->mtime != st.st_mtime || ipagePtr->pagePtr->size != st.st_size) {		Ns_CacheFlushEntry(ePtr);		ipagePtr = NULL;	    }	}	if (ipagePtr == NULL) {	    /*	     * Find or create valid page in server table.	     */	         	    Ns_MutexLock(&servPtr->adp.pagelock);	    hPtr = Tcl_CreateHashEntry(&servPtr->adp.pages, key, &new);	    while (!new && (pagePtr = Tcl_GetHashValue(hPtr)) == NULL) {		/* NB: Wait for other thread to read/parse page. */		Ns_CondWait(&servPtr->adp.pagecond, &servPtr->adp.pagelock);		hPtr = Tcl_CreateHashEntry(&servPtr->adp.pages, key, &new);	    }	    if (!new && (pagePtr->mtime != st.st_mtime || pagePtr->size != st.st_size)) {		/* NB: Clear entry to indicate read/parse in progress. */		Tcl_SetHashValue(hPtr, NULL);		pagePtr->hPtr = NULL;		new = 1;	    }	    if (new) {		Ns_MutexUnlock(&servPtr->adp.pagelock);		pagePtr = ParseFile(itPtr, file, &st);		Ns_MutexLock(&servPtr->adp.pagelock);		if (pagePtr == NULL) {		    Tcl_DeleteHashEntry(hPtr);		} else {#ifdef _WIN32            if (pagePtr->mtime != st.st_mtime || pagePtr->size != st.st_size) {#else            if (ukey.dev != st.st_dev || ukey.ino != st.st_ino) {#endif			/* NB: File changed between stat above and ParseFile. */		    	Tcl_DeleteHashEntry(hPtr);#ifndef _WIN32                ukey.dev = st.st_dev;		    	ukey.ino = st.st_ino;#endif		    	hPtr = Tcl_CreateHashEntry(&servPtr->adp.pages, key, &new);		    	if (!new) {			    oldPagePtr = Tcl_GetHashValue(hPtr);			    oldPagePtr->hPtr = NULL;		    	}		    }		    pagePtr->hPtr = hPtr;		    Tcl_SetHashValue(hPtr, pagePtr);		}		Ns_CondBroadcast(&servPtr->adp.pagecond);	    }	    if (pagePtr != NULL) {	    	++pagePtr->refcnt;	    }	    Ns_MutexUnlock(&servPtr->adp.pagelock);	    if (pagePtr != NULL) {		n = sizeof(Tcl_Obj *) * pagePtr->code.nscripts;	    	ipagePtr = ns_calloc(1, sizeof(InterpPage) + n);		ipagePtr->pagePtr = pagePtr;        	ePtr = Ns_CacheCreateEntry(itPtr->adp.cache, key, &new);		if (!new) {		    Ns_CacheUnsetValue(ePtr);		}        Ns_CacheSetValueSz(ePtr, ipagePtr, (size_t)ipagePtr->pagePtr->size);	    }	}    }        /*     * If valid page was found, evaluate it in a new call frame.     */             if (ipagePtr != NULL) {    	PushFrame(itPtr, &frame, file, objc, objv, outputPtr);	AdpEval(itPtr, &ipagePtr->pagePtr->code, ipagePtr->objs);    	PopFrame(itPtr, &frame);	Ns_MutexLock(&servPtr->adp.pagelock);	++ipagePtr->pagePtr->evals;	Ns_MutexUnlock(&servPtr->adp.pagelock);    }    if (itPtr->adp.debugLevel > 0) {	--itPtr->adp.debugLevel;    }done:    Ns_DStringFree(&path);    Ns_DStringFree(&tmp);    return TCL_OK;}