Index: ChangeLog =================================================================== diff -u -r321a21cbb0beec854bfc651e167c32ded2707a3a -rfb1840d39d6069f7b26e0d982448ef2602782e9e --- ChangeLog (.../ChangeLog) (revision 321a21cbb0beec854bfc651e167c32ded2707a3a) +++ ChangeLog (.../ChangeLog) (revision fb1840d39d6069f7b26e0d982448ef2602782e9e) @@ -62,6 +62,12 @@ Meta C -superclass O -parameter {a {b -default ""} {c -default 1}} C c1 ;# c1 has no no default value for "a", before it had one ====== +2009-07-06 + - parse non-pos-args for procs/instprocs into new argument definition structure + - using new parseObjv for calling procs and instproc when nonpos-args are used + (invocation time went from 9.08ms to 5.95ms) + - TODO: complete implementation for regression test, base introspection/copy etc. + on new structures 2009-07-04 - removed compatibility for versions before Tcl 8.4 (was not tested anyhow) Index: generic/gentclAPI.tcl =================================================================== diff -u -r321a21cbb0beec854bfc651e167c32ded2707a3a -rfb1840d39d6069f7b26e0d982448ef2602782e9e --- generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision 321a21cbb0beec854bfc651e167c32ded2707a3a) +++ generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision fb1840d39d6069f7b26e0d982448ef2602782e9e) @@ -192,7 +192,7 @@ static int $d(stub)(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { $intro - if (parseObjv(interp, objc, objv, $d(idx), &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[$d(idx)].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { $cDefs @@ -209,14 +209,18 @@ typedef struct { char *methodName; Tcl_ObjCmdProc *proc; - CONST interfaceDefinition ifd; + /*CONST interfaceDefinition ifd;*/ + argDefinition ifd[10]; } methodDefinition; -static int parseObjv(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], - int idx, parseContext *pc); +static int parseObjv(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int start, + argDefinition CONST *ifdPtr, parseContext *pc); static int getMatchObject(Tcl_Interp *interp, Tcl_Obj *patternObj, Tcl_Obj *origObj, XOTclObject **matchObject, char **pattern); + +/* just to define the symbol */ +static methodDefinition method_definitions[]; } set namespaces [list] Index: generic/tclAPI.h =================================================================== diff -u -r321a21cbb0beec854bfc651e167c32ded2707a3a -rfb1840d39d6069f7b26e0d982448ef2602782e9e --- generic/tclAPI.h (.../tclAPI.h) (revision 321a21cbb0beec854bfc651e167c32ded2707a3a) +++ generic/tclAPI.h (.../tclAPI.h) (revision fb1840d39d6069f7b26e0d982448ef2602782e9e) @@ -15,14 +15,18 @@ typedef struct { char *methodName; Tcl_ObjCmdProc *proc; - CONST interfaceDefinition ifd; + /*CONST interfaceDefinition ifd;*/ + argDefinition ifd[10]; } methodDefinition; -static int parseObjv(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], - int idx, parseContext *pc); +static int parseObjv(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int start, + argDefinition CONST *ifdPtr, parseContext *pc); static int getMatchObject(Tcl_Interp *interp, Tcl_Obj *patternObj, Tcl_Obj *origObj, XOTclObject **matchObject, char **pattern); + +/* just to define the symbol */ +static methodDefinition method_definitions[]; char *method_command_namespace_names[] = { "::xotcl::cmd::ObjectInfo", @@ -329,7 +333,7 @@ XOTclCheckBooleanArgsStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclCheckBooleanArgsIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCheckBooleanArgsIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *name = (char *)pc.clientData[0]; @@ -344,7 +348,7 @@ XOTclCheckRequiredArgsStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclCheckRequiredArgsIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCheckRequiredArgsIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *name = (char *)pc.clientData[0]; @@ -360,7 +364,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCAllocMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCAllocMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *name = (char *)pc.clientData[0]; @@ -375,7 +379,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCCreateMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCCreateMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *name = (char *)pc.clientData[0]; @@ -390,7 +394,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCDeallocMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCDeallocMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *object = (Tcl_Obj *)pc.clientData[0]; @@ -405,7 +409,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCInstFilterGuardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCInstFilterGuardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *filter = (char *)pc.clientData[0]; @@ -421,7 +425,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCInstForwardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCInstForwardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *method = (Tcl_Obj *)pc.clientData[0]; @@ -443,7 +447,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCInstMixinGuardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCInstMixinGuardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *mixin = (char *)pc.clientData[0]; @@ -459,7 +463,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCInstParametercmdMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCInstParametercmdMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *name = (char *)pc.clientData[0]; @@ -474,7 +478,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCInstProcMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCInstProcMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *name = (Tcl_Obj *)pc.clientData[0]; @@ -493,7 +497,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCInstProcMethodCIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCInstProcMethodCIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *name = (Tcl_Obj *)pc.clientData[0]; @@ -512,7 +516,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCInvariantsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCInvariantsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *invariantlist = (Tcl_Obj *)pc.clientData[0]; @@ -527,7 +531,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCNewMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCNewMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *withChildof = (XOTclObject *)pc.clientData[0]; @@ -542,7 +546,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCRecreateMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCRecreateMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *name = (Tcl_Obj *)pc.clientData[0]; @@ -557,7 +561,7 @@ parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); - if (parseObjv(interp, objc, objv, XOTclCUnknownMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclCUnknownMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *name = (char *)pc.clientData[0]; @@ -571,7 +575,7 @@ XOTclClassInfoHeritageMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoHeritageMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoHeritageMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -586,7 +590,7 @@ XOTclClassInfoInstancesMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstancesMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstancesMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -616,7 +620,7 @@ XOTclClassInfoInstargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstargsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstargsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -631,7 +635,7 @@ XOTclClassInfoInstbodyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstbodyMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstbodyMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -646,7 +650,7 @@ XOTclClassInfoInstcommandsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstcommandsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstcommandsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -661,7 +665,7 @@ XOTclClassInfoInstdefaultMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstdefaultMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstdefaultMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -678,7 +682,7 @@ XOTclClassInfoInstfilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstfilterMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstfilterMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -694,7 +698,7 @@ XOTclClassInfoInstfilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstfilterguardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstfilterguardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -709,7 +713,7 @@ XOTclClassInfoInstforwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstforwardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstforwardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -725,7 +729,7 @@ XOTclClassInfoInstinvarMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstinvarMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstinvarMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -739,7 +743,7 @@ XOTclClassInfoInstmixinMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstmixinMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstmixinMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -770,7 +774,7 @@ XOTclClassInfoInstmixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstmixinguardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstmixinguardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -785,7 +789,7 @@ XOTclClassInfoInstmixinofMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstmixinofMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstmixinofMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -815,7 +819,7 @@ XOTclClassInfoInstnonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstnonposargsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstnonposargsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -830,7 +834,7 @@ XOTclClassInfoInstparametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstparametercmdMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstparametercmdMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -845,7 +849,7 @@ XOTclClassInfoInstpostMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstpostMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstpostMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -860,7 +864,7 @@ XOTclClassInfoInstpreMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstpreMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstpreMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -875,7 +879,7 @@ XOTclClassInfoInstprocsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoInstprocsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoInstprocsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -890,7 +894,7 @@ XOTclClassInfoMixinofMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoMixinofMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoMixinofMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -920,7 +924,7 @@ XOTclClassInfoParameterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoParameterMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoParameterMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -934,7 +938,7 @@ XOTclClassInfoSlotsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoSlotsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoSlotsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -948,7 +952,7 @@ XOTclClassInfoSubclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoSubclassMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoSubclassMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -978,7 +982,7 @@ XOTclClassInfoSuperclassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclClassInfoSuperclassMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclClassInfoSuperclassMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclClass *class = (XOTclClass *)pc.clientData[0]; @@ -994,7 +998,7 @@ XOTclObjInfoArgsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoArgsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoArgsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1009,7 +1013,7 @@ XOTclObjInfoBodyMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoBodyMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoBodyMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1024,7 +1028,7 @@ XOTclObjInfoCheckMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoCheckMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoCheckMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1038,7 +1042,7 @@ XOTclObjInfoChildrenMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoChildrenMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoChildrenMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1053,7 +1057,7 @@ XOTclObjInfoClassMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoClassMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoClassMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1067,7 +1071,7 @@ XOTclObjInfoCommandsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoCommandsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoCommandsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1082,7 +1086,7 @@ XOTclObjInfoDefaultMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoDefaultMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoDefaultMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1099,7 +1103,7 @@ XOTclObjInfoFilterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoFilterMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoFilterMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1116,7 +1120,7 @@ XOTclObjInfoFilterguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoFilterguardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoFilterguardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1131,7 +1135,7 @@ XOTclObjInfoForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoForwardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoForwardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1147,7 +1151,7 @@ XOTclObjInfoHasnamespaceMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoHasnamespaceMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoHasnamespaceMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1161,7 +1165,7 @@ XOTclObjInfoInvarMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoInvarMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoInvarMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1175,7 +1179,7 @@ XOTclObjInfoMethodsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoMethodsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoMethodsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1194,7 +1198,7 @@ XOTclObjInfoMixinMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoMixinMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoMixinMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1225,7 +1229,7 @@ XOTclObjInfoMixinguardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoMixinguardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoMixinguardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1240,7 +1244,7 @@ XOTclObjInfoNonposargsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoNonposargsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoNonposargsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1255,7 +1259,7 @@ XOTclObjInfoParametercmdMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoParametercmdMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoParametercmdMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1270,7 +1274,7 @@ XOTclObjInfoParentMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoParentMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoParentMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1284,7 +1288,7 @@ XOTclObjInfoPostMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoPostMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoPostMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1299,7 +1303,7 @@ XOTclObjInfoPreMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoPreMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoPreMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1314,7 +1318,7 @@ XOTclObjInfoPrecedenceMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoPrecedenceMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoPrecedenceMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1330,7 +1334,7 @@ XOTclObjInfoProcsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoProcsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoProcsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1345,7 +1349,7 @@ XOTclObjInfoSlotObjectsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoSlotObjectsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoSlotObjectsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1360,7 +1364,7 @@ XOTclObjInfoVarsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclObjInfoVarsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclObjInfoVarsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1376,7 +1380,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOAutonameMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOAutonameMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { int withInstance = (int )pc.clientData[0]; @@ -1393,7 +1397,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOCheckMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOCheckMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *flag = (Tcl_Obj *)pc.clientData[0]; @@ -1408,7 +1412,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOCleanupMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOCleanupMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1423,7 +1427,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOConfigureMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOConfigureMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1438,7 +1442,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclODestroyMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclODestroyMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1453,7 +1457,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOExistsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOExistsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *var = (char *)pc.clientData[0]; @@ -1468,7 +1472,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOFilterGuardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOFilterGuardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *filter = (char *)pc.clientData[0]; @@ -1484,7 +1488,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOFilterSearchMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOFilterSearchMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *filter = (char *)pc.clientData[0]; @@ -1499,7 +1503,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOForwardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOForwardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *method = (Tcl_Obj *)pc.clientData[0]; @@ -1521,7 +1525,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOInstVarMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOInstVarMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1536,7 +1540,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOInvariantsMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOInvariantsMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *invariantlist = (Tcl_Obj *)pc.clientData[0]; @@ -1551,7 +1555,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOIsClassMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOIsClassMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *class = (Tcl_Obj *)pc.clientData[0]; @@ -1566,7 +1570,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOIsMetaClassMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOIsMetaClassMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *metaclass = (Tcl_Obj *)pc.clientData[0]; @@ -1581,7 +1585,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOIsMixinMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOIsMixinMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *class = (Tcl_Obj *)pc.clientData[0]; @@ -1596,7 +1600,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOIsObjectMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOIsObjectMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *object = (Tcl_Obj *)pc.clientData[0]; @@ -1611,7 +1615,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOIsTypeMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOIsTypeMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *class = (Tcl_Obj *)pc.clientData[0]; @@ -1626,7 +1630,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOMixinGuardMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOMixinGuardMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *mixin = (char *)pc.clientData[0]; @@ -1642,7 +1646,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclONextMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclONextMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1657,7 +1661,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclONoinitMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclONoinitMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1672,7 +1676,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOParametercmdMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOParametercmdMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *name = (char *)pc.clientData[0]; @@ -1687,7 +1691,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOProcMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOProcMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *name = (Tcl_Obj *)pc.clientData[0]; @@ -1706,7 +1710,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOProcSearchMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOProcSearchMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *name = (char *)pc.clientData[0]; @@ -1721,7 +1725,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclORequireNamespaceMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclORequireNamespaceMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1736,7 +1740,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOSetMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOSetMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { Tcl_Obj *var = (Tcl_Obj *)pc.clientData[0]; @@ -1752,7 +1756,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOSetvaluesMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOSetvaluesMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1767,7 +1771,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOUplevelMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOUplevelMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1782,7 +1786,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOUpvarMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOUpvarMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1797,7 +1801,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOVolatileMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOVolatileMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { @@ -1812,7 +1816,7 @@ parseContext pc; XOTclObject *obj = (XOTclObject *)clientData; if (!obj) return XOTclObjErrType(interp, objv[0], "Object"); - if (parseObjv(interp, objc, objv, XOTclOVwaitMethodIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclOVwaitMethodIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { char *varname = (char *)pc.clientData[0]; @@ -1826,7 +1830,7 @@ XOTclAliasCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclAliasCmdIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclAliasCmdIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1845,7 +1849,7 @@ XOTclMethodPropertyCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclMethodPropertyCmdIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclMethodPropertyCmdIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1863,7 +1867,7 @@ XOTclMyCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclMyCmdIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclMyCmdIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { int withLocal = (int )pc.clientData[0]; @@ -1878,7 +1882,7 @@ XOTclRelationCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclRelationCmdIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclRelationCmdIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; @@ -1894,7 +1898,7 @@ XOTclSetInstvarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; - if (parseObjv(interp, objc, objv, XOTclSetInstvarCmdIdx, &pc) != TCL_OK) { + if (parseObjv(interp, objc, objv, 1, &(method_definitions[XOTclSetInstvarCmdIdx].ifd[0]), &pc) != TCL_OK) { return TCL_ERROR; } else { XOTclObject *object = (XOTclObject *)pc.clientData[0]; Index: generic/xotcl.c =================================================================== diff -u -r321a21cbb0beec854bfc651e167c32ded2707a3a -rfb1840d39d6069f7b26e0d982448ef2602782e9e --- generic/xotcl.c (.../xotcl.c) (revision 321a21cbb0beec854bfc651e167c32ded2707a3a) +++ generic/xotcl.c (.../xotcl.c) (revision fb1840d39d6069f7b26e0d982448ef2602782e9e) @@ -155,16 +155,6 @@ int lastobjc; } parseContext; -typedef int (XOTclTypeConverter) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *obj, ClientData *clientData)); - -typedef struct { - char *name; - int required; - int nrargs; - XOTclTypeConverter *type; - char *defaultValue; -} argDefinition; - typedef argDefinition interfaceDefinition[10]; XOTCLINLINE static int DoDispatch(ClientData clientData, Tcl_Interp *interp, int objc, @@ -5808,6 +5798,8 @@ * Non Positional Args */ +static void argDefinitionsFree(argDefinition *argDefinitions, int nr); + static void NonposArgsDeleteHashEntry(Tcl_HashEntry *hPtr) { XOTclNonposArgs *nonposArg = (XOTclNonposArgs*) Tcl_GetHashValue(hPtr); @@ -5821,6 +5813,10 @@ if (nonposArg->slotObj) { DECR_REF_COUNT(nonposArg->slotObj); } + if (nonposArg->ifd) { + argDefinitionsFree(nonposArg->ifd, nonposArg->ifdSize); + } + MEM_COUNT_FREE("nonposArg", nonposArg); ckfree((char *) nonposArg); Tcl_DeleteHashEntry(hPtr); @@ -5931,9 +5927,16 @@ Tcl_AppendStringsToObj(resultBody, "::xotcl::initProcNS\n", (char *) NULL); #endif if (nonposArgs) { +#if 1 + /* just for now */ Tcl_AppendStringsToObj(resultBody, + "::xotcl::interpretNonpositionalArgs {*}$args\n", + (char *) NULL); +#else + Tcl_AppendStringsToObj(resultBody, "::xotcl::interpretNonpositionalArgs $args\n", (char *) NULL); +#endif } Tcl_AppendStringsToObj(resultBody, ObjStr(body), (char *) NULL); return resultBody; @@ -5952,86 +5955,225 @@ return result; } + +#define NEW_STRING(target,p,l) target = ckalloc(l+1); strncpy(target,p,l); *((target)+l) = '\0' + +static argDefinition *argDefinitionsNew(int nr) { + argDefinition *interface = NEW_ARRAY(argDefinition,nr+1); + memset(interface, 0, sizeof(argDefinition)*(nr+1)); + return interface; +} + +static void argDefinitionsFree(argDefinition *argDefinitions, int nr) { + int i; + argDefinition *ifPtr; + + /*fprintf(stderr,"freeing %d argDefinitions\n",nr);*/ + for (i=0, ifPtr=argDefinitions; iname,ifPtr->defaultValue);*/ + if (ifPtr->name) ckfree(ifPtr->name); + if (ifPtr->defaultValue) {DECR_REF_COUNT(ifPtr->defaultValue);} + } + FREE(argDefinition*,argDefinitions); +} + + +static XOTclTypeConverter convertToBoolean; +static XOTclTypeConverter convertToTclobj; + static int +parseNonposargsOption(Tcl_Interp *interp, char *option, int length, argDefinition *ifPtr) { + fprintf(stderr, "def %s, option '%s' (%d)\n",ifPtr->name,option,length); + if (strncmp(option,"switch",length) == 0) { + ifPtr->nrargs = 0; + ifPtr->converter = convertToBoolean; + assert(ifPtr->defaultValue == NULL); + ifPtr->defaultValue = Tcl_NewBooleanObj(0); + fprintf(stderr, "setting default for switch\n"); + INCR_REF_COUNT(ifPtr->defaultValue); + } else if (strncmp(option,"boolean",length) == 0) { + ifPtr->nrargs = 1; + ifPtr->converter = convertToBoolean; + } else if (strncmp(option,"required",length) == 0) { + ifPtr->required = 1; + } else { + fprintf(stderr, "**** unknown option: def %s, option '%s' (%d)\n",ifPtr->name,option,length); + } + return TCL_OK; +} + +static int +parseArgDefinition(Tcl_Interp *interp, char *procName, Tcl_Obj *arg, int isNpa, + Tcl_Obj **argObjPtr, argDefinition *ifPtr) { + Tcl_Obj **npav, *argObj; + char *argString, *argName; + int rc, npac, length, j, nameLength; + + rc = Tcl_ListObjGetElements(interp, arg, &npac, &npav); + if (rc != TCL_OK || npac < 1 || npac > 2) { + return XOTclVarErrMsg(interp, "wrong # of elements in non-positional args for method", + procName, " (should be 1 or 2 list elements): ", + ObjStr(arg), (char *) NULL); + } + + argString = ObjStr(npav[0]); + length = strlen(argString); + + if (isNpa && *argString != '-') { + return XOTclVarErrMsg(interp, "non-positional arg '", argString,"' of method ",procName, + " does not start with '-': ", argString, (char *) NULL); + } + + if (isNpa) { + argName = argString+1; + nameLength = length-1; + } else { + argName = argString; + nameLength = length; + ifPtr->required = 1; + } + + *argObjPtr = argObj = Tcl_NewListObj(0, NULL); + INCR_REF_COUNT(argObj); + /*fprintf(stderr, "... parsing '%s', name '%s' \n",ObjStr(arg),argName);*/ + + /* find the first ':' */ + for (j=0; jname,argString,j); + /* skip space */ + for (start = j+1; start0 && isspace((int)argString[end-1]); end--); + Tcl_ListObjAppendElement(interp, list, + nonposargType(interp, argString+start, end-start)); + parseNonposargsOption(interp, argString+start, end-start, ifPtr); + l++; + /* skip space */ + for (start = l; start0 && isspace((int)argString[end-1]); end--); + Tcl_ListObjAppendElement(interp, list, + nonposargType(interp, argString+start, end-start)); + parseNonposargsOption(interp, argString+start, end-start, ifPtr); + /* append the whole thing to the list */ + Tcl_ListObjAppendElement(interp, argObj, list); + /* fprintf(stderr," appending list npa='%s'\n", ObjStr(argObj));*/ + } else { + /* no ':', the whole arg is the name */ + NEW_STRING(ifPtr->name,argString,length); + Tcl_ListObjAppendElement(interp, argObj, Tcl_NewStringObj(argName, nameLength)); + Tcl_ListObjAppendElement(interp, argObj, Tcl_NewStringObj("", 0)); + } + /* check for default */ + if (npac == 2) { + Tcl_ListObjAppendElement(interp, argObj, npav[1]); + if (ifPtr->defaultValue) { + /* might be set by parseNonposargsOption */ + DECR_REF_COUNT(ifPtr->defaultValue); + } + ifPtr->defaultValue = Tcl_DuplicateObj(npav[1]); + INCR_REF_COUNT(ifPtr->defaultValue); + ifPtr->required = 0; /* well, not required during the call */ + } + + /*fprintf(stderr, "... argObj '%s'\n",ObjStr(argObj));*/ + /*fprintf(stderr,"%p %s ifPtr->name = '%s', nrargs %d, required %d, converter %p default %s\n",ifPtr,procName, + ifPtr->name,ifPtr->nrargs,ifPtr->required, ifPtr->converter, + ifPtr->defaultValue ? ObjStr(ifPtr->defaultValue) : "NONE");*/ + if (ifPtr->converter == NULL) { + ifPtr->converter = convertToTclobj; + } + return TCL_OK; +} + +static int parseNonposArgs(Tcl_Interp *interp, char *procName, Tcl_Obj *npArgs, Tcl_Obj *ordinaryArgs, Tcl_HashTable **nonposArgsTable, int *haveNonposArgs) { - int rc, nonposArgsDefc, npac; - Tcl_Obj **nonposArgsDefv; + int rc, i, nonposArgsDefc, ordinaryArgsDefc; + Tcl_Obj **nonposArgsDefv, **ordinaryArgsDefv, *argObj, *nonposArgsObj,*posArgObj; + argDefinition *interface, *ifPtr; rc = Tcl_ListObjGetElements(interp, npArgs, &nonposArgsDefc, &nonposArgsDefv); if (rc != TCL_OK) { return XOTclVarErrMsg(interp, "cannot break down non-positional args: ", ObjStr(npArgs), (char *) NULL); } - if (nonposArgsDefc > 0) { - int start, end, length, i, j, nw = 0; - char *arg; - Tcl_Obj *npaObj, **npav, *nonposArgsObj = Tcl_NewListObj(0, NULL); - Tcl_HashEntry *hPtr; + rc = Tcl_ListObjGetElements(interp, ordinaryArgs, &ordinaryArgsDefc, &ordinaryArgsDefv); + if (rc != TCL_OK) { + return XOTclVarErrMsg(interp, "cannot break down ordinary args: ", + ObjStr(ordinaryArgs), (char *) NULL); + } + ifPtr = interface = argDefinitionsNew(nonposArgsDefc+ordinaryArgsDefc); /* TODO: add free on error exits */ + + if (nonposArgsDefc > 0) { + nonposArgsObj = Tcl_NewListObj(0, NULL); INCR_REF_COUNT(nonposArgsObj); for (i=0; i < nonposArgsDefc; i++) { - rc = Tcl_ListObjGetElements(interp, nonposArgsDefv[i], &npac, &npav); - if (rc == TCL_ERROR || npac < 1 || npac > 2) { + + if ((rc = parseArgDefinition(interp, procName, nonposArgsDefv[i], 1, &argObj, ifPtr)) != TCL_OK) { DECR_REF_COUNT(nonposArgsObj); - return XOTclVarErrMsg(interp, "wrong # of elements in non-positional args ", - "(should be 1 or 2 list elements): ", - ObjStr(npArgs), (char *) NULL); + return rc; } - npaObj = Tcl_NewListObj(0, NULL); - arg = ObjStr(npav[0]); - if (arg[0] != '-') { - DECR_REF_COUNT(npaObj); - DECR_REF_COUNT(nonposArgsObj); - return XOTclVarErrMsg(interp, "non-positional args does not start with '-': ", - arg, " in: ", ObjStr(npArgs), (char *) NULL); - } - - length = strlen(arg); - for (j=0; j0 && isspace((int)arg[end-1]); end--); - Tcl_ListObjAppendElement(interp, list, - nonposargType(interp, arg+start, end-start)); - l++; - start = l; - while (start0 && isspace((int)arg[end-1]); end--); - Tcl_ListObjAppendElement(interp, list, - nonposargType(interp, arg+start, end-start)); - /* append the whole thing to the list */ - Tcl_ListObjAppendElement(interp, npaObj, list); - /* fprintf(stderr," appending list npa='%s'\n", ObjStr(npaObj));*/ - } else { - Tcl_ListObjAppendElement(interp, npaObj, Tcl_NewStringObj(arg+1, length)); - Tcl_ListObjAppendElement(interp, npaObj, Tcl_NewStringObj("", 0)); - /* fprintf(stderr," no colon npa='%s'\n", ObjStr(npaObj));*/ - } - if (npac == 2) { - Tcl_ListObjAppendElement(interp, npaObj, npav[1]); - /* fprintf(stderr," npac==2 ='%s'\n", ObjStr(npaObj)); */ - } - Tcl_ListObjAppendElement(interp, nonposArgsObj, npaObj); + *haveNonposArgs = 1; + Tcl_ListObjAppendElement(interp, nonposArgsObj, argObj); + ifPtr++; } + /* TODO: + for the time being, process the pos args only when we have nonpos args. + We have to benchmark the overhead and maybe we have to provide a switch + via e.g. configure to activate/deactivate pos args handling. + */ if (*haveNonposArgs) { + posArgObj = Tcl_NewListObj(0, NULL); + INCR_REF_COUNT(posArgObj); + + for (i=0; i< ordinaryArgsDefc; i++) { + Tcl_Obj **resultObjv; + int resultObjc; + + if ((rc = parseArgDefinition(interp, procName, ordinaryArgsDefv[i], 0, &argObj, ifPtr)) != TCL_OK) { + DECR_REF_COUNT(posArgObj); + return rc; + } + /* TODO: once we get all info from our interface definition, this should no be necessary */ + rc = Tcl_ListObjGetElements(interp, argObj, &resultObjc, &resultObjv); + /*fprintf(stderr, "ordinary args oc %d, rc %d '%s'\n",resultObjc,rc,ObjStr(argObj));*/ + if (resultObjc < 3) { + Tcl_ListObjAppendElement(interp, posArgObj, resultObjv[0]); + } else { + Tcl_Obj *pair = Tcl_NewListObj(0,NULL); + Tcl_ListObjAppendElement(interp, pair, resultObjv[0]); + Tcl_ListObjAppendElement(interp, pair, resultObjv[2]); + Tcl_ListObjAppendElement(interp, posArgObj, pair); + DECR_REF_COUNT(argObj); + } + ifPtr++; + } + } + + if (*haveNonposArgs) { XOTclNonposArgs *nonposArg; + Tcl_HashEntry *hPtr; + int nw = 0; if (*nonposArgsTable == NULL) { *nonposArgsTable = NonposArgsCreateTable(); @@ -6044,27 +6186,13 @@ nonposArg = (XOTclNonposArgs*)ckalloc(sizeof(XOTclNonposArgs)); nonposArg->slotObj = NULL; nonposArg->nonposArgs = nonposArgsObj; - { /* FIX AND REMOVE ME */ - int i, r2, ordinaryArgsDefc; - Tcl_Obj **ordinaryArgsDefv; - - r2 = Tcl_ListObjGetElements(interp, ordinaryArgs, - &ordinaryArgsDefc, &ordinaryArgsDefv); - if (r2 == TCL_OK) { - Tcl_Obj *objv[ordinaryArgsDefc]; - for (i=0; i< ordinaryArgsDefc; i++) { - objv[i] = Tcl_DuplicateObj(ordinaryArgsDefv[i]); - } - nonposArg->ordinaryArgs = Tcl_NewListObj(ordinaryArgsDefc, objv); - INCR_REF_COUNT(nonposArg->ordinaryArgs); - } else { - fprintf(stderr, "could not split ordinaryArgs\n"); - } - } + nonposArg->ifd = interface; + nonposArg->ifdSize = nonposArgsDefc+ordinaryArgsDefc; + nonposArg->ordinaryArgs = posArgObj; + Tcl_SetHashValue(hPtr, (ClientData)nonposArg); } else { - /* for strange reasons, we did not find nonpos-args, although we - have definitions */ + /* empty definitions */ DECR_REF_COUNT(nonposArgsObj); } } @@ -6415,10 +6543,13 @@ rc = Tcl_ListObjGetElements(interp, ordinaryArg, &defaultValueObjc, &defaultValueObjv); if (rc == TCL_OK) { - if (varsOnly && defaultValueObjc == 2) { + if (varsOnly || defaultValueObjc<2) { Tcl_ListObjAppendElement(interp, argList, defaultValueObjv[0]); } else { - Tcl_ListObjAppendElement(interp, argList, ordinaryArg); + Tcl_Obj *pair = Tcl_NewListObj(0,NULL); + Tcl_ListObjAppendElement(interp, pair, defaultValueObjv[0]); + Tcl_ListObjAppendElement(interp, pair, defaultValueObjv[1]); + Tcl_ListObjAppendElement(interp, argList, pair); } } } @@ -6480,8 +6611,11 @@ if (strncmp(body, "::xotcl::initProcNS\n", 20) == 0) body+=20; #endif + /* TODO REMOVE ME if (strncmp(body, "::xotcl::interpretNonpositionalArgs $args\n", 42) == 0) - body+=42; + body += 42;*/ + if (strncmp(body, "::xotcl::interpretNonpositionalArgs {*}$args\n", 45) == 0) + body += 45; return body; } @@ -9339,17 +9473,26 @@ *clientData = (ClientData)objPtr; return TCL_OK; } - static int convertToNothing(Tcl_Interp *interp, Tcl_Obj *objPtr, ClientData *clientData) { return TCL_OK; } +static int convertToBoolean(Tcl_Interp *interp, Tcl_Obj *objPtr, ClientData *clientData) { + Tcl_Obj *boolean = Tcl_DuplicateObj(objPtr); /*TODO: is duplication still needed?*/ + int result, bool; + INCR_REF_COUNT(boolean); + result = Tcl_GetBooleanFromObj(interp, boolean, &bool); + if (result == TCL_OK) { + *clientData = (ClientData)bool; + } + DECR_REF_COUNT(boolean); + return result; +} static int convertToClass(Tcl_Interp *interp, Tcl_Obj *objPtr, ClientData *clientData) { if (GetXOTclClassFromObj(interp, objPtr, (XOTclClass **)clientData, 0) == TCL_OK) return TCL_OK; return XOTclObjErrType(interp, objPtr, "class"); } - static int convertToObject(Tcl_Interp *interp, Tcl_Obj *objPtr, ClientData *clientData) { if (XOTclObjConvertObject(interp, objPtr, (XOTclObject **)clientData) == TCL_OK) return TCL_OK; @@ -9388,44 +9531,49 @@ #include "tclAPI.h" + +/* TODO: pass method name as a single argument, omit methodName from + objv; this will make nonposargs case simpler */ static int -parseObjv(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int idx, parseContext *pc) { - int i, o, args, flagCount = 0, nrReq = 0, nrOpt = 0, varArgs = 0; +parseObjv(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], int start, argDefinition CONST *ifdPtr, + parseContext *pc) { + int i, o, args = 0, flagCount = 0, nrReq = 0, nrOpt = 0, varArgs = 0; /* todo benchmark with and without CONST */ argDefinition CONST *aPtr, *bPtr; - interfaceDefinition CONST* ifdPtr = &method_definitions[idx].ifd; memset(pc, 0, sizeof(parseContext)); #if defined(PARSE_TRACE) - fprintf(stderr, "BEGIN (%d) [0]%s ",objc,ObjStr(objv[0])); - for (o=1; oname && oname,o);*/ + /*fprintf(stderr, "processing from %d to %d\n",start,objc-1);*/ + for (i=0, o=start, aPtr=ifdPtr; aPtr->name && oname,o);*/ if (*aPtr->name == '-') { - /* the interface defintion has switches,switches can be given in + /* the interface defintion has switches, which can be given in an arbitrary order */ int p, found; char *objStr; for (p = o; pname == '-'; bPtr ++) { if (strcmp(objStr,bPtr->name) == 0) { + /*fprintf(stderr, "... flag '%s' o=%d p=%d, objc=%d nrargs %d\n",objStr,o,p,objc,bPtr->nrargs);*/ + pc->objv[bPtr-ifdPtr] = objv[p]; if (bPtr->nrargs == 0) { - pc->clientData[bPtr-ifdPtr[0]] = (ClientData)1; + pc->clientData[bPtr-ifdPtr] = (ClientData)1; } else { /* we assume for now, nrargs is at most 1 */ o++; p++; - /*fprintf(stderr, "flag '%s' o=%d p=%d, objc=%d\n",objStr,o,p,objc);*/ if (otype)(interp, objv[o], &pc->clientData[bPtr-ifdPtr[0]]) != TCL_OK) { + /*fprintf(stderr, "setting cd[%d] = %s\n", bPtr-ifdPtr, ObjStr(objv[o]));*/ + if ((*aPtr->converter)(interp, objv[o], &pc->clientData[bPtr-ifdPtr]) != TCL_OK) { return TCL_ERROR; } } else { @@ -9455,37 +9603,39 @@ } else { if (aPtr->required) nrReq++; else nrOpt++; - - /*fprintf(stderr,"... arg %s req %d type %s try to set on %d: '%s'\n", - aPtr->name,aPtr->required,aPtr->type,i, ObjStr(objv[o]));*/ - if ((*aPtr->type)(interp, objv[o], &pc->clientData[i]) != TCL_OK) { + args ++; + /*fprintf(stderr,"... arg %s req %d converter %p try to set on %d: '%s'\n", + aPtr->name,aPtr->required,aPtr->converter,i, ObjStr(objv[o]));*/ + if ((*aPtr->converter)(interp, objv[o], &pc->clientData[i]) != TCL_OK) { return TCL_ERROR; } /* * objv is always passed via pc->objv */ + /*fprintf(stderr, "... setting %s pc->objv[%d] to '%s'\n",aPtr->name,i,ObjStr(objv[o]));*/ pc->objv[i] = objv[o]; o++; i++; aPtr++; } } - args = objc - flagCount - 1; pc->lastobjc = aPtr->name ? o : o-1; + /* pc->lastobjc = aPtr->name ? o+1 : o;*/ /* process to end of interface;*/ while (aPtr->name) { + /*fprintf(stderr, "end of if def %s\n",aPtr->name);*/ if (aPtr->required) nrReq++; else nrOpt++; aPtr++; } /* is last argument a vararg? */ aPtr--; - if (!varArgs && aPtr->type == convertToNothing) { + if (!varArgs && aPtr->converter == convertToNothing) { varArgs = 1; /*fprintf(stderr, "last arg is varargs\n");*/ } - /* fprintf(stderr, "less nrreq %d last arg %s type %s\n", args < nrReq, aPtr->name, aPtr->type); + /* fprintf(stderr, "less nrreq %d last arg %s type %s\n", args < nrReq, aPtr->name, aPtr->converter); fprintf(stderr, "objc = %d, args = %d, nrReq %d, nrReq + nrOpt = %d, varArgs %d i %d %s\n", objc,args,nrReq,nrReq + nrOpt, varArgs, i,aPtr->name);*/ @@ -9496,8 +9646,8 @@ if (args < nrReq || (!varArgs && args > nrReq + nrOpt)) { Tcl_Obj *msg = Tcl_NewStringObj("", 0); - for (aPtr=ifdPtr[0]; aPtr->name; aPtr++) { - if (aPtr != ifdPtr[0]) { + for (aPtr=ifdPtr; aPtr->name; aPtr++) { + if (aPtr != ifdPtr) { Tcl_AppendToObj(msg, " ", 1); } if (aPtr->required) { @@ -12027,6 +12177,7 @@ XOTclRequireObjectOpt(obj); AssertionAppendPrePost(interp, dsPtr, procs); } + /*fprintf(stderr, "new proc = '%s'\n",Tcl_DStringValue(dsPtr));*/ Tcl_EvalEx(interp, Tcl_DStringValue(dsPtr), Tcl_DStringLength(dsPtr), 0); DSTRING_FREE(dsPtr); } @@ -12239,9 +12390,62 @@ return 0; } +#if 1 int XOTclInterpretNonpositionalArgsCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + XOTclObject *object = GetSelfObj(interp); + XOTclClass *class = XOTclObjectIsClass(object) ? (XOTclClass *)object : NULL; + Tcl_HashTable *nonposArgsTable = class ? class->nonposArgsTable : object->nonposArgsTable; + char *methodName = (char *)GetSelfProc(interp); + XOTclNonposArgs *nonposArgs = NonposArgsGet(nonposArgsTable, methodName); + parseContext pc; + argDefinition CONST *aPtr, *bPtr; + Tcl_Obj *argsv; + int i, rc, argsc; + + /* the arguments are passed via the single argument "args"; strictly + speaking, this is not necessary and could be handled as well via + introspection (this is a possible TODO for optimization) + */ + + /* rc = Tcl_ListObjGetElements(interp, objv[1], &argsc, &argsv); + fprintf(stderr, "oc=%d %s, argsc %d, rc=%d\n",objc,ObjStr(objv[1]),argsc,rc); + */ + /*fprintf(stderr, "oc=%d\n",objc);*/ + if (parseObjv(interp, objc, objv, 1, nonposArgs->ifd, &pc) != TCL_OK) { + return TCL_ERROR; + } + for (aPtr = nonposArgs->ifd, i=0; aPtr->name; aPtr++, i++) { + char *argName = aPtr->name; + if (*argName == '-') argName++; + /*fprintf(stderr, "got for arg %s (%d) => %p, default %s\n",aPtr->name, aPtr->required, + pc.clientData[i], + aPtr->defaultValue ? ObjStr(aPtr->defaultValue) : "NONE");*/ + + if (pc.clientData[i] == 0) { + /* no valued passed, try take default */ + if (aPtr->defaultValue) { + /* TODO not jet checked */ + Tcl_SetVar2Ex(interp, argName, NULL, aPtr->defaultValue, 0); + } else if (aPtr->required) { + fprintf(stderr, "required argument %s missing\n",argName); + return TCL_ERROR; + } + } else { + /* got a value, already checked by objv parser */ + /*fprintf(stderr, "setting passed value for %s to '%s'\n",argName,ObjStr(pc.objv[i]));*/ + Tcl_SetVar2Ex(interp, argName, NULL, pc.objv[i], 0); + } + + } + return TCL_OK; +} +#else + +int +XOTclInterpretNonpositionalArgsCmd(ClientData clientData, Tcl_Interp *interp, int objc, + Tcl_Obj *CONST objv[]) { Tcl_Obj **npav, **checkv, **checkArgv, **argsv, **nonposArgsDefv, *invocation[4], **ordinaryArgsDefv, **defaultValueObjv, *list, *checkObj, *ordinaryArg; @@ -12252,7 +12456,7 @@ int endOfNonposArgsReached = 0; Var *varPtr; - XOTclClass *selfClass = GetSelfClass(interp); + XOTclClass *currentClass = GetSelfClass(interp); char *methodName = (char *) GetSelfProc(interp); Tcl_HashTable *nonposArgsTable; XOTclNonposArgs *nonposArgs; @@ -12263,8 +12467,8 @@ return XOTclObjErrArgCnt(interp, objv[0], NULL, "?args?"); } - if (selfClass) { - nonposArgsTable = selfClass->nonposArgsTable; + if (currentClass) { + nonposArgsTable = currentClass->nonposArgsTable; } else if ((selfObj = GetSelfObj(interp))) { nonposArgsTable = selfObj->nonposArgsTable; } else { @@ -12495,8 +12699,8 @@ } return TCL_OK; } +#endif - /* create a slave interp that calls XOTcl Init */ static int XOTcl_InterpObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Index: generic/xotclInt.h =================================================================== diff -u -r0e6f9ba5d9d7a8ce3e765f8a456a169f4b676b06 -rfb1840d39d6069f7b26e0d982448ef2602782e9e --- generic/xotclInt.h (.../xotclInt.h) (revision 0e6f9ba5d9d7a8ce3e765f8a456a169f4b676b06) +++ generic/xotclInt.h (.../xotclInt.h) (revision fb1840d39d6069f7b26e0d982448ef2602782e9e) @@ -430,10 +430,22 @@ * object and class internals */ +typedef int (XOTclTypeConverter) _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *obj, ClientData *clientData)); + +typedef struct { + char *name; + int required; + int nrargs; + XOTclTypeConverter *converter; + Tcl_Obj *defaultValue; +} argDefinition; + typedef struct XOTclNonposArgs { - Tcl_Obj *nonposArgs; - Tcl_Obj *ordinaryArgs; - Tcl_Obj *slotObj; + Tcl_Obj *nonposArgs; + Tcl_Obj *ordinaryArgs; + Tcl_Obj *slotObj; + argDefinition *ifd; + int ifdSize; } XOTclNonposArgs; typedef struct XOTclObjectOpt { Index: tests/testx.xotcl =================================================================== diff -u -r200940690a99e5cd234e83fe6acc234477bf879c -rfb1840d39d6069f7b26e0d982448ef2602782e9e --- tests/testx.xotcl (.../testx.xotcl) (revision 200940690a99e5cd234e83fe6acc234477bf879c) +++ tests/testx.xotcl (.../testx.xotcl) (revision fb1840d39d6069f7b26e0d982448ef2602782e9e) @@ -2627,13 +2627,20 @@ Class X X proc do0 {arg1 arg2} {puts "$arg1 $arg2"} X proc do1 {-arg1 -arg2} {puts "$arg1 $arg2"} + X proc do2 {-arg1 arg2} {puts "$arg1 $arg2"} X proc do3 {arg1 {arg2 d1}} {puts "$arg1 $arg2"} X proc do4 {-arg1 {-arg2 d2}} {puts "$arg1 $arg2"} + X proc do5 {{-arg1 d3} {arg2 d4}} {puts "$arg1 $arg2"} X instproc do6 {{-arg1 d3} {arg2 d4}} {puts "$arg1 $arg2"} X copy Y + + ::errorCheck [lsort [X info procs]] "do0 do1 do2 do3 do4 do5" "check procs to be copied" + ::errorCheck [lsort [Y info procs]] "do0 do1 do2 do3 do4 do5" "check copied procs" + ::errorCheck [lsort [X info instprocs]] "do6" "check instprocs to be copied" + ::errorCheck [lsort [Y info instprocs]] "do6" "check copied instprocs" foreach m [lsort [X info procs]] { foreach info {args nonposargs} { @@ -2645,7 +2652,7 @@ set vx ""; set vy "" set dx [X info default $m $a vx] set dy [Y info default $m $a vy] - ::errorCheck $dx $dy "copy nonposargs: hasdefault $dx ne $dy" + ::errorCheck $dx $dy "copy nonposargs: hasdefault $m $a: (source) $dx ne (copy) $dy" if {[info exists dx] && [info exists dy]} { ::errorCheck $vx $vy "copy nonposargs: hasdefault value $vx ne $vy" }