Index: generic/gentclAPI.decls =================================================================== diff -u -re12f842804807d9b0e849858697d94a57c6b3fe6 -rd3d3eb10074ac56bbc77650c1bdd4239f0d97ca8 --- generic/gentclAPI.decls (.../gentclAPI.decls) (revision e12f842804807d9b0e849858697d94a57c6b3fe6) +++ generic/gentclAPI.decls (.../gentclAPI.decls) (revision d3d3eb10074ac56bbc77650c1bdd4239f0d97ca8) @@ -44,6 +44,10 @@ } xotclCmd finalize XOTclFinalizeObjCmd { } +xotclCmd interp XOTclInterpObjCmd { + {-argName "name"} + {-argName "args" -type allargs} +} xotclCmd instvar XOTclInstvarCmd { {-argName "args" -type allargs} } @@ -219,7 +223,7 @@ {-argName "postcondition" -type tclobj} } classMethod instforward XOTclCInstForwardMethod { - {-argName "method" -required 1 -type tclobj} + {-argName "name" -required 1 -type tclobj} {-argName "-default" -nrargs 1 -type tclobj} {-argName "-earlybinding"} {-argName "-methodprefix" -nrargs 1 -type tclobj} Index: generic/tclAPI.h =================================================================== diff -u -re12f842804807d9b0e849858697d94a57c6b3fe6 -rd3d3eb10074ac56bbc77650c1bdd4239f0d97ca8 --- generic/tclAPI.h (.../tclAPI.h) (revision e12f842804807d9b0e849858697d94a57c6b3fe6) +++ generic/tclAPI.h (.../tclAPI.h) (revision d3d3eb10074ac56bbc77650c1bdd4239f0d97ca8) @@ -137,6 +137,7 @@ static int XOTclDispatchCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclFinalizeObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclInstvarCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclInterpObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclMethodPropertyCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclMyCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclRelationCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -148,7 +149,7 @@ static int XOTclCCreateMethod(Tcl_Interp *interp, XOTclClass *cl, char *name, int objc, Tcl_Obj *CONST objv[]); static int XOTclCDeallocMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *object); static int XOTclCInstFilterGuardMethod(Tcl_Interp *interp, XOTclClass *cl, char *filter, Tcl_Obj *guard); -static int XOTclCInstForwardMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *method, Tcl_Obj *withDefault, int withEarlybinding, Tcl_Obj *withMethodprefix, int withObjscope, Tcl_Obj *withOnerror, int withVerbose, Tcl_Obj *target, int nobjc, Tcl_Obj *CONST nobjv[]); +static int XOTclCInstForwardMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *name, Tcl_Obj *withDefault, int withEarlybinding, Tcl_Obj *withMethodprefix, int withObjscope, Tcl_Obj *withOnerror, int withVerbose, Tcl_Obj *target, int nobjc, Tcl_Obj *CONST nobjv[]); static int XOTclCInstMixinGuardMethod(Tcl_Interp *interp, XOTclClass *cl, char *mixin, Tcl_Obj *guard); static int XOTclCInstParametercmdMethod(Tcl_Interp *interp, XOTclClass *cl, char *name); static int XOTclCInstProcMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *name, Tcl_Obj *args, Tcl_Obj *body, Tcl_Obj *precondition, Tcl_Obj *postcondition); @@ -237,6 +238,7 @@ static int XOTclDispatchCmd(Tcl_Interp *interp, XOTclObject *object, int withObjscope, Tcl_Obj *command, int nobjc, Tcl_Obj *CONST nobjv[]); static int XOTclFinalizeObjCmd(Tcl_Interp *interp); static int XOTclInstvarCmd(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); +static int XOTclInterpObjCmd(Tcl_Interp *interp, char *name, int objc, Tcl_Obj *CONST objv[]); static int XOTclMethodPropertyCmd(Tcl_Interp *interp, XOTclObject *object, char *methodName, int withPer_object, int methodproperty, Tcl_Obj *value); static int XOTclMyCmd(Tcl_Interp *interp, int withLocal, Tcl_Obj *method, int nobjc, Tcl_Obj *CONST nobjv[]); static int XOTclRelationCmd(Tcl_Interp *interp, XOTclObject *object, int relationtype, Tcl_Obj *value); @@ -338,6 +340,7 @@ XOTclDispatchCmdIdx, XOTclFinalizeObjCmdIdx, XOTclInstvarCmdIdx, + XOTclInterpObjCmdIdx, XOTclMethodPropertyCmdIdx, XOTclMyCmdIdx, XOTclRelationCmdIdx, @@ -471,7 +474,7 @@ &pc) != TCL_OK) { return TCL_ERROR; } else { - Tcl_Obj *method = (Tcl_Obj *)pc.clientData[0]; + Tcl_Obj *name = (Tcl_Obj *)pc.clientData[0]; Tcl_Obj *withDefault = (Tcl_Obj *)pc.clientData[1]; int withEarlybinding = (int )pc.clientData[2]; Tcl_Obj *withMethodprefix = (Tcl_Obj *)pc.clientData[3]; @@ -481,7 +484,7 @@ Tcl_Obj *target = (Tcl_Obj *)pc.clientData[7]; parseContextRelease(&pc); - return XOTclCInstForwardMethod(interp, cl, method, withDefault, withEarlybinding, withMethodprefix, withObjscope, withOnerror, withVerbose, target, objc-pc.lastobjc, objv+pc.lastobjc); + return XOTclCInstForwardMethod(interp, cl, name, withDefault, withEarlybinding, withMethodprefix, withObjscope, withOnerror, withVerbose, target, objc-pc.lastobjc, objv+pc.lastobjc); } } @@ -2221,6 +2224,24 @@ } static int +XOTclInterpObjCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + parseContext pc; + + if (ArgumentParse(interp, objc, objv, NULL, objv[0], + method_definitions[XOTclInterpObjCmdIdx].paramDefs, + method_definitions[XOTclInterpObjCmdIdx].nrParameters, + &pc) != TCL_OK) { + return TCL_ERROR; + } else { + char *name = (char *)pc.clientData[0]; + + parseContextRelease(&pc); + return XOTclInterpObjCmd(interp, name, objc, objv); + + } +} + +static int XOTclMethodPropertyCmdStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; @@ -2325,7 +2346,7 @@ {"guard", 1, 0, convertToTclobj}} }, {"::xotcl::cmd::Class::instforward", XOTclCInstForwardMethodStub, 9, { - {"method", 1, 0, convertToTclobj}, + {"name", 1, 0, convertToTclobj}, {"-default", 0, 1, convertToTclobj}, {"-earlybinding", 0, 0, convertToString}, {"-methodprefix", 0, 1, convertToTclobj}, @@ -2695,6 +2716,10 @@ {"::xotcl::instvar", XOTclInstvarCmdStub, 1, { {"args", 0, 0, convertToNothing}} }, +{"::xotcl::interp", XOTclInterpObjCmdStub, 2, { + {"name", 0, 0, convertToString}, + {"args", 0, 0, convertToNothing}} +}, {"::xotcl::methodproperty", XOTclMethodPropertyCmdStub, 5, { {"object", 1, 0, convertToObject}, {"methodName", 1, 0, convertToString}, Index: generic/xotcl.c =================================================================== diff -u -re12f842804807d9b0e849858697d94a57c6b3fe6 -rd3d3eb10074ac56bbc77650c1bdd4239f0d97ca8 --- generic/xotcl.c (.../xotcl.c) (revision e12f842804807d9b0e849858697d94a57c6b3fe6) +++ generic/xotcl.c (.../xotcl.c) (revision d3d3eb10074ac56bbc77650c1bdd4239f0d97ca8) @@ -12065,25 +12065,20 @@ #endif /* create a slave interp that calls XOTcl Init */ -static int -XOTcl_InterpObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { +static int +XOTclInterpObjCmd(Tcl_Interp *interp, char *name, int objc, Tcl_Obj *CONST objv[]) { Tcl_Interp *slave; - char *subCmd; ALLOC_ON_STACK(Tcl_Obj*, objc, ov); + /* do not overwrite the provided objv */ memcpy(ov, objv, sizeof(Tcl_Obj *)*objc); - if (objc < 1) { - XOTclObjErrArgCnt(interp, objv[0], NULL, "name ?args?"); - goto interp_error; - } ov[0] = XOTclGlobalObjects[XOTE_INTERP]; if (Tcl_EvalObjv(interp, objc, ov, TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG) != TCL_OK) { goto interp_error; } - subCmd = ObjStr(ov[1]); - if (isCreateString(subCmd)) { + if (isCreateString(name)) { slave = Tcl_GetSlave(interp, ObjStr(ov[2])); if (!slave) { XOTclVarErrMsg(interp, "Creation of slave interpreter failed", (char *) NULL); @@ -12685,7 +12680,6 @@ Tcl_CreateObjCommand(interp, "::xotcl::unsetUnknownArgs", XOTclUnsetUnknownArgsCmd, 0,0); #endif - Tcl_CreateObjCommand(interp, "::xotcl::interp", XOTcl_InterpObjCmd, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::namespace_copyvars", XOTcl_NSCopyVars, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::namespace_copycmds", XOTcl_NSCopyCmds, 0, 0); Tcl_CreateObjCommand(interp, "::xotcl::__qualify", XOTclQualifyObjCmd, 0, 0); Index: tests/objparametertest.xotcl =================================================================== diff -u -r2ce14fba0764a9fcbbe7cc2f582472526a58ddf0 -rd3d3eb10074ac56bbc77650c1bdd4239f0d97ca8 --- tests/objparametertest.xotcl (.../objparametertest.xotcl) (revision 2ce14fba0764a9fcbbe7cc2f582472526a58ddf0) +++ tests/objparametertest.xotcl (.../objparametertest.xotcl) (revision d3d3eb10074ac56bbc77650c1bdd4239f0d97ca8) @@ -283,6 +283,7 @@ "::xotcl::parameterType: unable to dispatch method 'type=unknowntype'" \ "missing type checker" + ## TODO regression test for type checking, parameter options (initcmd, ## substdefault, combinations with defaults, ...), etc. Index: tests/testx.xotcl =================================================================== diff -u -r2ce14fba0764a9fcbbe7cc2f582472526a58ddf0 -rd3d3eb10074ac56bbc77650c1bdd4239f0d97ca8 --- tests/testx.xotcl (.../testx.xotcl) (revision 2ce14fba0764a9fcbbe7cc2f582472526a58ddf0) +++ tests/testx.xotcl (.../testx.xotcl) (revision d3d3eb10074ac56bbc77650c1bdd4239f0d97ca8) @@ -3093,7 +3093,8 @@ xotcl::interp create in set ::r [in eval { namespace import -force xotcl::* - Object o}] + Object o + }] xotcl::interp delete in ::errorCheck $::r ::o "XOTcl slave interpreter "