aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez>2005-03-19 19:12:30 +0000
committerantirez <antirez>2005-03-19 19:12:30 +0000
commit4212adfb46da94fa2851dd688889578127044de6 (patch)
treeb66f37e17ea037ff1ca704ca384027f301bcbabb
parent32cc4bd7be3bf8045943e592691b538153713719 (diff)
downloadjimtcl-4212adfb46da94fa2851dd688889578127044de6.zip
jimtcl-4212adfb46da94fa2851dd688889578127044de6.tar.gz
jimtcl-4212adfb46da94fa2851dd688889578127044de6.tar.bz2
[finalize] command and relative C API added (SS).
-rw-r--r--ChangeLog5
-rw-r--r--Makefile4
-rw-r--r--TODO7
-rw-r--r--jim.c56
-rw-r--r--jim.h6
5 files changed, 72 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 0591357..9584688 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-03-18 12:39 antirez
+
+ * ChangeLog, jim.c: now [setref] returns the value assigned to the
+ reference instead of the reference itself.
+
2005-03-18 10:36 antirez
* ChangeLog, Makefile, jim.c: Fixed an EXPR bug.
diff --git a/Makefile b/Makefile
index 5edf262..abaf2ee 100644
--- a/Makefile
+++ b/Makefile
@@ -93,6 +93,10 @@ commit:
cvs2cl
cvs commit
+update:
+ cvs update
+ cvs2cl
+
bak:
cp -f jim.c jim.c.orig
cp -f jimsh.c jimsh.c.orig
diff --git a/TODO b/TODO
index 5508f90..e6ff104 100644
--- a/TODO
+++ b/TODO
@@ -15,6 +15,9 @@ CORE COMMANDS
- [onleave] command, executing something as soon as the current procedure
returns. With no arguments it returns the script set, with one appends
the onleave script. There should be a way to reset.
+- [proc] without arguments may return a list of all the procedures
+ (no C commands). While with a single argument (the name of a proc)
+ may return [list $args $statics $body].
OTHER COMMANDS NOT IN TCL BUT THAT SHOULD BE IN JIM
@@ -50,7 +53,9 @@ ERROR MESSAGES
REFERENCES SYSTEM
-- All ok for now, already done things deleted from the TODO list.
+- Unify ref/getref/setref/collect/finalize under an unique [ref] command.
+- Add a 'call' attribute to references in order to call a given procedure
+ if the name of a reference is used as command name.
API FUNCTIONS TO EXPORT
diff --git a/jim.c b/jim.c
index 109b667..b553169 100644
--- a/jim.c
+++ b/jim.c
@@ -1,7 +1,7 @@
/* Jim - A small embeddable Tcl interpreter
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
*
- * $Id: jim.c,v 1.120 2005/03/18 11:39:10 antirez Exp $
+ * $Id: jim.c,v 1.121 2005/03/19 19:12:30 antirez Exp $
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -3723,6 +3723,29 @@ Jim_Reference *Jim_GetReference(Jim_Interp *interp, Jim_Obj *objPtr)
return objPtr->internalRep.refValue.refPtr;
}
+int Jim_SetFinalizer(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *cmdNamePtr)
+{
+ Jim_Reference *refPtr;
+
+ if ((refPtr = Jim_GetReference(interp, objPtr)) == NULL)
+ return JIM_ERR;
+ Jim_IncrRefCount(cmdNamePtr);
+ if (refPtr->finalizerCmdNamePtr)
+ Jim_DecrRefCount(interp, refPtr->finalizerCmdNamePtr);
+ refPtr->finalizerCmdNamePtr = cmdNamePtr;
+ return JIM_OK;
+}
+
+int Jim_GetFinalizer(Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj **cmdNamePtrPtr)
+{
+ Jim_Reference *refPtr;
+
+ if ((refPtr = Jim_GetReference(interp, objPtr)) == NULL)
+ return JIM_ERR;
+ *cmdNamePtrPtr = refPtr->finalizerCmdNamePtr;
+ return JIM_OK;
+}
+
/* -----------------------------------------------------------------------------
* References Garbage Collection
* ---------------------------------------------------------------------------*/
@@ -7463,6 +7486,8 @@ void JimRegisterCoreApi(Jim_Interp *interp)
JIM_REGISTER_API(CompareStringImmediate);
JIM_REGISTER_API(NewReference);
JIM_REGISTER_API(GetReference);
+ JIM_REGISTER_API(SetFinalizer);
+ JIM_REGISTER_API(GetFinalizer);
JIM_REGISTER_API(CreateInterp);
JIM_REGISTER_API(FreeInterp);
JIM_REGISTER_API(CreateCommand);
@@ -9528,9 +9553,31 @@ static int Jim_CollectCoreCommand(Jim_Interp *interp, int argc,
return JIM_OK;
}
-/* TODO */
/* [finalize] reference ?newValue? */
-/* [references] (list of all the references/finalizers) */
+static int Jim_FinalizeCoreCommand(Jim_Interp *interp, int argc,
+ Jim_Obj *const *argv)
+{
+ if (argc != 2 && argc != 3) {
+ Jim_WrongNumArgs(interp, 1, argv, "reference ?finalizerProc?");
+ return JIM_ERR;
+ }
+ if (argc == 2) {
+ Jim_Obj *cmdNamePtr;
+
+ if (Jim_GetFinalizer(interp, argv[1], &cmdNamePtr) != JIM_OK)
+ return JIM_ERR;
+ if (cmdNamePtr != NULL) /* otherwise the null string is returned. */
+ Jim_SetResult(interp, cmdNamePtr);
+ } else {
+ if (Jim_SetFinalizer(interp, argv[1], argv[2]) != JIM_OK)
+ return JIM_ERR;
+ Jim_SetResult(interp, argv[2]);
+ }
+ return JIM_OK;
+}
+
+/* TODO */
+/* [info references] (list of all the references/finalizers) */
/* [rename] */
static int Jim_RenameCoreCommand(Jim_Interp *interp, int argc,
@@ -10026,6 +10073,7 @@ static struct {
{"ref", Jim_RefCoreCommand},
{"getref", Jim_GetrefCoreCommand},
{"setref", Jim_SetrefCoreCommand},
+ {"finalize", Jim_FinalizeCoreCommand},
{"collect", Jim_CollectCoreCommand},
{"rename", Jim_RenameCoreCommand},
{"dict", Jim_DictCoreCommand},
@@ -10158,7 +10206,7 @@ int Jim_InteractivePrompt(Jim_Interp *interp)
printf("Welcome to Jim version %d.%d, "
"Copyright (c) 2005 Salvatore Sanfilippo\n",
JIM_VERSION / 100, JIM_VERSION % 100);
- printf("CVS ID: $Id: jim.c,v 1.120 2005/03/18 11:39:10 antirez Exp $\n");
+ printf("CVS ID: $Id: jim.c,v 1.121 2005/03/19 19:12:30 antirez Exp $\n");
Jim_SetVariableStrWithStr(interp, "jim_interactive", "1");
while (1) {
char buf[1024];
diff --git a/jim.h b/jim.h
index 1e2b8d0..f74e140 100644
--- a/jim.h
+++ b/jim.h
@@ -1,7 +1,7 @@
/* Jim - A small embeddable Tcl interpreter
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
*
- * $Id: jim.h,v 1.60 2005/03/17 13:06:27 antirez Exp $
+ * $Id: jim.h,v 1.61 2005/03/19 19:12:30 antirez Exp $
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -589,6 +589,8 @@ JIM_STATIC Jim_Obj * JIM_API(Jim_NewReference) (Jim_Interp *interp,
Jim_Obj *objPtr, Jim_Obj *tagPtr, Jim_Obj *cmdNamePtr);
JIM_STATIC Jim_Reference * JIM_API(Jim_GetReference) (Jim_Interp *interp,
Jim_Obj *objPtr);
+JIM_STATIC int JIM_API(Jim_SetFinalizer) (Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj *cmdNamePtr);
+JIM_STATIC int JIM_API(Jim_GetFinalizer) (Jim_Interp *interp, Jim_Obj *objPtr, Jim_Obj **cmdNamePtrPtr);
/* interpreter */
JIM_STATIC Jim_Interp * JIM_API(Jim_CreateInterp) (void);
@@ -782,6 +784,8 @@ static void Jim_InitExtension(Jim_Interp *interp, const char *version)
JIM_GET_API(CompareStringImmediate);
JIM_GET_API(NewReference);
JIM_GET_API(GetReference);
+ JIM_GET_API(SetFinalizer);
+ JIM_GET_API(GetFinalizer);
JIM_GET_API(CreateInterp);
JIM_GET_API(FreeInterp);
JIM_GET_API(CreateCommand);