diff --git a/src/util.rs b/src/util.rs index 3b451bd5..ba011c1a 100644 --- a/src/util.rs +++ b/src/util.rs @@ -125,7 +125,20 @@ macro_rules! str_hash { }; } -#[cfg(Py_3_10)] +#[cfg(Py_3_12)] +macro_rules! pydict_contains { + ($obj1:expr, $obj2:expr) => { + unsafe { + pyo3_ffi::_PyDict_Contains_KnownHash( + pyo3_ffi::PyType_GetDict($obj1), + $obj2, + (*$obj2.cast::()).hash, + ) == 1 + } + }; +} + +#[cfg(all(Py_3_10, not(Py_3_12)))] macro_rules! pydict_contains { ($obj1:expr, $obj2:expr) => { unsafe { diff --git a/test/test_default.py b/test/test_default.py index d1e95587..547fce8c 100644 --- a/test/test_default.py +++ b/test/test_default.py @@ -275,3 +275,15 @@ def default(obj): orjson.dumps(ref, default=default) assert sys.getrefcount(ref) == 2 # one for ref, one for default + + def test_default_set(self): + """ + dumps() default function with set + """ + + def default(obj): + if isinstance(obj, set): + return list(obj) + raise TypeError + + assert orjson.dumps({1, 2}, default=default) == b"[1,2]"