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
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 $
 * 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
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') {
		Tcl_ListObjAppendElement(NULL, opsList,
			Tcl_NewStringObj("read", -1));
		TclNewLiteralStringObj(opObj, "read");
	    } else if (*p == 'w') {
		Tcl_ListObjAppendElement(NULL, opsList,
			Tcl_NewStringObj("write", -1));
		TclNewLiteralStringObj(opObj, "write");
	    } else if (*p == 'u') {
		Tcl_ListObjAppendElement(NULL, opsList,
			Tcl_NewStringObj("unset", -1));
		TclNewLiteralStringObj(opObj, "unset");
	    } else if (*p == 'a') {
		Tcl_ListObjAppendElement(NULL, opsList,
			Tcl_NewStringObj("array", -1));
		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);
	    code = (traceSubCmds[2])(interp, TRACE_ADD, objc+1, copyObjv);
	} else {
	    code = (traceSubCmds[2])(interp,TRACE_REMOVE,objc+1,copyObjv);
	    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
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,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			Tcl_NewStringObj("enter",5));
	    }
	    if (tcmdPtr->flags & TCL_TRACE_LEAVE_EXEC) {
		TclNewLiteralStringObj(opObj, "leave");
		Tcl_ListObjAppendElement(NULL, elemObjPtr,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			Tcl_NewStringObj("leave",5));
	    }
	    if (tcmdPtr->flags & TCL_TRACE_ENTER_DURING_EXEC) {
		TclNewLiteralStringObj(opObj, "enterstep");
		Tcl_ListObjAppendElement(NULL, elemObjPtr,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			Tcl_NewStringObj("enterstep",9));
	    }
	    if (tcmdPtr->flags & TCL_TRACE_LEAVE_DURING_EXEC) {
		TclNewLiteralStringObj(opObj, "leavestep");
		Tcl_ListObjAppendElement(NULL, elemObjPtr,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			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,
	    Tcl_ListObjAppendElement(interp, resultListPtr, eachTraceObjPtr);
		    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
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,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			Tcl_NewStringObj("rename",6));
	    }
	    if (tcmdPtr->flags & TCL_TRACE_DELETE) {
		TclNewLiteralStringObj(opObj, "delete");
		Tcl_ListObjAppendElement(NULL, elemObjPtr,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			Tcl_NewStringObj("delete",6));
	    }
	    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
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,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			Tcl_NewStringObj("array", 5));
	    }
	    if (tvarPtr->flags & TCL_TRACE_READS) {
		TclNewLiteralStringObj(opObj, "read");
		Tcl_ListObjAppendElement(NULL, elemObjPtr,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			Tcl_NewStringObj("read", 4));
	    }
	    if (tvarPtr->flags & TCL_TRACE_WRITES) {
		TclNewLiteralStringObj(opObj, "write");
		Tcl_ListObjAppendElement(NULL, elemObjPtr,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			Tcl_NewStringObj("write", 5));
	    }
	    if (tvarPtr->flags & TCL_TRACE_UNSETS) {
		TclNewLiteralStringObj(opObj, "unset");
		Tcl_ListObjAppendElement(NULL, elemObjPtr,
		Tcl_ListObjAppendElement(NULL, elemObjPtr, opObj);
			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,