From a1f0a8f4a4d258ca3636e9e8c8d67146f9af6ee4 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 31 Mar 2000 00:51:37 +0000 Subject: Don't use the object call interface in Tk 8.0 -- the EvalObj* API changed from 8.0 to 8.1 and I see no big reason to use objects in 8.0. At least now it works again with all versions from 8.0 - 8.3. --- Modules/_tkinter.c | 205 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 164 insertions(+), 41 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index fa8d589..47edf62 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -425,47 +425,6 @@ Split(list) return v; } -static Tcl_Obj* -AsObj(value) - PyObject *value; -{ - Tcl_Obj *result; - - if (PyString_Check(value)) - return Tcl_NewStringObj(PyString_AS_STRING(value), - PyString_GET_SIZE(value)); - else if (PyInt_Check(value)) - return Tcl_NewLongObj(PyInt_AS_LONG(value)); - else if (PyFloat_Check(value)) - return Tcl_NewDoubleObj(PyFloat_AS_DOUBLE(value)); - else if (PyTuple_Check(value)) { - Tcl_Obj **argv = (Tcl_Obj**) - ckalloc(PyTuple_Size(value)*sizeof(Tcl_Obj*)); - int i; - if(!argv) - return 0; - for(i=0;i= 8001 +#define USING_OBJECTS +#endif + +#ifdef USING_OBJECTS + +static Tcl_Obj* +AsObj(value) + PyObject *value; +{ + Tcl_Obj *result; + + if (PyString_Check(value)) + return Tcl_NewStringObj(PyString_AS_STRING(value), + PyString_GET_SIZE(value)); + else if (PyInt_Check(value)) + return Tcl_NewLongObj(PyInt_AS_LONG(value)); + else if (PyFloat_Check(value)) + return Tcl_NewDoubleObj(PyFloat_AS_DOUBLE(value)); + else if (PyTuple_Check(value)) { + Tcl_Obj **argv = (Tcl_Obj**) + ckalloc(PyTuple_Size(value)*sizeof(Tcl_Obj*)); + int i; + if(!argv) + return 0; + for(i=0;i ARGSZ) { + argv = (char **)ckalloc(argc * sizeof(char *)); + fv = (int *)ckalloc(argc * sizeof(int)); + if (argv == NULL || fv == NULL) { + PyErr_NoMemory(); + goto finally; + } + } + + for (i = 0; i < argc; i++) { + PyObject *v = PyTuple_GetItem(args, i); + if (PyTuple_Check(v)) { + fv[i] = 1; + if (!(argv[i] = Merge(v))) + goto finally; + } + else if (v == Py_None) { + argc = i; + break; + } + else { + fv[i] = 0; + argv[i] = AsString(v, tmp); + } + } + } + /* End code copied from Merge() */ + + /* All this to avoid a call to Tcl_Merge() and the corresponding call + to Tcl_SplitList() inside Tcl_Eval()... It can save a bundle! */ + if (Py_VerboseFlag >= 2) { + for (i = 0; i < argc; i++) + PySys_WriteStderr("%s ", argv[i]); + } + ENTER_TCL + info.proc = NULL; + if (argc < 1 || + !Tcl_GetCommandInfo(interp, argv[0], &info) || + info.proc == NULL) + { + char *cmd; + cmd = Tcl_Merge(argc, argv); + i = Tcl_Eval(interp, cmd); + ckfree(cmd); + } + else { + Tcl_ResetResult(interp); + i = (*info.proc)(info.clientData, interp, argc, argv); + } + ENTER_OVERLAP + if (info.proc == NULL && Py_VerboseFlag >= 2) + PySys_WriteStderr("... use TclEval "); + if (i == TCL_ERROR) { + if (Py_VerboseFlag >= 2) + PySys_WriteStderr("... error: '%s'\n", + interp->result); + Tkinter_Error(self); + } + else { + if (Py_VerboseFlag >= 2) + PySys_WriteStderr("-> '%s'\n", interp->result); + res = PyString_FromString(interp->result); + } + LEAVE_OVERLAP_TCL + + /* Copied from Merge() again */ + finally: + for (i = 0; i < argc; i++) + if (fv[i]) { + ckfree(argv[i]); + } + if (argv != argvStore) + ckfree(FREECAST argv); + if (fv != fvStore) + ckfree(FREECAST fv); + + Py_DECREF(tmp); + return res; +} + +#endif /* !USING_OBJECTS */ static PyObject * Tkapp_GlobalCall(self, args) -- cgit v0.12