@@ -218,6 +218,53 @@ def test_slots_initialized(self):
218
218
tester = TestSlotsInitialized (2012 , 4 , 4 )
219
219
assert tester .year == 2012 , "year was %s " % tester .year
220
220
221
+ def test_float_subclass (self ):
222
+ TestFloatSubclass = CPyExtType ("TestFloatSubclass" ,
223
+ """
224
+ static PyTypeObject* testFloatSubclassPtr = NULL;
225
+
226
+ static PyObject* new_fp(double val) {
227
+ PyFloatObject* fp = PyObject_New(PyFloatObject, testFloatSubclassPtr);
228
+ fp->ob_fval = val;
229
+ Py_XINCREF(fp);
230
+ return (PyObject*)fp;
231
+ }
232
+
233
+ static PyObject* fp_tpnew(PyTypeObject* type, PyObject* args, PyObject* kwargs) {
234
+ double dval = 0.0;
235
+ if (!PyArg_ParseTuple(args, "d", &dval)) {{
236
+ return NULL;
237
+ }}
238
+ return new_fp(dval);
239
+ }
240
+
241
+ static PyObject* fp_add(PyObject* l, PyObject* r) {
242
+ Py_XINCREF(l);
243
+ Py_XINCREF(r);
244
+ if (PyFloat_Check(l)) {
245
+ if (PyFloat_Check(r)) {
246
+ return new_fp(PyFloat_AS_DOUBLE(l) + PyFloat_AS_DOUBLE(r));
247
+ } else if (PyLong_Check(r)) {
248
+ return new_fp(PyFloat_AS_DOUBLE(l) + PyLong_AsLong(r));
249
+ }
250
+ } else if (PyLong_Check(l)) {
251
+ if (PyFloat_Check(r)) {
252
+ return new_fp(PyLong_AsLong(l) + PyFloat_AS_DOUBLE(r));
253
+ } else if (PyLong_Check(r)) {
254
+ return new_fp(PyLong_AsLong(l) + PyLong_AsLong(r));
255
+ }
256
+ }
257
+ return Py_NotImplemented;
258
+ }
259
+ """ ,
260
+ tp_base = "&PyFloat_Type" ,
261
+ nb_add = "fp_add" ,
262
+ tp_new = "fp_tpnew" ,
263
+ post_ready_code = "testFloatSubclassPtr = &TestFloatSubclassType;"
264
+ )
265
+ tester = TestFloatSubclass (41.0 )
266
+ res = tester + 1
267
+ assert res == 42.0 , "expected 42.0 but was %s" % res
221
268
222
269
223
270
class TestObjectFunctions (CPyExtTestCase ):
0 commit comments