Diff
Not logged in

Differences From Artifact [33773296e9]:

To Artifact [cbd6369d27]:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclTrace.c --
 *
 *	This file contains code to handle most trace management.
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-2000 Scriptics Corporation.
 * Copyright (c) 2002 ActiveState Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution of
 * this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclTrace.c,v 1.37.2.5 2007/09/04 17:43:53 dgp Exp $
 */

#include "tclInt.h"

/*
 * Structures used to hold information about variable traces:
 */













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * tclTrace.c --
 *
 *	This file contains code to handle most trace management.
 *
 * Copyright (c) 1987-1993 The Regents of the University of California.
 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
 * Copyright (c) 1998-2000 Scriptics Corporation.
 * Copyright (c) 2002 ActiveState Corporation.
 *
 * See the file "license.terms" for information on usage and redistribution of
 * this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * RCS: @(#) $Id: tclTrace.c,v 1.37.2.6 2007/09/17 15:03:45 dgp Exp $
 */

#include "tclInt.h"

/*
 * Structures used to hold information about variable traces:
 */
266
267
268
269
270
271
272


273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288

289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
	Tcl_IncrRefCount(opsList);
	flagOps = Tcl_GetStringFromObj(objv[3], &numFlags);
	if (numFlags == 0) {
	    Tcl_DecrRefCount(opsList);
	    goto badVarOps;
	}
	for (p = flagOps; *p != 0; p++) {


	    if (*p == 'r') {
		Tcl_ListObjAppendElement(NULL, opsList,
			Tcl_NewStringObj("read", -1));
	    } else if (*p == 'w') {
		Tcl_ListObjAppendElement(NULL, opsList,
			Tcl_NewStringObj("write", -1));
	    } else if (*p == 'u') {
		Tcl_ListObjAppendElement(NULL, opsList,
			Tcl_NewStringObj("unset", -1));
	    } else if (*p == 'a') {
		Tcl_ListObjAppendElement(NULL, opsList,
			Tcl_NewStringObj("array", -1));
	    } else {
		Tcl_DecrRefCount(opsList);
		goto badVarOps;
	    }

	}
	copyObjv[0] = NULL;
	memcpy(copyObjv+1, objv, objc*sizeof(Tcl_Obj *));
	copyObjv[4] = opsList;
	if (optionIndex == TRACE_OLD_VARIABLE) {
	    code = (traceSubCmds[2])(interp,TRACE_ADD,objc+1,copyObjv);
	} else {
	    code = (traceSubCmds[2])(interp,TRACE_REMOVE,objc+1,copyObjv);
	}
	Tcl_DecrRefCount(opsList);
	return code;
    }
    case TRACE_OLD_VINFO: {
	ClientData clientData;
	char ops[5];







>
>

<
|

<
|

<
|

<
|




>





|

|







266
267
268
269
270
271
272
273
274
275

276
277

278
279

280
281

282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
	Tcl_IncrRefCount(opsList);
	flagOps = Tcl_GetStringFromObj(objv[3], &numFlags);
	if (numFlags == 0) {
	    Tcl_DecrRefCount(opsList);
	    goto badVarOps;
	}
	for (p = flagOps; *p != 0; p++) {
	    Tcl_Obj *opObj;

	    if (*p == 'r') {

		TclNewLiteralStringObj(opObj, "read");
	    } else if (*p == 'w') {

		TclNewLiteralStringObj(opObj, "write");
	    } else if (*p == 'u') {

		TclNewLiteralStringObj(opObj, "unset");
	    } else if (*p == 'a') {

		TclNewLiteralStringObj(opObj, "array");
	    } else {
		Tcl_DecrRefCount(opsList);
		goto badVarOps;
	    }
	    Tcl_ListObjAppendElement(NULL, opsList, opObj);
	}
	copyObjv[0] = NULL;
	memcpy(copyObjv+1, objv, objc*sizeof(Tcl_Obj *));
	copyObjv[4] = opsList;
	if (optionIndex == TRACE_OLD_VARIABLE) {
	    code = (traceSubCmds[2])(interp, TRACE_ADD, objc+1, copyObjv);
	} else {
	    code = (traceSubCmds[2])(interp, TRACE_REMOVE, objc+1, copyObjv);
	}
	Tcl_DecrRefCount(opsList);
	return code;
    }
    case TRACE_OLD_VINFO: {
	ClientData clientData;
	char ops[5];
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581

582
583
584
585

586
587
588
589

590
591
592
593

594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
	    return TCL_ERROR;
	}

	resultListPtr = Tcl_NewListObj(0, NULL);
	while ((clientData = Tcl_CommandTraceInfo(interp, name, 0,
		TraceCommandProc, clientData)) != NULL) {
	    int numOps = 0;

	    TraceCommandInfo *tcmdPtr = (TraceCommandInfo *) clientData;

	    /*
	     * Build a list with the ops list as the first obj element and the
	     * tcmdPtr->command string as the second obj element. Append this
	     * list (as an element) to the end of the result object list.
	     */

	    elemObjPtr = Tcl_NewListObj(0, NULL);
	    Tcl_IncrRefCount(elemObjPtr);
	    if (tcmdPtr->flags & TCL_TRACE_ENTER_EXEC) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("enter",5));
	    }
	    if (tcmdPtr->flags & TCL_TRACE_LEAVE_EXEC) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("leave",5));
	    }
	    if (tcmdPtr->flags & TCL_TRACE_ENTER_DURING_EXEC) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("enterstep",9));
	    }
	    if (tcmdPtr->flags & TCL_TRACE_LEAVE_DURING_EXEC) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("leavestep",9));
	    }
	    Tcl_ListObjLength(NULL, elemObjPtr, &numOps);
	    if (0 == numOps) {
		Tcl_DecrRefCount(elemObjPtr);
		continue;
	    }
	    eachTraceObjPtr = Tcl_NewListObj(0, NULL);
	    Tcl_ListObjAppendElement(NULL, eachTraceObjPtr, elemObjPtr);
	    Tcl_DecrRefCount(elemObjPtr);
	    elemObjPtr = NULL;

	    Tcl_ListObjAppendElement(NULL, eachTraceObjPtr,
		    Tcl_NewStringObj(tcmdPtr->command, -1));
	    Tcl_ListObjAppendElement(interp, resultListPtr,
		    eachTraceObjPtr);
	}
	Tcl_SetObjResult(interp, resultListPtr);
	break;
    }
    }
    return TCL_OK;
}







|











>
|
<


>
|
<


>
|
<


>
|
<













|
<







562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582

583
584
585
586

587
588
589
590

591
592
593
594

595
596
597
598
599
600
601
602
603
604
605
606
607
608

609
610
611
612
613
614
615
	    return TCL_ERROR;
	}

	resultListPtr = Tcl_NewListObj(0, NULL);
	while ((clientData = Tcl_CommandTraceInfo(interp, name, 0,
		TraceCommandProc, clientData)) != NULL) {
	    int numOps = 0;
	    Tcl_Obj *opObj;
	    TraceCommandInfo *tcmdPtr = (TraceCommandInfo *) clientData;

	    /*
	     * Build a list with the ops list as the first obj element and the
	     * tcmdPtr->command string as the second obj element. Append this
	     * list (as an element) to the end of the result object list.
	     */

	    elemObjPtr = Tcl_NewListObj(0, NULL);
	    Tcl_IncrRefCount(elemObjPtr);
	    if (tcmdPtr->flags & TCL_TRACE_ENTER_EXEC) {
		TclNewLiteralStringObj(opObj, "enter");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    if (tcmdPtr->flags & TCL_TRACE_LEAVE_EXEC) {
		TclNewLiteralStringObj(opObj, "leave");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    if (tcmdPtr->flags & TCL_TRACE_ENTER_DURING_EXEC) {
		TclNewLiteralStringObj(opObj, "enterstep");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    if (tcmdPtr->flags & TCL_TRACE_LEAVE_DURING_EXEC) {
		TclNewLiteralStringObj(opObj, "leavestep");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    Tcl_ListObjLength(NULL, elemObjPtr, &numOps);
	    if (0 == numOps) {
		Tcl_DecrRefCount(elemObjPtr);
		continue;
	    }
	    eachTraceObjPtr = Tcl_NewListObj(0, NULL);
	    Tcl_ListObjAppendElement(NULL, eachTraceObjPtr, elemObjPtr);
	    Tcl_DecrRefCount(elemObjPtr);
	    elemObjPtr = NULL;

	    Tcl_ListObjAppendElement(NULL, eachTraceObjPtr,
		    Tcl_NewStringObj(tcmdPtr->command, -1));
	    Tcl_ListObjAppendElement(interp, resultListPtr, eachTraceObjPtr);

	}
	Tcl_SetObjResult(interp, resultListPtr);
	break;
    }
    }
    return TCL_OK;
}
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789

790
791
792
793

794
795
796
797
798
799
800
801
802
	    return TCL_ERROR;
	}

	resultListPtr = Tcl_NewListObj(0, NULL);
	while ((clientData = Tcl_CommandTraceInfo(interp, name, 0,
		TraceCommandProc, clientData)) != NULL) {
	    int numOps = 0;

	    TraceCommandInfo *tcmdPtr = (TraceCommandInfo *) clientData;

	    /*
	     * Build a list with the ops list as the first obj element and the
	     * tcmdPtr->command string as the second obj element. Append this
	     * list (as an element) to the end of the result object list.
	     */

	    elemObjPtr = Tcl_NewListObj(0, NULL);
	    Tcl_IncrRefCount(elemObjPtr);
	    if (tcmdPtr->flags & TCL_TRACE_RENAME) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("rename",6));
	    }
	    if (tcmdPtr->flags & TCL_TRACE_DELETE) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("delete",6));
	    }
	    Tcl_ListObjLength(NULL, elemObjPtr, &numOps);
	    if (0 == numOps) {
		Tcl_DecrRefCount(elemObjPtr);
		continue;
	    }
	    eachTraceObjPtr = Tcl_NewListObj(0, NULL);







|











>
|
<


>
|
<







769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789

790
791
792
793

794
795
796
797
798
799
800
	    return TCL_ERROR;
	}

	resultListPtr = Tcl_NewListObj(0, NULL);
	while ((clientData = Tcl_CommandTraceInfo(interp, name, 0,
		TraceCommandProc, clientData)) != NULL) {
	    int numOps = 0;
	    Tcl_Obj *opObj;
	    TraceCommandInfo *tcmdPtr = (TraceCommandInfo *) clientData;

	    /*
	     * Build a list with the ops list as the first obj element and the
	     * tcmdPtr->command string as the second obj element. Append this
	     * list (as an element) to the end of the result object list.
	     */

	    elemObjPtr = Tcl_NewListObj(0, NULL);
	    Tcl_IncrRefCount(elemObjPtr);
	    if (tcmdPtr->flags & TCL_TRACE_RENAME) {
		TclNewLiteralStringObj(opObj, "rename");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    if (tcmdPtr->flags & TCL_TRACE_DELETE) {
		TclNewLiteralStringObj(opObj, "delete");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    Tcl_ListObjLength(NULL, elemObjPtr, &numOps);
	    if (0 == numOps) {
		Tcl_DecrRefCount(elemObjPtr);
		continue;
	    }
	    eachTraceObjPtr = Tcl_NewListObj(0, NULL);
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974

975
976
977
978

979
980
981
982

983
984
985
986

987
988
989
990
991
992
993
994
995
	}

	resultListPtr = Tcl_NewObj();
	clientData = 0;
	name = Tcl_GetString(objv[3]);
	while ((clientData = Tcl_VarTraceInfo(interp, name, 0, TraceVarProc,
		clientData)) != 0) {

	    TraceVarInfo *tvarPtr = (TraceVarInfo *) clientData;

	    /*
	     * Build a list with the ops list as the first obj element and the
	     * tcmdPtr->command string as the second obj element. Append this
	     * list (as an element) to the end of the result object list.
	     */

	    elemObjPtr = Tcl_NewListObj(0, NULL);
	    if (tvarPtr->flags & TCL_TRACE_ARRAY) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("array", 5));
	    }
	    if (tvarPtr->flags & TCL_TRACE_READS) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("read", 4));
	    }
	    if (tvarPtr->flags & TCL_TRACE_WRITES) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("write", 5));
	    }
	    if (tvarPtr->flags & TCL_TRACE_UNSETS) {

		Tcl_ListObjAppendElement(NULL, elemObjPtr,
			Tcl_NewStringObj("unset", 5));
	    }
	    eachTraceObjPtr = Tcl_NewListObj(0, NULL);
	    Tcl_ListObjAppendElement(NULL, eachTraceObjPtr, elemObjPtr);

	    elemObjPtr = Tcl_NewStringObj(tvarPtr->command, -1);
	    Tcl_ListObjAppendElement(NULL, eachTraceObjPtr, elemObjPtr);
	    Tcl_ListObjAppendElement(interp, resultListPtr,







|










>
|
<


>
|
<


>
|
<


>
|
<







955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974

975
976
977
978

979
980
981
982

983
984
985
986

987
988
989
990
991
992
993
	}

	resultListPtr = Tcl_NewObj();
	clientData = 0;
	name = Tcl_GetString(objv[3]);
	while ((clientData = Tcl_VarTraceInfo(interp, name, 0, TraceVarProc,
		clientData)) != 0) {
	    Tcl_Obj *opObj;
	    TraceVarInfo *tvarPtr = (TraceVarInfo *) clientData;

	    /*
	     * Build a list with the ops list as the first obj element and the
	     * tcmdPtr->command string as the second obj element. Append this
	     * list (as an element) to the end of the result object list.
	     */

	    elemObjPtr = Tcl_NewListObj(0, NULL);
	    if (tvarPtr->flags & TCL_TRACE_ARRAY) {
		TclNewLiteralStringObj(opObj, "array");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    if (tvarPtr->flags & TCL_TRACE_READS) {
		TclNewLiteralStringObj(opObj, "read");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    if (tvarPtr->flags & TCL_TRACE_WRITES) {
		TclNewLiteralStringObj(opObj, "write");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    if (tvarPtr->flags & TCL_TRACE_UNSETS) {
		TclNewLiteralStringObj(opObj, "unset");
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);

	    }
	    eachTraceObjPtr = Tcl_NewListObj(0, NULL);
	    Tcl_ListObjAppendElement(NULL, eachTraceObjPtr, elemObjPtr);

	    elemObjPtr = Tcl_NewStringObj(tvarPtr->command, -1);
	    Tcl_ListObjAppendElement(NULL, eachTraceObjPtr, elemObjPtr);
	    Tcl_ListObjAppendElement(interp, resultListPtr,