Tcl Source Code

Artifact [662a1f3df6]
Login

Artifact 662a1f3df6f4cedc50bdcc6cb5d596417eae1846:

Attachment "lastresult.patch" to ticket [2927535fff] added by ferrieux 2010-01-07 20:56:37.
Index: generic/tclHistory.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclHistory.c,v
retrieving revision 1.14
diff -u -p -r1.14 tclHistory.c
--- generic/tclHistory.c	29 Dec 2009 16:58:41 -0000	1.14
+++ generic/tclHistory.c	7 Jan 2010 13:48:55 -0000
@@ -28,6 +28,8 @@ typedef struct {
 } HistoryObjs;
 
 #define HISTORY_OBJS_KEY	"::tcl::HistoryObjs"
+#define HISTORY_RESULT_KEY      "::tcl::HistResult"
+
 
 /*
  * Static functions in this file.
@@ -98,6 +100,108 @@ Tcl_RecordAndEval(
     }
     return result;
 }
+
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * DeleteHistoryResult --
+ *
+ *	Called to delete the references to the last result.
+ *
+ * Results:
+ *	None.
+ *
+ * Side effects:
+ *	The result object may be deleted.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+DeleteHistoryResult(
+    ClientData clientData,
+    Tcl_Interp *interp)
+{
+    Tcl_Obj *obj;
+    
+    obj=(Tcl_Obj *)Tcl_GetAssocData(interp, HISTORY_RESULT_KEY, NULL);
+    if (obj != NULL) {
+        Tcl_DecrRefCount(obj);
+    }
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * StoreHistoryResult --
+ *
+ *	This  procedure  keeps a  reference  to  the  interp's result  in  the
+ *	interp's assoc table, for later retrieval by [interp result].
+ *
+ * Side effects:
+ *	
+ *      Refcounts  are updated properly  so that  the previously  stored value
+ *	gets freed.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static
+void
+StoreHistoryResult(
+                Tcl_Interp *interp
+                )
+{
+    Tcl_Obj *obj;
+
+    obj=(Tcl_Obj *)Tcl_GetAssocData(interp, HISTORY_RESULT_KEY, NULL);
+    if (obj != NULL) {
+        Tcl_DecrRefCount(obj);
+    }
+    obj=Tcl_GetObjResult(interp);
+    Tcl_IncrRefCount(obj);
+    Tcl_SetAssocData(interp, HISTORY_RESULT_KEY, DeleteHistoryResult, obj);
+}
+
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * HistResultObjCmd --
+ *
+ *	This function is invoked to process the ::tcl::lastresult Tcl command.
+ *
+ *----------------------------------------------------------------------
+ */
+	/* ARGSUSED */
+int
+Tcl_HistResultObjCmd(
+    ClientData clientData,		/* Unused. */
+    Tcl_Interp *interp,			/* Current interpreter. */
+    int objc,				/* Number of arguments. */
+    Tcl_Obj *const objv[])		/* Argument objects. */
+{
+    Tcl_Obj *obj;
+
+    if (objc > 1)
+        {
+            Tcl_WrongNumArgs(interp, 1, objv, "");
+            return TCL_ERROR;
+        }
+
+    obj = (Tcl_Obj *) Tcl_GetAssocData(interp, HISTORY_RESULT_KEY, NULL);
+    if (obj == NULL) {
+        Tcl_ResetResult(interp);
+        Tcl_AppendResult(interp, "no interactive command executed yet");
+        return TCL_ERROR;
+    }
+
+    Tcl_SetObjResult(interp, obj);
+
+    return TCL_OK;
+}
+
 
 /*
  *----------------------------------------------------------------------
@@ -190,6 +294,8 @@ Tcl_RecordAndEvalObj(
     result = TCL_OK;
     if (!(flags & TCL_NO_EVAL)) {
 	result = Tcl_EvalObjEx(interp, cmdPtr, flags & TCL_EVAL_GLOBAL);
+
+        StoreHistoryResult(interp);
     }
     return result;
 }
@@ -228,5 +334,7 @@ DeleteHistoryObjs(
  * mode: c
  * c-basic-offset: 4
  * fill-column: 78
+ * tab-width: 8
+ * indent-tabs-mode: nil
  * End:
  */
Index: generic/tclInt.h
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclInt.h,v
retrieving revision 1.453
diff -u -p -r1.453 tclInt.h
--- generic/tclInt.h	11 Dec 2009 04:47:13 -0000	1.453
+++ generic/tclInt.h	7 Jan 2010 13:48:55 -0000
@@ -3274,6 +3274,9 @@ MODULE_SCOPE int	Tcl_VwaitObjCmd(ClientD
 MODULE_SCOPE int	Tcl_WhileObjCmd(ClientData clientData,
 			    Tcl_Interp *interp, int objc,
 			    Tcl_Obj *const objv[]);
+MODULE_SCOPE int	Tcl_HistResultObjCmd(ClientData clientData,
+			    Tcl_Interp *interp, int objc,
+			    Tcl_Obj *const objv[]);
 
 /*
  *----------------------------------------------------------------
Index: generic/tclMain.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclMain.c,v
retrieving revision 1.47
diff -u -p -r1.47 tclMain.c
--- generic/tclMain.c	15 Dec 2008 15:48:33 -0000	1.47
+++ generic/tclMain.c	7 Jan 2010 13:48:56 -0000
@@ -219,6 +219,7 @@ Tcl_SourceRCFile(
 	Tcl_DStringFree(&temp);
     }
 }
+
 
 /*----------------------------------------------------------------------
  *
@@ -396,6 +397,9 @@ Tcl_Main(
      */
 
     Tcl_LinkVar(interp, "tcl_interactive", (char *) &tty, TCL_LINK_BOOLEAN);
+
+	Tcl_CreateObjCommand(interp, "::tcl::lastresult", Tcl_HistResultObjCmd, NULL, NULL);
+
     inChannel = Tcl_GetStdChannel(TCL_STDIN);
     outChannel = Tcl_GetStdChannel(TCL_STDOUT);
     while ((inChannel != NULL) && !Tcl_InterpDeleted(interp)) {