bt2: field.py: raise ValueError when setting out of range value to Integer
[babeltrace.git] / src / bindings / python / bt2 / bt2 / field.py
index 1e2ceac30efa0c6ab80cef0f5db7f84f6e6e2913..fbe609eedb473377a3a16ff55ac4091540626bc0 100644 (file)
@@ -330,7 +330,13 @@ class _IntegerFieldConst(_IntegralFieldConst, _FieldConst):
 
 
 class _IntegerField(_IntegerFieldConst, _IntegralField, _Field):
-    pass
+    def _check_range(self, value):
+        if not (value >= self._lower_bound and value <= self._upper_bound):
+            raise ValueError(
+                "Value {} is outside valid range [{}, {}]".format(
+                    value, self._lower_bound, self._upper_bound
+                )
+            )
 
 
 class _UnsignedIntegerFieldConst(_IntegerFieldConst, _FieldConst):
@@ -341,10 +347,7 @@ class _UnsignedIntegerFieldConst(_IntegerFieldConst, _FieldConst):
         if not isinstance(value, numbers.Integral):
             raise TypeError('expecting an integral number object')
 
-        value = int(value)
-        utils._check_uint64(value)
-
-        return value
+        return int(value)
 
     @property
     def _value(self):
@@ -356,10 +359,21 @@ class _UnsignedIntegerField(_UnsignedIntegerFieldConst, _IntegerField, _Field):
 
     def _set_value(self, value):
         value = self._value_to_int(value)
+
+        self._check_range(value)
+
         native_bt.field_integer_unsigned_set_value(self._ptr, value)
 
     value = property(fset=_set_value)
 
+    @property
+    def _lower_bound(self):
+        return 0
+
+    @property
+    def _upper_bound(self):
+        return (2 ** self.cls.field_value_range) - 1
+
 
 class _SignedIntegerFieldConst(_IntegerFieldConst, _FieldConst):
     _NAME = 'Const signed integer'
@@ -369,10 +383,7 @@ class _SignedIntegerFieldConst(_IntegerFieldConst, _FieldConst):
         if not isinstance(value, numbers.Integral):
             raise TypeError('expecting an integral number object')
 
-        value = int(value)
-        utils._check_int64(value)
-
-        return value
+        return int(value)
 
     @property
     def _value(self):
@@ -384,10 +395,21 @@ class _SignedIntegerField(_SignedIntegerFieldConst, _IntegerField, _Field):
 
     def _set_value(self, value):
         value = self._value_to_int(value)
+
+        self._check_range(value)
+
         native_bt.field_integer_signed_set_value(self._ptr, value)
 
     value = property(fset=_set_value)
 
+    @property
+    def _lower_bound(self):
+        return -1 * (2 ** (self.cls.field_value_range - 1))
+
+    @property
+    def _upper_bound(self):
+        return (2 ** (self.cls.field_value_range - 1)) - 1
+
 
 class _RealFieldConst(_NumericFieldConst, numbers.Real):
     _NAME = 'Const real'
This page took 0.024332 seconds and 4 git commands to generate.