digitalmars.D - allMembers and getMember traits behavior
- Martin (32/32) Jun 21 2013 module test;
- Jacob Carlborg (4/34) Jun 21 2013 Can you use a string instead of getMember?
- Martin (11/59) Jun 21 2013 You mean something like this:
- Artur Skawina (3/58) Jun 21 2013 pragma(msg, __traits(getProtection, mixin("TestClass." ~ member)));
- Martin (6/73) Jun 21 2013 Thanks, that sort of works. It prints "private" but then
- Jacob Carlborg (5/9) Jun 21 2013 That sucks. Time for a bugzilla report.
- Artur Skawina (16/22) Jun 21 2013 Sorry, didn't test that one, just used the right symbol; it has the same
module test; void test() { foreach (member; __traits(allMembers, Client)) { pragma(msg, member); // Prints all members fine, including "value" } // This line fails static if(__traits(getProtection, __traits(getMember, TestClass, "value")) == "public") { pragma(msg, "value is public"); } else { pragma(msg, "value is not public"); } } module testclass; class TestClass { private: int value; } When using the allMembers trait, the private "value" member of TestClass is included, but when trying to retrieve that member using the getMember trait, it fails to compile with test.d(13): Error: class main.TestClass member value is not accessible Is that intended behavior or a bug? I can't see why the getMember trait should not be able to retrieve private members when allMembers trait is
Jun 21 2013
On 2013-06-21 15:04, Martin wrote:module test; void test() { foreach (member; __traits(allMembers, Client)) { pragma(msg, member); // Prints all members fine, including "value" } // This line fails static if(__traits(getProtection, __traits(getMember, TestClass, "value")) == "public") { pragma(msg, "value is public"); } else { pragma(msg, "value is not public"); } } module testclass; class TestClass { private: int value; } When using the allMembers trait, the private "value" member of TestClass is included, but when trying to retrieve that member using the getMember trait, it fails to compile with test.d(13): Error: class main.TestClass member value is not accessible Is that intended behavior or a bug? I can't see why the getMember trait should not be able to retrieve private members when allMembers trait isCan you use a string instead of getMember? -- /Jacob Carlborg
Jun 21 2013
On Friday, 21 June 2013 at 13:15:43 UTC, Jacob Carlborg wrote:On 2013-06-21 15:04, Martin wrote:You mean something like this: foreach (member; __traits(allMembers, TestClass)) { static if (member == "value") { pragma(msg, __traits(getProtection, member)); } } That works, but it prints "public", even though the "value" member is private. Surprisingly strange behaviormodule test; void test() { foreach (member; __traits(allMembers, Client)) { pragma(msg, member); // Prints all members fine, including "value" } // This line fails static if(__traits(getProtection, __traits(getMember, TestClass, "value")) == "public") { pragma(msg, "value is public"); } else { pragma(msg, "value is not public"); } } module testclass; class TestClass { private: int value; } When using the allMembers trait, the private "value" member of TestClass is included, but when trying to retrieve that member using the getMember trait, it fails to compile with test.d(13): Error: class main.TestClass member value is not accessible Is that intended behavior or a bug? I can't see why the getMember trait should not be able to retrieve private members when allMembers trait isCan you use a string instead of getMember?
Jun 21 2013
On 06/21/13 15:27, Martin wrote:On Friday, 21 June 2013 at 13:15:43 UTC, Jacob Carlborg wrote:pragma(msg, __traits(getProtection, mixin("TestClass." ~ member))); arturOn 2013-06-21 15:04, Martin wrote:You mean something like this: foreach (member; __traits(allMembers, TestClass)) { static if (member == "value") { pragma(msg, __traits(getProtection, member)); } } That works, but it prints "public", even though the "value" member is private. Surprisingly strange behaviormodule test; void test() { foreach (member; __traits(allMembers, Client)) { pragma(msg, member); // Prints all members fine, including "value" } // This line fails static if(__traits(getProtection, __traits(getMember, TestClass, "value")) == "public") { pragma(msg, "value is public"); } else { pragma(msg, "value is not public"); } } module testclass; class TestClass { private: int value; } When using the allMembers trait, the private "value" member of TestClass is included, but when trying to retrieve that member using the getMember trait, it fails to compile with test.d(13): Error: class main.TestClass member value is not accessible Is that intended behavior or a bug? I can't see why the getMember trait should not be able to retrieve private members when allMembers trait isCan you use a string instead of getMember?
Jun 21 2013
On Friday, 21 June 2013 at 13:42:44 UTC, Artur Skawina wrote:On 06/21/13 15:27, Martin wrote:Thanks, that sort of works. It prints "private" but then immediately gives an error: test.d(12): Error: class main.TestClass member value is not accessible Sigh, this is DMD 2.063.2 by the way.On Friday, 21 June 2013 at 13:15:43 UTC, Jacob Carlborg wrote:pragma(msg, __traits(getProtection, mixin("TestClass." ~ member))); arturOn 2013-06-21 15:04, Martin wrote:You mean something like this: foreach (member; __traits(allMembers, TestClass)) { static if (member == "value") { pragma(msg, __traits(getProtection, member)); } } That works, but it prints "public", even though the "value" member is private. Surprisingly strange behaviormodule test; void test() { foreach (member; __traits(allMembers, Client)) { pragma(msg, member); // Prints all members fine, including "value" } // This line fails static if(__traits(getProtection, __traits(getMember, TestClass, "value")) == "public") { pragma(msg, "value is public"); } else { pragma(msg, "value is not public"); } } module testclass; class TestClass { private: int value; } When using the allMembers trait, the private "value" member of TestClass is included, but when trying to retrieve that member using the getMember trait, it fails to compile with test.d(13): Error: class main.TestClass member value is not accessible Is that intended behavior or a bug? I can't see why the getMember trait should not be able to retrieve private members when allMembers trait isCan you use a string instead of getMember?
Jun 21 2013
On 2013-06-21 15:50, Martin wrote:Thanks, that sort of works. It prints "private" but then immediately gives an error: test.d(12): Error: class main.TestClass member value is not accessible Sigh, this is DMD 2.063.2 by the way.That sucks. Time for a bugzilla report. http://d.puremagic.com/issues/ -- /Jacob Carlborg
Jun 21 2013
On 06/21/13 15:50, Martin wrote:On Friday, 21 June 2013 at 13:42:44 UTC, Artur Skawina wrote:Sorry, didn't test that one, just used the right symbol; it has the same problem as your original issue. Clearly, the getProtection trait wasn't designed with inaccesible symbols in mind. And no, 'getMember' bypassing the protection would not be a good idea (would make it too easy to mistakenly access private data in generic code). getProtection should probably just take two args, just like getMember, which would allow it to safely ignore the normal access rules. Right now, you can use 'tupleof', which bypasses the visibility attrs: alias T = TestClass; foreach (I, TYPE; typeof(T.tupleof)) { pragma(msg, __traits(getProtection, T.tupleof[I]), " ", TYPE, " ", __traits(identifier, T.tupleof[I]), ";"); } arturThanks, that sort of works. It prints "private" but then immediately gives an error: test.d(12): Error: class main.TestClass member value is not accessible Sigh, this is DMD 2.063.2 by the way.pragma(msg, __traits(getProtection, mixin("TestClass." ~ member)));
Jun 21 2013