Index: generic/gentclAPI.decls =================================================================== diff -u -r42c96835f26177eacc9fda76997adf0c0812ec59 -rd34c425b8c87ad62b8879114f4aa8454162f09ed --- generic/gentclAPI.decls (.../gentclAPI.decls) (revision 42c96835f26177eacc9fda76997adf0c0812ec59) +++ generic/gentclAPI.decls (.../gentclAPI.decls) (revision d34c425b8c87ad62b8879114f4aa8454162f09ed) @@ -201,7 +201,8 @@ {-argName "-childof" -type object -nrargs 1} {-argName "args" -required 0 -type args} } -classMethod instfilterguard XOTclCInstFilterGuardMethod { +classMethod filterguard XOTclCFilterGuardMethod { + {-argName "-per-object" -type switch} {-argName "filter" -required 1} {-argName "guard" -required 1 -type tclobj} } Index: generic/tclAPI.h =================================================================== diff -u -r42c96835f26177eacc9fda76997adf0c0812ec59 -rd34c425b8c87ad62b8879114f4aa8454162f09ed --- generic/tclAPI.h (.../tclAPI.h) (revision 42c96835f26177eacc9fda76997adf0c0812ec59) +++ generic/tclAPI.h (.../tclAPI.h) (revision d34c425b8c87ad62b8879114f4aa8454162f09ed) @@ -92,8 +92,8 @@ static int XOTclCAllocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCCreateMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCDeallocMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); +static int XOTclCFilterGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); -static int XOTclCInstFilterGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCInvalidateObjectParameterMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCInvariantsMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); static int XOTclCMethodMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv []); @@ -188,8 +188,8 @@ static int XOTclCAllocMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *name); 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 XOTclCFilterGuardMethod(Tcl_Interp *interp, XOTclClass *cl, int withPer_object, char *filter, Tcl_Obj *guard); static int XOTclCForwardMethod(Tcl_Interp *interp, XOTclClass *cl, int withPer_object, 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 XOTclCInstFilterGuardMethod(Tcl_Interp *interp, XOTclClass *cl, char *filter, Tcl_Obj *guard); static int XOTclCInvalidateObjectParameterMethod(Tcl_Interp *interp, XOTclClass *cl); static int XOTclCInvariantsMethod(Tcl_Interp *interp, XOTclClass *cl, Tcl_Obj *invariantlist); static int XOTclCMethodMethod(Tcl_Interp *interp, XOTclClass *cl, int withInner_namespace, int withPer_object, int withProtected, Tcl_Obj *name, Tcl_Obj *args, Tcl_Obj *body, Tcl_Obj *withPrecondition, Tcl_Obj *withPostcondition); @@ -285,8 +285,8 @@ XOTclCAllocMethodIdx, XOTclCCreateMethodIdx, XOTclCDeallocMethodIdx, + XOTclCFilterGuardMethodIdx, XOTclCForwardMethodIdx, - XOTclCInstFilterGuardMethodIdx, XOTclCInvalidateObjectParameterMethodIdx, XOTclCInvariantsMethodIdx, XOTclCMethodMethodIdx, @@ -474,48 +474,49 @@ } static int -XOTclCForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { +XOTclCFilterGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (ArgumentParse(interp, objc, objv, (XOTclObject *) cl, objv[0], - method_definitions[XOTclCForwardMethodIdx].paramDefs, - method_definitions[XOTclCForwardMethodIdx].nrParameters, + method_definitions[XOTclCFilterGuardMethodIdx].paramDefs, + method_definitions[XOTclCFilterGuardMethodIdx].nrParameters, &pc) != TCL_OK) { return TCL_ERROR; } else { int withPer_object = (int )pc.clientData[0]; - Tcl_Obj *name = (Tcl_Obj *)pc.clientData[1]; - Tcl_Obj *withDefault = (Tcl_Obj *)pc.clientData[2]; - int withEarlybinding = (int )pc.clientData[3]; - Tcl_Obj *withMethodprefix = (Tcl_Obj *)pc.clientData[4]; - int withObjscope = (int )pc.clientData[5]; - Tcl_Obj *withOnerror = (Tcl_Obj *)pc.clientData[6]; - int withVerbose = (int )pc.clientData[7]; - Tcl_Obj *target = (Tcl_Obj *)pc.clientData[8]; + char *filter = (char *)pc.clientData[1]; + Tcl_Obj *guard = (Tcl_Obj *)pc.clientData[2]; parseContextRelease(&pc); - return XOTclCForwardMethod(interp, cl, withPer_object, name, withDefault, withEarlybinding, withMethodprefix, withObjscope, withOnerror, withVerbose, target, objc-pc.lastobjc, objv+pc.lastobjc); + return XOTclCFilterGuardMethod(interp, cl, withPer_object, filter, guard); } } static int -XOTclCInstFilterGuardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { +XOTclCForwardMethodStub(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { parseContext pc; XOTclClass *cl = XOTclObjectToClass(clientData); if (!cl) return XOTclObjErrType(interp, objv[0], "Class"); if (ArgumentParse(interp, objc, objv, (XOTclObject *) cl, objv[0], - method_definitions[XOTclCInstFilterGuardMethodIdx].paramDefs, - method_definitions[XOTclCInstFilterGuardMethodIdx].nrParameters, + method_definitions[XOTclCForwardMethodIdx].paramDefs, + method_definitions[XOTclCForwardMethodIdx].nrParameters, &pc) != TCL_OK) { return TCL_ERROR; } else { - char *filter = (char *)pc.clientData[0]; - Tcl_Obj *guard = (Tcl_Obj *)pc.clientData[1]; + int withPer_object = (int )pc.clientData[0]; + Tcl_Obj *name = (Tcl_Obj *)pc.clientData[1]; + Tcl_Obj *withDefault = (Tcl_Obj *)pc.clientData[2]; + int withEarlybinding = (int )pc.clientData[3]; + Tcl_Obj *withMethodprefix = (Tcl_Obj *)pc.clientData[4]; + int withObjscope = (int )pc.clientData[5]; + Tcl_Obj *withOnerror = (Tcl_Obj *)pc.clientData[6]; + int withVerbose = (int )pc.clientData[7]; + Tcl_Obj *target = (Tcl_Obj *)pc.clientData[8]; parseContextRelease(&pc); - return XOTclCInstFilterGuardMethod(interp, cl, filter, guard); + return XOTclCForwardMethod(interp, cl, withPer_object, name, withDefault, withEarlybinding, withMethodprefix, withObjscope, withOnerror, withVerbose, target, objc-pc.lastobjc, objv+pc.lastobjc); } } @@ -2287,6 +2288,11 @@ {"::xotcl::cmd::Class::dealloc", XOTclCDeallocMethodStub, 1, { {"object", 1, 0, convertToTclobj}} }, +{"::xotcl::cmd::Class::filterguard", XOTclCFilterGuardMethodStub, 3, { + {"-per-object", 0, 0, convertToBoolean}, + {"filter", 1, 0, convertToString}, + {"guard", 1, 0, convertToTclobj}} +}, {"::xotcl::cmd::Class::forward", XOTclCForwardMethodStub, 10, { {"-per-object", 0, 0, convertToBoolean}, {"name", 1, 0, convertToTclobj}, @@ -2299,10 +2305,6 @@ {"target", 0, 0, convertToTclobj}, {"args", 0, 0, convertToNothing}} }, -{"::xotcl::cmd::Class::instfilterguard", XOTclCInstFilterGuardMethodStub, 2, { - {"filter", 1, 0, convertToString}, - {"guard", 1, 0, convertToTclobj}} -}, {"::xotcl::cmd::Class::invalidateobjectparameter", XOTclCInvalidateObjectParameterMethodStub, 0, { } }, Index: generic/xotcl.c =================================================================== diff -u -r42c96835f26177eacc9fda76997adf0c0812ec59 -rd34c425b8c87ad62b8879114f4aa8454162f09ed --- generic/xotcl.c (.../xotcl.c) (revision 42c96835f26177eacc9fda76997adf0c0812ec59) +++ generic/xotcl.c (.../xotcl.c) (revision d34c425b8c87ad62b8879114f4aa8454162f09ed) @@ -12329,8 +12329,13 @@ return result; } -static int XOTclCInstFilterGuardMethod(Tcl_Interp *interp, XOTclClass *cl, char *filter, Tcl_Obj *guard) { +static int XOTclCFilterGuardMethod(Tcl_Interp *interp, XOTclClass *cl, + int withPer_object, char *filter, Tcl_Obj *guard) { XOTclClassOpt *opt = cl->opt; + + if (withPer_object) { + return XOTclOFilterGuardMethod(interp, &cl->object, filter, guard); + } if (opt && opt->instfilters) { XOTclCmdList *h = CmdListFindNameInList(interp, filter, opt->instfilters); Index: library/lib/xotcl1.xotcl =================================================================== diff -u -r42c96835f26177eacc9fda76997adf0c0812ec59 -rd34c425b8c87ad62b8879114f4aa8454162f09ed --- library/lib/xotcl1.xotcl (.../xotcl1.xotcl) (revision 42c96835f26177eacc9fda76997adf0c0812ec59) +++ library/lib/xotcl1.xotcl (.../xotcl1.xotcl) (revision d34c425b8c87ad62b8879114f4aa8454162f09ed) @@ -367,6 +367,9 @@ } ::xotcl::alias Class instparametercmd ::xotcl::cmd::Class::setter ::xotcl::alias Class parametercmd ::xotcl::cmd::Object::setter + ::xotcl::alias Class filterguard ::xotcl::cmd::Object::filterguard + ::xotcl::alias Class instfilterguard ::xotcl::cmd::Class::filterguard + ::xotcl::alias Class mixinguard ::xotcl::cmd::Object::mixinguard ::xotcl::alias Class instmixinguard ::xotcl::cmd::Class::mixinguard ::xotcl::alias Class mixinguard ::xotcl::cmd::Object::mixinguard