Archived
This forum has been archived. Please start a new discussion on GitHub.
IcePy: Check types in generated compare methods
in Bug Reports
(Using Ice 3.3.1 on Linux)
Consider this Slice definition:
Now observe this Python session:
This is because the Value.__cmp__() method generated by slice2py tries to access the 'v' member of the right-hand-side object even though it may not have one:
The code should check the type of 'other' before accessing 'Value'-specific members:
With the comparison fixed like this, the example works as expected:
Consider this Slice definition:
module Demo { struct Value { float v; }; };
Now observe this Python session:
>>> from Demo import * >>> l = ['a', 5, Value(2.0)] >>> 'a' in l True >>> 5 in l True >>> Value(2.0) in l Traceback (most recent call last): File "<stdin>", line 1, in <module> File "Demo_ice.py", line 36, in __cmp__ if self.v < other.v: AttributeError: 'str' object has no attribute 'v'
This is because the Value.__cmp__() method generated by slice2py tries to access the 'v' member of the right-hand-side object even though it may not have one:
def __cmp__(self, other): if other == None: return 1 if self.v < other.v: return -1 elif self.v > other.v: return 1 return 0
The code should check the type of 'other' before accessing 'Value'-specific members:
def __cmp__(self, other): if other == None: return 1 if not isinstance(other, _M_Demo.Value): return NotImplemented if self.v < other.v: return -1 elif self.v > other.v: return 1 return 0
With the comparison fixed like this, the example works as expected:
>>> 'a' in l True >>> 5 in l True >>> Value(2.0) in l True >>> Value(2.5) in l False
0
Comments
-
Thanks for the report. We'll consider this for the next release.0