summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2006-10-23 21:20:47 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2006-10-23 21:20:47 (GMT)
commitbe68513a3f06cf74f2b112128b14a9a5ddbf9211 (patch)
tree2a589bdaa388f4964f778b75fd98b81db67671c0
parentc7fd15ef38b4b22262725f32faa136c708645726 (diff)
downloadtcl-be68513a3f06cf74f2b112128b14a9a5ddbf9211.zip
tcl-be68513a3f06cf74f2b112128b14a9a5ddbf9211.tar.gz
tcl-be68513a3f06cf74f2b112128b14a9a5ddbf9211.tar.bz2
Rewritten to not pass function pointers through ClientData directly; some
compilers/architectures do not like it at all.
-rw-r--r--generic/tclOO.c75
1 files changed, 53 insertions, 22 deletions
diff --git a/generic/tclOO.c b/generic/tclOO.c
index 7556a0e..498d923 100644
--- a/generic/tclOO.c
+++ b/generic/tclOO.c
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclOO.c,v 1.1.2.66 2006/10/23 13:20:59 dkf Exp $
+ * RCS: @(#) $Id: tclOO.c,v 1.1.2.67 2006/10/23 21:20:47 dkf Exp $
*/
#include "tclInt.h"
@@ -43,6 +43,16 @@ static const struct {
};
/*
+ * Structure containing definition information about class methods.
+ */
+
+typedef struct DeclaredClassMethod {
+ const char *name; /* Name of the method in question. */
+ int isPublic; /* Whether the method is public by default. */
+ Tcl_MethodCallProc callProc;/* How to call the method. */
+} DeclaredClassMethod;
+
+/*
* What sort of size of things we like to allocate.
*/
@@ -59,8 +69,7 @@ static Method * CloneClassMethod(Tcl_Interp *interp, Class *clsPtr,
static Method * CloneObjectMethod(Tcl_Interp *interp, Object *oPtr,
Method *mPtr, Tcl_Obj *namePtr);
static void DeclareClassMethod(Tcl_Interp *interp, Class *clsPtr,
- const char *name, int isPublic,
- Tcl_MethodCallProc callProc);
+ const DeclaredClassMethod *dcm);
static void KillFoundation(ClientData clientData,
Tcl_Interp *interp);
static int ObjectCmd(Object *oPtr, Tcl_Interp *interp, int objc,
@@ -82,7 +91,7 @@ static int PrivateObjectCmd(ClientData clientData,
Tcl_Interp *interp, int objc,
Tcl_Obj *const *objv);
-static int SimpleInvoke(ClientData clientData,
+static int DeclaredClassMethodInvoke(ClientData clientData,
Tcl_Interp *interp, Tcl_ObjectContext context,
int objc, Tcl_Obj *const *objv);
static int InvokeProcedureMethod(ClientData clientData,
@@ -143,7 +152,30 @@ static const Tcl_MethodType fwdMethodType = {
};
static const Tcl_MethodType coreMethodType = {
TCL_OO_METHOD_VERSION_CURRENT, "core method",
- SimpleInvoke, NULL, NULL
+ DeclaredClassMethodInvoke, NULL, NULL
+};
+
+/*
+ * Methods in the oo::object class.
+ */
+
+static const DeclaredClassMethod objMethods[] = {
+ {"destroy", 1, ObjectDestroy},
+ {"eval", 0, ObjectEval},
+ {"unknown", 0, ObjectUnknown},
+ {"variable", 0, ObjectLinkVar},
+ {"varname", 0, ObjectVarName},
+ {NULL, 0, NULL}
+};
+
+/*
+ * Additional methods in the oo::class class.
+ */
+
+static const DeclaredClassMethod clsMethods[] = {
+ {"create", 1, ClassCreate},
+ {"new", 1, ClassNew},
+ {NULL, 0, NULL}
};
/*
@@ -227,13 +259,12 @@ TclOOInit(
* Basic method declarations for the core classes.
*/
- DeclareClassMethod(interp, fPtr->objectCls, "destroy", 1, ObjectDestroy);
- DeclareClassMethod(interp, fPtr->objectCls, "eval", 0, ObjectEval);
- DeclareClassMethod(interp, fPtr->objectCls, "unknown", 0, ObjectUnknown);
- DeclareClassMethod(interp, fPtr->objectCls, "variable", 0, ObjectLinkVar);
- DeclareClassMethod(interp, fPtr->objectCls, "varname", 0, ObjectVarName);
- DeclareClassMethod(interp, fPtr->classCls, "create", 1, ClassCreate);
- DeclareClassMethod(interp, fPtr->classCls, "new", 1, ClassNew);
+ for (i=0 ; objMethods[i].name ; i++) {
+ DeclareClassMethod(interp, fPtr->objectCls, &objMethods[i]);
+ }
+ for (i=0 ; clsMethods[i].name ; i++) {
+ DeclareClassMethod(interp, fPtr->classCls, &clsMethods[i]);
+ }
/*
* Finish setting up the class of classes.
@@ -1534,24 +1565,24 @@ static void
DeclareClassMethod(
Tcl_Interp *interp,
Class *clsPtr, /* Class to attach the method to. */
- const char *name, /* Name of the method. */
- int isPublic, /* Whether the method is public. */
- Tcl_MethodCallProc callPtr)
- /* Method implementation function. */
+ const DeclaredClassMethod *dcm)
+ /* Name of the method, whether it is public,
+ * and the function to implement it. */
{
Tcl_Obj *namePtr;
- TclNewStringObj(namePtr, name, strlen(name));
+ TclNewStringObj(namePtr, dcm->name, strlen(dcm->name));
Tcl_IncrRefCount(namePtr);
Tcl_NewClassMethod(interp, (Tcl_Class) clsPtr, namePtr,
- (isPublic ? PUBLIC_METHOD : 0), &coreMethodType, callPtr);
+ (dcm->isPublic ? PUBLIC_METHOD : 0), &coreMethodType,
+ (ClientData) dcm);
TclDecrRefCount(namePtr);
}
/*
* ----------------------------------------------------------------------
*
- * SimpleInvoke --
+ * DeclaredClassMethodInvoke --
*
* How to invoke a simple method.
*
@@ -1559,7 +1590,7 @@ DeclareClassMethod(
*/
static int
-SimpleInvoke(
+DeclaredClassMethodInvoke(
ClientData clientData, /* Pointer to function that implements the
* method. */
Tcl_Interp *interp,
@@ -1567,9 +1598,9 @@ SimpleInvoke(
int objc, /* Number of arguments. */
Tcl_Obj *const *objv) /* Arguments as actually seen. */
{
- Tcl_MethodCallProc callPtr = clientData;
+ const DeclaredClassMethod *dcm = clientData;
- return (*callPtr)(NULL, interp, context, objc, objv);
+ return (dcm->callProc)(NULL, interp, context, objc, objv);
}
/*