Index: TODO =================================================================== diff -u -N -r8da343e4eb0b6166a184a0ab8eb7189d97eaff6f -r2493736d00766ffa6a8eb5b536c616e4e8da34e9 --- TODO (.../TODO) (revision 8da343e4eb0b6166a184a0ab8eb7189d97eaff6f) +++ TODO (.../TODO) (revision 2493736d00766ffa6a8eb5b536c616e4e8da34e9) @@ -3409,13 +3409,19 @@ * implemented NsfObjDispatchNRE and NsfObjDispatch * this fixed all issues of tcl8.6 and interp.test (xocomm still hangs in 8.6) +- nsf.c: + * "private" implies now "protected". This means, setting "private" + sets as well "protected", unsetting "protected" unsets "private" + * make sure the "... method definition" of private methods is returned as "private" + * extended regression test + + TODO: - fix interp.test for tcl 8.6 - fix xocomm.test for tcl 8.6 - private: * needed fails since method %s.%s is private ? - * maybe let private imply protected * make sure nsf::dispatch works sufficiently similar to plain dispatch * document private in migration guide tutorial Index: generic/nsf.c =================================================================== diff -u -N -r8da343e4eb0b6166a184a0ab8eb7189d97eaff6f -r2493736d00766ffa6a8eb5b536c616e4e8da34e9 --- generic/nsf.c (.../nsf.c) (revision 8da343e4eb0b6166a184a0ab8eb7189d97eaff6f) +++ generic/nsf.c (.../nsf.c) (revision 2493736d00766ffa6a8eb5b536c616e4e8da34e9) @@ -16196,7 +16196,9 @@ Tcl_ListObjAppendElement(interp, listObj, object->cmdName); if (withProtection) { Tcl_ListObjAppendElement(interp, listObj, - Tcl_Command_flags(cmd) & NSF_CMD_CALL_PROTECTED_METHOD + Tcl_Command_flags(cmd) & NSF_CMD_CALL_PRIVATE_METHOD + ? Tcl_NewStringObj("private", 7) + : Tcl_Command_flags(cmd) & NSF_CMD_CALL_PROTECTED_METHOD ? Tcl_NewStringObj("protected", 9) : Tcl_NewStringObj("public", 6)); } @@ -17913,18 +17915,18 @@ case MethodpropertyCall_protectedIdx: /* fall through */ case MethodpropertyRedefine_protectedIdx: /* fall through */ { - int clearFlag = 0; + int impliedSetFlag = 0, impliedClearFlag = 0; switch (methodproperty) { case MethodpropertyClass_onlyIdx: flag = NSF_CMD_CLASS_ONLY_METHOD; break; case MethodpropertyCall_privateIdx: - clearFlag = NSF_CMD_CALL_PROTECTED_METHOD; flag = NSF_CMD_CALL_PRIVATE_METHOD; + impliedSetFlag = NSF_CMD_CALL_PROTECTED_METHOD; break; case MethodpropertyCall_protectedIdx: - clearFlag = NSF_CMD_CALL_PRIVATE_METHOD; + impliedClearFlag = NSF_CMD_CALL_PRIVATE_METHOD; flag = NSF_CMD_CALL_PROTECTED_METHOD; break; case MethodpropertyRedefine_protectedIdx: @@ -17941,12 +17943,21 @@ return result; } if (bool) { - if (clearFlag) { - Tcl_Command_flags(cmd) &= ~clearFlag; - } + /* + * set flag + */ Tcl_Command_flags(cmd) |= flag; + if (impliedSetFlag) { + Tcl_Command_flags(cmd) |= impliedSetFlag; + } } else { + /* + * clear flag + */ Tcl_Command_flags(cmd) &= ~flag; + if (impliedClearFlag) { + Tcl_Command_flags(cmd) &= ~impliedClearFlag; + } } } Tcl_SetIntObj(Tcl_GetObjResult(interp), (Tcl_Command_flags(cmd) & flag) != 0); Index: generic/nsf.h =================================================================== diff -u -N -r7b8ab056c2dafa49164db2e9ccddd9cb6d5b6fb3 -r2493736d00766ffa6a8eb5b536c616e4e8da34e9 --- generic/nsf.h (.../nsf.h) (revision 7b8ab056c2dafa49164db2e9ccddd9cb6d5b6fb3) +++ generic/nsf.h (.../nsf.h) (revision 2493736d00766ffa6a8eb5b536c616e4e8da34e9) @@ -78,7 +78,7 @@ /* are we developing? #define NSF_DEVELOPMENT 1 */ -#define NSF_DEVELOPMENT 1 +//#define NSF_DEVELOPMENT 1 /* activate/deacticate assert #define NDEBUG 1 Index: tests/protected.test =================================================================== diff -u -N -rcb838e0d7ecf616891cc1f5089750208913d8503 -r2493736d00766ffa6a8eb5b536c616e4e8da34e9 --- tests/protected.test (.../protected.test) (revision cb838e0d7ecf616891cc1f5089750208913d8503) +++ tests/protected.test (.../protected.test) (revision 2493736d00766ffa6a8eb5b536c616e4e8da34e9) @@ -599,4 +599,39 @@ # next in the private method reaches a non-private method, which is honored ? {s1 foo2 4 5} 9 ? {s1 bar 4 5} 20 +} + +# +# Test setting / clearing private and protected flags +# + +nx::Test case call-protected-flags { + Class create C + + C protected method foo {} {return foo} + ? {::nsf::method::property C foo call-protected} 1 + ? {::nsf::method::property C foo call-private} 0 + ? {C info method definition foo} "::C protected method foo {} {return foo}" + + C public method foo {} {return foo} + ? {::nsf::method::property C foo call-protected} 0 + ? {::nsf::method::property C foo call-private} 0 + ? {C info method definition foo} "::C public method foo {} {return foo}" + + C private method foo {} {return foo} + ? {::nsf::method::property C foo call-protected} 1 + ? {::nsf::method::property C foo call-private} 1 + ? {C info method definition foo} "::C private method foo {} {return foo}" + + ? {::nsf::method::property C foo call-private false} 0 + ? {::nsf::method::property C foo call-protected} 1 + ? {::nsf::method::property C foo call-private} 0 + + ? {::nsf::method::property C foo call-private true} 1 + ? {::nsf::method::property C foo call-protected} 1 + ? {::nsf::method::property C foo call-private} 1 + + ? {::nsf::method::property C foo call-protected false} 0 + ? {::nsf::method::property C foo call-protected} 0 + ? {::nsf::method::property C foo call-private} 0 } \ No newline at end of file