First off just to make your life easier in the future the DebugView 
property on the expression is much better than the other view - it produces
something that looks like C#.

Ok, I think the types are actually different and the LHS is succeeding on 
one of ==, <, or >.  I say that because in MakeSortComparisonRule we do:

if (xType == yType && cTarget != SlotOrFunction.Empty) {

And if they were both old instances we'd do the ShouldCoerce check (which
would be true) and we'd generate the code which looks like the list.sort()
case.  You can check xType and yType in the debugger.  Better yet you can
drill into the meta objects in the types array and see the actual values the
rule is being created for.

The problem type I think is xType and it's probably some IronPython runtime 
type (because it defines __eq__ as well as op_LessThan and op_GreaterThan).
But I have no guesses as to what it is - every type I tried still went down the
__cmp__ path.  

So look at xType and those methods...  If it somehow is really an OldInstance
then something really strange is going on and it'd be interesting to see if 
xType
and yType are somehow different when they should be the same.

> -----Original Message-----
> From: ironpython-users-bounces+dinov=microsoft....@python.org
> [mailto:ironpython-users-bounces+dinov=microsoft....@python.org] On
> Behalf Of Slide
> Sent: Friday, March 30, 2012 5:08 AM
> To: ironpython-users@python.org
> Subject: Re: [Ironpython-users] Why does this happen?
> 
> Here's the expression for my case
> 
> {IIF(CallSiteBinder(Convert($arg0).__eq__(Convert(Unbox($arg1)))), 0,
> IIF(CallSiteBinder(op_LessThan(Convert($arg0),
> Convert(Unbox($arg1)))), -1,
> IIF(CallSiteBinder(op_GreaterThan(Convert($arg0),
> Convert(Unbox($arg1)))), 1, IIF((Not(((coerceResult =
> Convert($arg0).__coerce__(value(IronPython.Runtime.CodeContext),
> Convert(Unbox($arg1)))) Is OldInstance)) AndAlso ((coerceTuple =
> ValidateCoerceResult(coerceResult)) != null)), {var callres; ... },
> Convert(Convert($arg0).__cmp__(value(IronPython.Runtime.CodeContext),
> Convert(Unbox($arg1))))))))}
> 
> Here is the expression for the List.sort case
> 
> {IIF((Not(((coerceResult =
> Convert($arg0).__coerce__(value(IronPython.Runtime.CodeContext),
> Convert($arg1))) Is OldInstance)) AndAlso ((coerceTuple =
> ValidateCoerceResult(coerceResult)) != null)), {var callres; ... },
> Convert(Convert($arg0).__cmp__(value(IronPython.Runtime.CodeContext),
> Convert($arg1))))}
> 
> Is there more information from the DynamicMetaObject that would be helpful?
> 
> Thanks for your time, I appreciate you helping out those like me who don't 
> know
> much about the internals of IronPython.
> 
> slide
> 
> 
> On Thu, Mar 29, 2012 at 10:07 PM, Dino Viehland <di...@microsoft.com>
> wrote:
> > I'm actually not sure why it would happen.  The only thought I have is
> > if you're only doing one comparison, and comparing the same instance,
> > there's an object identity test which would prevent the __cmp__ call
> > from happening.  But I'm guessing that's not what's happening...
> >
> > Can you put a breakpoint in PythonProtocol.Operations.cs in
> > MakeSortComparisonRule and see what's returned from the call to
> > bodybuilder.GetMetaObject?  That'll give you the full expression tree
> > of the rule for doing the comparison.  There's supposed to be some
> > calls to __cmp__ in there - if they're not there maybe what is will provide 
> > some
> enlightenment.
> >
> >> -----Original Message-----
> >> From: ironpython-users-bounces+dinov=microsoft....@python.org
> >> [mailto:ironpython-users-bounces+dinov=microsoft....@python.org] On
> >> Behalf Of Slide
> >> Sent: Thursday, March 29, 2012 8:49 PM
> >> To: ironpython-users@python.org
> >> Subject: Re: [Ironpython-users] Why does this happen?
> >>
> >> Is Dino on vacation? He usually has good answers for these sorts of
> >> things :-) I still can't get the callsite to end up calling __cmp__
> >> like List.sort does. I'm not sure why that is the case. It looks like
> >> even the Python version of bisect has a similar issue though (it
> >> never calls __cmp__ either), so I think there is a bug somewhere.
> >>
> >> On Sat, Mar 24, 2012 at 8:51 PM, Slide <slide.o....@gmail.com> wrote:
> >> >
> >> > I am implementing a module in C#. This module does some comparison
> >> operations. One of the tests for this module has something like the 
> >> following:
> >> >
> >> > class CmpErr:
> >> >     def __cmp__(self, other):
> >> >         raise ZeroDivisionError
> >> >
> >> > x = [CmpErr(), CmpErr(), CmpErr()]
> >> > cSharpMethod(x)
> >> >
> >> > Inside cSharpMethod is when I do the comparison. The way I am doing
> >> > the comparison is taken from how its done in List.cs
> >> >
> >> > IComparer comparer =
> >> > PythonContext.GetContext(context).GetComparer(null,
> >> > GetComparisonType(context, list));
> >> >
> >> > Then I call comparer.Compare on the two items. In List.sort, this
> >> > eventually
> >> calls the __cmp__ method if I try adding a call to x.sort() instead
> >> of cSharpMethod, but from inside cSharpMethod, __cmp__ is never
> >> called and I can't figure out why.
> >> >
> >> > Any ideas on why this might be occuring?
> >> >
> >> > Thanks,
> >> >
> >> > slide
> >> >
> >> > --
> >> > Website: http://earl-of-code.com
> >>
> >>
> >>
> >>
> >> --
> >> Website: http://earl-of-code.com
> >> _______________________________________________
> >> Ironpython-users mailing list
> >> Ironpython-users@python.org
> >> http://mail.python.org/mailman/listinfo/ironpython-users
> >
> >
> 
> 
> 
> --
> Website: http://earl-of-code.com
> _______________________________________________
> Ironpython-users mailing list
> Ironpython-users@python.org
> http://mail.python.org/mailman/listinfo/ironpython-users
> 
> 



_______________________________________________
Ironpython-users mailing list
Ironpython-users@python.org
http://mail.python.org/mailman/listinfo/ironpython-users

Reply via email to