Skip to content

Commit a4b44eb

Browse files
committed
[GR-27740] Support hash for native float subtype.
PullRequest: graalpython/2044
2 parents 51dfb5b + 48ca607 commit a4b44eb

File tree

2 files changed

+15
-6
lines changed
  • graalpython

2 files changed

+15
-6
lines changed

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,13 +326,13 @@ def test_float_subclass(self):
326326
TestFloatSubclass = CPyExtType("TestFloatSubclass",
327327
"""
328328
static PyTypeObject* testFloatSubclassPtr = NULL;
329-
329+
330330
static PyObject* new_fp(double val) {
331331
PyFloatObject* fp = PyObject_New(PyFloatObject, testFloatSubclassPtr);
332332
fp->ob_fval = val;
333333
return (PyObject*)fp;
334334
}
335-
335+
336336
static PyObject* fp_tpnew(PyTypeObject* type, PyObject* args, PyObject* kwargs) {
337337
double dval = 0.0;
338338
Py_XINCREF(args);
@@ -341,7 +341,7 @@ def test_float_subclass(self):
341341
}}
342342
return new_fp(dval);
343343
}
344-
344+
345345
static PyObject* fp_add(PyObject* l, PyObject* r) {
346346
if (PyFloat_Check(l)) {
347347
if (PyFloat_Check(r)) {
@@ -360,15 +360,16 @@ def test_float_subclass(self):
360360
}
361361
""",
362362
cmembers="PyFloatObject base;",
363-
tp_base="&PyFloat_Type",
363+
tp_base="&PyFloat_Type",
364364
nb_add="fp_add",
365365
tp_new="fp_tpnew",
366366
post_ready_code="testFloatSubclassPtr = &TestFloatSubclassType; Py_INCREF(testFloatSubclassPtr);"
367367
)
368368
tester = TestFloatSubclass(41.0)
369369
res = tester + 1
370370
assert res == 42.0, "expected 42.0 but was %s" % res
371-
371+
assert hash(tester) != 0
372+
372373
def test_custom_basicsize(self):
373374
TestCustomBasicsize = CPyExtType("TestCustomBasicsize",
374375
'''

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
import com.oracle.graal.python.runtime.formatting.InternalFormat.Spec;
110110
import com.oracle.truffle.api.CompilerDirectives;
111111
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
112+
import com.oracle.truffle.api.dsl.Bind;
112113
import com.oracle.truffle.api.dsl.Cached;
113114
import com.oracle.truffle.api.dsl.Cached.Shared;
114115
import com.oracle.truffle.api.dsl.Fallback;
@@ -654,9 +655,16 @@ protected static boolean accepts(Object obj) {
654655
@TypeSystemReference(PythonArithmeticTypes.class)
655656
abstract static class HashNode extends PythonUnaryBuiltinNode {
656657
@Specialization
657-
static long hashDouble(double self) {
658+
static long doDouble(double self) {
658659
return PyObjectHashNode.hash(self);
659660
}
661+
662+
@Specialization(guards = "dval != null")
663+
static long doNativeFloat(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnings("unused") PythonNativeObject object,
664+
@SuppressWarnings("unused") @Cached FromNativeSubclassNode getFloat,
665+
@Bind("getFloat.execute(frame, object)") Double dval) {
666+
return PyObjectHashNode.hash(dval);
667+
}
660668
}
661669

662670
@Builtin(name = "fromhex", minNumOfPositionalArgs = 2, isClassmethod = true)

0 commit comments

Comments
 (0)