diff options
author | antirez <antirez> | 2005-03-19 19:12:30 +0000 |
---|---|---|
committer | antirez <antirez> | 2005-03-19 19:12:30 +0000 |
commit | 4212adfb46da94fa2851dd688889578127044de6 (patch) | |
tree | b66f37e17ea037ff1ca704ca384027f301bcbabb | |
parent | 32cc4bd7be3bf8045943e592691b538153713719 (diff) | |
download | jimtcl-4212adfb46da94fa2851dd688889578127044de6.zip jimtcl-4212adfb46da94fa2851dd688889578127044de6.tar.gz jimtcl-4212adfb46da94fa2851dd688889578127044de6.tar.bz2 |
[finalize] command and relative C API added (SS).
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | TODO | 7 | ||||
-rw-r--r-- | jim.c | 56 | ||||
-rw-r--r-- | jim.h | 6 |
5 files changed, 72 insertions, 6 deletions
@@ -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. @@ -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 @@ -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 @@ -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]; @@ -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); |