[IronPython] PrivateBindings fails to expose functions in internal classes, but not properties

Leo Carbajal desleo at gmail.com
Sun Jan 9 22:20:01 CET 2011


Thank you for poking around on this, I wouldn't have any idea where to even
start.

Unfortunately, I can't figure out how to build 2.6.2 from source so I guess
I'll have to wait for a bugfix.

On Sun, Jan 9, 2011 at 7:57 AM, Richard Nienaber <rjnienaber at gmail.com>wrote:

> Thanks for providing the reproduction steps. I've had a look around the
> source and it seems like the problem is happening somewhere between
> CompilerHelpers.cs<https://github.com/IronLanguages/main/blob/master/Runtime/Microsoft.Dynamic/Generation/CompilerHelpers.cs#L368> and
> PythonBinder.cs<https://github.com/IronLanguages/main/blob/master/Languages/IronPython/IronPython/Runtime/Binding/PythonBinder.cs#L85>that calls it.  If
> the interface is not visible, it tries to return it's base type which is
> null. If I just return the interface out of the GetVisibleType method before
> it hits null, the message is displayed as intended.
>
> It seems logic is needed to special case interfaces and/or handle the
> PrivateBindings option but I don't know enough to say.
>
> Richard
>
> On Sun, Jan 9, 2011 at 4:42 AM, Leo Carbajal <desleo at gmail.com> wrote:
>
>> Sorry to spam the list, but I did some more tracking on this and figured
>> something out. I downgraded from 2.7b1 to 2.6.2 and my original example
>> worked just fine in. I thought my woes were over, and then I ran into a
>> similar problem in 2.6.2. It appears that IPy cannot cast an object to a
>> different type, specifically an interface in 2.6.2, when the class is
>> internal and you're working with PrivateBinding = true
>>
>> I logged it as http://ironpython.codeplex.com/workitem/29939 with the
>> following example:
>>
>> internal interface IExample
>> {
>>     string Message { get; set; }
>> }
>>
>> internal class Avatar : IExample
>> {
>>     public string Message { get; set;}
>>
>>     public Avatar()
>>     {
>>         Message = "I am an avatar.";
>>     }
>>
>>     public void Hello(Avatar avatar)
>>     {
>>         Console.WriteLine("From Hello: " + Message);
>>     }
>>
>>     public void Hi(IExample avatar)
>>     {
>>         Console.WriteLine("From Hi: " + Message);
>>     }
>> }
>>
>> Using the following python code:
>> avatar = Avatar()
>> avatar.Hello(avatar)
>> avatar.Hi(avatar)
>>
>> avatar.Hello prints it's message as expected, but avatar.Hi fails with: System
>> Error: object reference not set to instance of object.
>>
>> On Sat, Jan 8, 2011 at 6:07 PM, Leo Carbajal <desleo at gmail.com> wrote:
>>
>>> Ok, here's a clarification.
>>>
>>> Say you have this class:
>>>
>>> internal class ZMPReporter : IReporter
>>>     {
>>>         public string Setting { get; set; }
>>>
>>>         internal void Trixery(string mes, string mes1, string mes2, bool
>>> thing)
>>>         {
>>>             Flash(mes, mes1, mes2, thing);
>>>         }
>>>
>>>         public void Flash(string sender, string message, string
>>> recipient, bool isAuthor)
>>>         {
>>>             ...
>>>         }
>>>     }
>>>
>>> It's a property of another class. In C# I would use it as follows:
>>> caller.Reporter.Flash(..parameters..)
>>>
>>> If I call it in a normal IPy engine it fails to even recognize the caller
>>> variable, which is fine and totally expected (and desired). In the
>>> PrivateBinding scenario described I can call
>>>
>>> caller.Reporter.Setting and get the text data perfectly. When I try to
>>> call caller.Reporter.Flash(), though, I get the System Error: object
>>> reference not set problem. However, I can call
>>> caller.Report._ZMPReporter__Trixery() just fine, which in turn calls Flash
>>> for me.
>>>
>>> I don't mind using the name mangling overly, but I do mind having to make
>>> internal proxies for perfectly good, already existing, functions. I can't
>>> just make those methods internal because the IReporter interface demands
>>> that they be public. If this was the only class that might give me problems
>>> I might even look for a way around that, but the entire project uses
>>> Interfaces extensively.
>>>
>>> On Sat, Jan 8, 2011 at 5:36 PM, Leo Carbajal <desleo at gmail.com> wrote:
>>>
>>>> Hello all,
>>>>
>>>> Almost I thought I could have my cake and eat it too. I have a large
>>>> client-server project written in C# that I wanted to be able to script with
>>>> IronPython. The biggest requirement was that I wanted external admins to be
>>>> able to provide scripts for the server to augment its functions. However, I
>>>> don't want them to have full access to the server API so I resigned myself
>>>> to write the project with everything Internal and then build public facing
>>>> classes for the functionality I wanted to expose. This, I know, to work
>>>> fine.
>>>>
>>>> however, I still want to be able to use scripts on the server myself,
>>>> for other things. I ended up using two engines, one with PrivateBinding on
>>>> and one without. The one with PrivateBinding set to true can see all private
>>>> and internal members but whenever I try to call a function from IronPython I
>>>> get an exception of "System Error: Object reference not set to an instance
>>>> of an object." It's weird because I can call on properties and get their
>>>> values, but not functions. If I do a dir() on the class, and the member,
>>>> IronPython can clearly see what they are and that they exist. If it helps,
>>>> the class i'm trying to access is internal but has all public members (for
>>>> interfaces).
>>>>
>>>> I guess my question is whether this behavior is intentional or not.
>>>> Being able to use my API on one engine for actual server work while
>>>> providing a different one for plugin\event hook writers, would help
>>>> tremendously.
>>>>
>>>
>>>
>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.ironpython.com
>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>
>>
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20110109/f60a7e4b/attachment.html>


More information about the Ironpython-users mailing list