Index: TODO =================================================================== diff -u -r1945e08ac5a2e0f6387145d948bfb29eee0016fa -rf1b65a9694a721be01a9a2acaff5ee093456b2bd --- TODO (.../TODO) (revision 1945e08ac5a2e0f6387145d948bfb29eee0016fa) +++ TODO (.../TODO) (revision f1b65a9694a721be01a9a2acaff5ee093456b2bd) @@ -1847,6 +1847,9 @@ - undone temporary fixes for volatile in serializer and nx.tcl - impoved NsColonVarResolver, made some assumptions explicit +- gentclApi.tcl: added optimizer rule for single argument of type tclobj +- improved speed of CompiledLocalsLookup slightly + TODO: - "-returns" Index: generic/gentclAPI.tcl =================================================================== diff -u -rd884e8166428ad9dae6c39cb16c8324953b69b11 -rf1b65a9694a721be01a9a2acaff5ee093456b2bd --- generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision d884e8166428ad9dae6c39cb16c8324953b69b11) +++ generic/gentclAPI.tcl (.../gentclAPI.tcl) (revision f1b65a9694a721be01a9a2acaff5ee093456b2bd) @@ -266,7 +266,7 @@ set call "return [implArgList $d(implementation) {} $arglist];" } - #if {$nrArgs == 1} { puts stderr "$d(stub) => '$arglist'" } + #if {$nrArgs == 1} { puts stderr "$d(stub) => '$arglist' cDefs=$cDefs ifd=$ifDef" } if {$nrArgs == 1 && $arglist eq "objc, objv"} { # TODO we would not need to generate a stub at all.... #set ifd "{\"$d(ns)::$d(methodName)\", $d(implementation), $nrArgs, {\n [genifd $d(parameterDefinitions)]}\n}" @@ -277,15 +277,42 @@ #puts stderr "$d(stub) => '$arglist'" append fns [genSimpleStub $d(stub) $intro $d(idx) $cDefs $pre $call $post] } elseif {$nrArgs == 0} { - append pre [subst -nocommands { - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[$d(idx)].paramDefs, - NULL, objv[0]); - } - }] - append fns [genSimpleStub $d(stub) $intro $d(idx) $cDefs $pre $call $post] + append pre [subst -nocommands { + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[$d(idx)].paramDefs, + NULL, objv[0]); + } + }] + append fns [genSimpleStub $d(stub) $intro $d(idx) $cDefs $pre $call $post] + } elseif {$nrArgs == 1 && [string match "Tcl_Obj *" $cDefs]} { + + array set defs [list -required 0] + array set defs [lindex $d(parameterDefinitions) 0] + + if {$defs(-required)} { + set op "objc != 2" } else { + set op "objc < 1 || objc > 2" + } + append pre [subst -nocommands { + if ($op) { + return ArgumentError(interp, "wrong # of arguments:", + method_definitions[$d(idx)].paramDefs, + NULL, objv[0]); + } + }] + + set newArg {objc == 2 ? objv[1] : NULL} + if {[regexp {^(.*),(.*)$} $arglist _ arg1]} { + set newArglist "$arg1, $newArg" + } else { + set newArglist $newArg + } + regsub ", $arglist\\)" $call ", $newArglist\)" call + + append fns [genSimpleStub $d(stub) $intro $d(idx) "" $pre $call $post] + } else { switch $d(methodType) { objectMethod {set obj "obj"} classMethod {set obj "(NsfObject *) cl"} Index: generic/nsf.c =================================================================== diff -u -r1945e08ac5a2e0f6387145d948bfb29eee0016fa -rf1b65a9694a721be01a9a2acaff5ee093456b2bd --- generic/nsf.c (.../nsf.c) (revision 1945e08ac5a2e0f6387145d948bfb29eee0016fa) +++ generic/nsf.c (.../nsf.c) (revision f1b65a9694a721be01a9a2acaff5ee093456b2bd) @@ -1988,12 +1988,13 @@ int i, localCt = varFramePtr->numCompiledLocals; Tcl_Obj **objPtrPtr = &varFramePtr->localCachePtr->varName0; - /*fprintf(stderr, ".. search #local vars %d\n", localCt);*/ + /* fprintf(stderr, ".. search #local vars %d for %s\n", localCt, varName);*/ for (i=0 ; icompiledLocals[i]; } @@ -14803,8 +14804,17 @@ if (paramPtr->flags & NSF_ARG_INITCMD) { /* cscPtr->cmdPtr = NSFindCommand(interp, "::eval"); */ + + //cscPtr->flags = 0; + //CscInit(cscPtr, object, NULL /*cl*/, NULL/*cmd*/, NSF_CSC_TYPE_PLAIN, 0); + //Nsf_PushFrameCsc(interp, cscPtr, framePtr2); + result = Tcl_EvalObjEx(interp, newValue, TCL_EVAL_DIRECT); + //Nsf_PopFrameCsc(interp, framePtr2); + //CscListRemove(interp, cscPtr); + //CscFinish(interp, cscPtr, "converter object frame"); + } else /* must be NSF_ARG_METHOD */ { Tcl_Obj *ov[3]; int oc = 0; Index: generic/tclAPI.h =================================================================== diff -u -rd884e8166428ad9dae6c39cb16c8324953b69b11 -rf1b65a9694a721be01a9a2acaff5ee093456b2bd --- generic/tclAPI.h (.../tclAPI.h) (revision d884e8166428ad9dae6c39cb16c8324953b69b11) +++ generic/tclAPI.h (.../tclAPI.h) (revision f1b65a9694a721be01a9a2acaff5ee093456b2bd) @@ -444,21 +444,18 @@ static int NsfCAllocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); if (!cl) return NsfObjErrType(interp, objv[0], "Class", ""); - if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], - method_definitions[NsfCAllocMethodIdx].paramDefs, - method_definitions[NsfCAllocMethodIdx].nrParameters, 1, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - Tcl_Obj *name = (Tcl_Obj *)pc.clientData[0]; + - assert(pc.status == 0); - return NsfCAllocMethod(interp, cl, name); + if (objc != 2) { + return ArgumentError(interp, "wrong # of arguments:", + method_definitions[NsfCAllocMethodIdx].paramDefs, + NULL, objv[0]); + } + + return NsfCAllocMethod(interp, cl, objc == 2 ? objv[1] : NULL); - } } static int @@ -482,21 +479,18 @@ static int NsfCDeallocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - ParseContext pc; NsfClass *cl = NsfObjectToClass(clientData); if (!cl) return NsfObjErrType(interp, objv[0], "Class", ""); - if (ArgumentParse(interp, objc, objv, (NsfObject *) cl, objv[0], - method_definitions[NsfCDeallocMethodIdx].paramDefs, - method_definitions[NsfCDeallocMethodIdx].nrParameters, 1, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - Tcl_Obj *object = (Tcl_Obj *)pc.clientData[0]; + - assert(pc.status == 0); - return NsfCDeallocMethod(interp, cl, object); + if (objc != 2) { + return ArgumentError(interp, "wrong # of arguments:", + method_definitions[NsfCDeallocMethodIdx].paramDefs, + NULL, objv[0]); + } + + return NsfCDeallocMethod(interp, cl, objc == 2 ? objv[1] : NULL); - } } static int @@ -989,12 +983,12 @@ - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfDebugRunAssertionsCmdIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfDebugRunAssertionsCmdIdx].paramDefs, + NULL, objv[0]); + } + return NsfDebugRunAssertionsCmd(interp); } @@ -1063,12 +1057,12 @@ - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfFinalizeObjCmdIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfFinalizeObjCmdIdx].paramDefs, + NULL, objv[0]); + } + return NsfFinalizeObjCmd(interp); } @@ -1176,20 +1170,17 @@ static int NsfIsObjectCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - ParseContext pc; - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[NsfIsObjectCmdIdx].paramDefs, - method_definitions[NsfIsObjectCmdIdx].nrParameters, 1, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - Tcl_Obj *object = (Tcl_Obj *)pc.clientData[0]; + - assert(pc.status == 0); - return NsfIsObjectCmd(interp, object); + if (objc != 2) { + return ArgumentError(interp, "wrong # of arguments:", + method_definitions[NsfIsObjectCmdIdx].paramDefs, + NULL, objv[0]); + } + + return NsfIsObjectCmd(interp, objc == 2 ? objv[1] : NULL); - } } static int @@ -1299,38 +1290,32 @@ static int NsfNextCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - ParseContext pc; - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[NsfNextCmdIdx].paramDefs, - method_definitions[NsfNextCmdIdx].nrParameters, 1, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - Tcl_Obj *arguments = (Tcl_Obj *)pc.clientData[0]; + - assert(pc.status == 0); - return NsfNextCmd(interp, arguments); + if (objc < 1 || objc > 2) { + return ArgumentError(interp, "wrong # of arguments:", + method_definitions[NsfNextCmdIdx].paramDefs, + NULL, objv[0]); + } + + return NsfNextCmd(interp, objc == 2 ? objv[1] : NULL); - } } static int NsfQualifyObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - ParseContext pc; - if (ArgumentParse(interp, objc, objv, NULL, objv[0], - method_definitions[NsfQualifyObjCmdIdx].paramDefs, - method_definitions[NsfQualifyObjCmdIdx].nrParameters, 1, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - Tcl_Obj *objectname = (Tcl_Obj *)pc.clientData[0]; + - assert(pc.status == 0); - return NsfQualifyObjCmd(interp, objectname); + if (objc != 2) { + return ArgumentError(interp, "wrong # of arguments:", + method_definitions[NsfQualifyObjCmdIdx].paramDefs, + NULL, objv[0]); + } + + return NsfQualifyObjCmd(interp, objc == 2 ? objv[1] : NULL); - } } static int @@ -1358,12 +1343,12 @@ - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfSelfCmdIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfSelfCmdIdx].paramDefs, + NULL, objv[0]); + } + return NsfSelfCmd(interp); } @@ -1413,12 +1398,12 @@ - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfShowStackCmdIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfShowStackCmdIdx].paramDefs, + NULL, objv[0]); + } + return NsfShowStackCmd(interp); } @@ -1450,12 +1435,12 @@ if (!obj) return NsfObjErrType(interp, objv[0], "Object", ""); - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfOCleanupMethodIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfOCleanupMethodIdx].paramDefs, + NULL, objv[0]); + } + return NsfOCleanupMethod(interp, obj); } @@ -1476,12 +1461,12 @@ if (!obj) return NsfObjErrType(interp, objv[0], "Object", ""); - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfODestroyMethodIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfODestroyMethodIdx].paramDefs, + NULL, objv[0]); + } + return NsfODestroyMethod(interp, obj); } @@ -1561,12 +1546,12 @@ if (!obj) return NsfObjErrType(interp, objv[0], "Object", ""); - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfONoinitMethodIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfONoinitMethodIdx].paramDefs, + NULL, objv[0]); + } + return NsfONoinitMethod(interp, obj); } @@ -1577,12 +1562,12 @@ if (!obj) return NsfObjErrType(interp, objv[0], "Object", ""); - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfORequireNamespaceMethodIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfORequireNamespaceMethodIdx].paramDefs, + NULL, objv[0]); + } + return NsfORequireNamespaceMethod(interp, obj); } @@ -1623,12 +1608,12 @@ if (!obj) return NsfObjErrType(interp, objv[0], "Object", ""); - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfOVolatileMethodIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfOVolatileMethodIdx].paramDefs, + NULL, objv[0]); + } + return NsfOVolatileMethod(interp, obj); } @@ -1678,12 +1663,12 @@ if (!obj) return NsfObjErrType(interp, objv[0], "Object", ""); - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfObjInfoClassMethodIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfObjInfoClassMethodIdx].paramDefs, + NULL, objv[0]); + } + return NsfObjInfoClassMethod(interp, obj); } @@ -1792,12 +1777,12 @@ if (!obj) return NsfObjErrType(interp, objv[0], "Object", ""); - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfObjInfoHasnamespaceMethodIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfObjInfoHasnamespaceMethodIdx].paramDefs, + NULL, objv[0]); + } + return NsfObjInfoHasnamespaceMethod(interp, obj); } @@ -1842,21 +1827,18 @@ static int NsfObjInfoLookupMethodMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { - ParseContext pc; NsfObject *obj = (NsfObject *)clientData; if (!obj) return NsfObjErrType(interp, objv[0], "Object", ""); - if (ArgumentParse(interp, objc, objv, obj, objv[0], - method_definitions[NsfObjInfoLookupMethodMethodIdx].paramDefs, - method_definitions[NsfObjInfoLookupMethodMethodIdx].nrParameters, 1, - &pc) != TCL_OK) { - return TCL_ERROR; - } else { - Tcl_Obj *name = (Tcl_Obj *)pc.clientData[0]; + - assert(pc.status == 0); - return NsfObjInfoLookupMethodMethod(interp, obj, name); + if (objc != 2) { + return ArgumentError(interp, "wrong # of arguments:", + method_definitions[NsfObjInfoLookupMethodMethodIdx].paramDefs, + NULL, objv[0]); + } + + return NsfObjInfoLookupMethodMethod(interp, obj, objc == 2 ? objv[1] : NULL); - } } static int @@ -2007,12 +1989,12 @@ if (!obj) return NsfObjErrType(interp, objv[0], "Object", ""); - if (objc != 1) { - return ArgumentError(interp, "too many arguments:", - method_definitions[NsfObjInfoParentMethodIdx].paramDefs, - NULL, objv[0]); - } - + if (objc != 1) { + return ArgumentError(interp, "too many arguments:", + method_definitions[NsfObjInfoParentMethodIdx].paramDefs, + NULL, objv[0]); + } + return NsfObjInfoParentMethod(interp, obj); }