Index: generic/xotcl.c =================================================================== diff -u -re5b7b9261b0de87bf7a45ff7416ecd967037fa0b -r04e90dc06f5416f4f9d44c34bac8b9d28ac1b57b --- generic/xotcl.c (.../xotcl.c) (revision e5b7b9261b0de87bf7a45ff7416ecd967037fa0b) +++ generic/xotcl.c (.../xotcl.c) (revision 04e90dc06f5416f4f9d44c34bac8b9d28ac1b57b) @@ -210,20 +210,20 @@ } static void parseContextExtendObjv(parseContext *pcPtr, int from, int elts, Tcl_Obj *CONST source[]) { - int requiredSize = from + elts; + int requiredSize = from + elts + 1; /*XOTclPrintObjv("BEFORE: ", pcPtr->objc, pcPtr->full_objv);*/ - if (requiredSize > PARSE_CONTEXT_PREALLOC) { + if (requiredSize >= PARSE_CONTEXT_PREALLOC) { if (pcPtr->objv == &pcPtr->objv_static[1]) { /* realloc from preallocated memory */ - pcPtr->full_objv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj*) * (requiredSize+1)); + pcPtr->full_objv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj*) * requiredSize); memcpy(pcPtr->full_objv, &pcPtr->objv_static[0], sizeof(Tcl_Obj*) * PARSE_CONTEXT_PREALLOC); - /*fprintf(stderr, "alloc %d\n", requiredSize);*/ + /*fprintf(stderr, "alloc %d new objv=%p pcPtr %p\n", requiredSize, pcPtr->full_objv, pcPtr);*/ } else { /* realloc from mallocated memory */ - pcPtr->full_objv = (Tcl_Obj **)ckrealloc((char *)pcPtr->full_objv, sizeof(Tcl_Obj*) * (requiredSize)); - /*fprintf(stderr, "realloc %d\n", requiredSize);*/ + pcPtr->full_objv = (Tcl_Obj **)ckrealloc((char *)pcPtr->full_objv, sizeof(Tcl_Obj*) * requiredSize); + /*fprintf(stderr, "realloc %d new objv=%p pcPtr %p\n", requiredSize, pcPtr->full_objv, pcPtr);*/ } pcPtr->objv = &pcPtr->full_objv[1]; } @@ -246,11 +246,12 @@ /* objv can be separately extended */ if (pcPtr->objv != &pcPtr->objv_static[1]) { - /*fprintf(stderr, "parseContextRelease free %p %p\n", pcPtr->full_objv, pcPtr->clientData);*/ + /*fprintf(stderr, "parseContextRelease %p free %p %p\n", pcPtr, pcPtr->full_objv, pcPtr->clientData);*/ ckfree((char *)pcPtr->full_objv); } /* if the parameter definition was extended, both clientData and flags are extended */ if (pcPtr->clientData != &pcPtr->clientData_static[0]) { + /*fprintf(stderr, "free clientdata and flags\n");*/ ckfree((char *)pcPtr->clientData); ckfree((char *)pcPtr->flags); } @@ -3526,10 +3527,9 @@ XOTclClass *cl; XOTclClasses *sc; - /* - fprintf(stderr, "startCl = %s, opt %p, isMixin %d\n", - ObjStr(startCl->object.cmdName), startCl->opt, isMixin); - */ + + /*fprintf(stderr, "startCl = %p %s, opt %p, isMixin %d\n", + startCl, className(startCl), startCl->opt, isMixin);*/ /* * the startCl is a per class mixin, add it to the result set @@ -3542,8 +3542,16 @@ * check all subclasses of startCl for mixins */ for (sc = startCl->sub; sc; sc = sc->nextPtr) { - rc = getAllClassMixinsOf(interp, destTable, sc->cl, isMixin, appendResult, pattern, matchObject); - if (rc) {return rc;} + if (sc->cl != startCl) { + rc = getAllClassMixinsOf(interp, destTable, sc->cl, isMixin, appendResult, pattern, matchObject); + if (rc) {return rc;} + } else { + /* TODO: sanity check; it seems that we can create via + __default_superclass a class which has itself als + subclass */ + fprintf(stderr, "... STRANGE %p is subclass of %p %s, sub %p\n", sc->cl, + startCl, className(startCl), startCl->sub); + } } } @@ -3564,6 +3572,7 @@ rc = addToResultSet(interp, destTable, &cl->object, &new, appendResult, pattern, matchObject); if (rc == 1) {return rc;} if (new) { + fprintf(stderr, "... new\n"); rc = getAllClassMixinsOf(interp, destTable, cl, 1, appendResult, pattern, matchObject); if (rc) {return rc;} } @@ -10841,7 +10850,7 @@ Tcl_Obj *withDefault, int withEarlybinding, Tcl_Obj *withMethodprefix, int withObjscope, Tcl_Obj *withOnerror, int withVerbose, Tcl_Obj *target, int nobjc, Tcl_Obj *CONST nobjv[]) { - forwardCmdClientData *tcd; + forwardCmdClientData *tcd = NULL; int result; result = forwardProcessOptions(interp, method,