Index: generic/xotcl.c =================================================================== diff -u -r57fe47fb1da11243f88679d61d3b3b172258525a -r44b916888bf0d89743347039b35ede09e7d9b945 --- generic/xotcl.c (.../xotcl.c) (revision 57fe47fb1da11243f88679d61d3b3b172258525a) +++ generic/xotcl.c (.../xotcl.c) (revision 44b916888bf0d89743347039b35ede09e7d9b945) @@ -149,13 +149,31 @@ ClientData clientData; } aliasCmdClientData; +#define PARSE_CONTEXT_PREALLOC 15 typedef struct { - ClientData clientData[10]; - Tcl_Obj *objv[10]; + ClientData *clientData; + Tcl_Obj **objv; + Tcl_Obj **full_objv; + ClientData clientData_[PARSE_CONTEXT_PREALLOC]; + Tcl_Obj *objv_[PARSE_CONTEXT_PREALLOC+1]; int lastobjc; int objc; } parseContext; +void parseContextInit(parseContext *pc, int objc, Tcl_Obj *procName) { + if (objc < PARSE_CONTEXT_PREALLOC) { + memset(pc, 0, sizeof(parseContext)); + pc->objv = &pc->objv_[1]; + pc->full_objv = &pc->objv_[0]; + pc->clientData = &pc->clientData_[0]; + /*memset(pc->clientData, 0, sizeof(ClientData)*(objc)); + memset(pc->objv+1, 0, sizeof(Tcl_Obj*)*(objc));*/ + pc->objv_[0] = procName; + } else { + Tcl_Panic("objc to large, not implemented", NULL); + } +} + typedef argDefinition interfaceDefinition[10]; XOTCLINLINE static int DoDispatch(ClientData clientData, Tcl_Interp *interp, int objc, @@ -5421,29 +5439,20 @@ { parseContext pc; int rc; - Tcl_Obj *ov[100]; /* TODO: maybe make me dynamic, or better, put procName on ov[0] in pc */ rc = canonicalNonpositionalArgs(&pc, interp, objc, objv); if (rc == TCL_CONTINUE) { result = PushProcCallFrame(cp, interp, objc, objv, /*isLambda*/ 0); } else { - int i, j; - ov[0] = objv[0]; - for (i=0, j=1; i < pc.objc+1; i++) { - if (pc.objv[i]) { - ov[j++] = pc.objv[i]; - } - } - /*fprintf(stderr, "pc.objc = %d provided objc %d\n",pc.objc+1,objc);*/ #if 0 for(j=0; jslotObj = NULL; nonposArg->ifd = interface; + /*fprintf(stderr, "ifsize = %d\n",ifPtr-interface);*/ *parsedIfPtr = interface; /* TODO only for CANONICAL_ARGS */ Tcl_SetHashValue(hPtr, (ClientData)nonposArg); @@ -9488,12 +9498,12 @@ static int parseObjv(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], Tcl_Obj *procName, - argDefinition CONST *ifdPtr, parseContext *pc) { + argDefinition CONST *ifdPtr, int ifdSize, parseContext *pc) { int i, o, args = 0, flagCount = 0, nrReq = 0, nrOpt = 0, varArgs = 0, dashdash = 0; /* todo benchmark with and without CONST */ argDefinition CONST *aPtr, *bPtr; - memset(pc, 0, sizeof(parseContext)); + parseContextInit(pc, ifdSize, procName); #if defined(PARSE_TRACE) fprintf(stderr, "BEGIN (%d) [0]%s ",objc, ObjStr(procName)); @@ -12383,17 +12393,13 @@ Tcl_HashTable *nonposArgsTable = class ? class->nonposArgsTable : object->nonposArgsTable; char *procName = (char *)GetSelfProc(interp); XOTclNonposArgs *nonposArgs = NonposArgsGet(nonposArgsTable, procName); - Tcl_Obj *proc; argDefinition CONST *aPtr; - parseContext pc; int i, rc; if (!nonposArgs) {return TCL_CONTINUE;} - proc = Tcl_NewStringObj(procName, -1); - INCR_REF_COUNT(proc); - rc = parseObjv(interp, objc, objv, proc, nonposArgs->ifd, pcPtr); - DECR_REF_COUNT(proc); + /* ifdSize is per construction the same as objc */ + rc = parseObjv(interp, objc, objv, objv[0], nonposArgs->ifd, objc, pcPtr); if (rc != TCL_OK) return rc; @@ -12467,7 +12473,7 @@ /*if (!nonposArgs) {return TCL_OK;}*/ INCR_REF_COUNT(proc); - rc = parseObjv(interp, objc, objv, proc, nonposArgs->ifd, &pc); + rc = parseObjv(interp, objc, objv, proc, nonposArgs->ifd, objc, &pc); DECR_REF_COUNT(proc); if (rc != TCL_OK)