def test_jitclass_usage_from_python(self): Float2AndArray = self._make_Float2AndArray() @njit def identity(obj): return obj @njit def retrieve_attributes(obj): return obj.x, obj.y, obj.arr arr = np.arange(10, dtype=np.float32) obj = Float2AndArray(1, 2, arr) obj_meminfo = _get_meminfo(obj) self.assertEqual(obj_meminfo.refcount, 2) self.assertEqual(obj_meminfo.data, _box.box_get_dataptr(obj)) self.assertEqual(obj._numba_type_.class_type, Float2AndArray.class_type) # Use jit class instance in numba other = identity(obj) other_meminfo = _get_meminfo(other) # duplicates MemInfo object to obj self.assertEqual(obj_meminfo.refcount, 4) self.assertEqual(other_meminfo.refcount, 4) self.assertEqual(other_meminfo.data, _box.box_get_dataptr(other)) self.assertEqual(other_meminfo.data, obj_meminfo.data) # Check dtor del other, other_meminfo self.assertEqual(obj_meminfo.refcount, 2) # Check attributes out_x, out_y, out_arr = retrieve_attributes(obj) self.assertEqual(out_x, 1) self.assertEqual(out_y, 2) self.assertIs(out_arr, arr) # Access attributes from python self.assertEqual(obj.x, 1) self.assertEqual(obj.y, 2) self.assertIs(obj.arr, arr) # Access methods from python self.assertEqual(obj.add(123), 123) self.assertEqual(obj.x, 1 + 123) self.assertEqual(obj.y, 2 + 123) # Setter from python obj.x = 333 obj.y = 444 obj.arr = newarr = np.arange(5, dtype=np.float32) self.assertEqual(obj.x, 333) self.assertEqual(obj.y, 444) self.assertIs(obj.arr, newarr)
def test_c_structure(self): spec = OrderedDict() spec['a'] = int32 spec['b'] = int16 spec['c'] = float64 @jitclass(spec) class Struct(object): def __init__(self, a, b, c): self.a = a self.b = b self.c = c st = Struct(0xabcd, 0xef, 3.1415) class CStruct(ctypes.Structure): _fields_ = [ ('a', ctypes.c_int32), ('b', ctypes.c_int16), ('c', ctypes.c_double), ] ptr = ctypes.c_void_p(_box.box_get_dataptr(st)) cstruct = ctypes.cast(ptr, ctypes.POINTER(CStruct))[0] self.assertEqual(cstruct.a, st.a) self.assertEqual(cstruct.b, st.b) self.assertEqual(cstruct.c, st.c)