diff --git a/stdlib/internal/internal.codon b/stdlib/internal/internal.codon index 092ff896..f627d23d 100644 --- a/stdlib/internal/internal.codon +++ b/stdlib/internal/internal.codon @@ -2,7 +2,8 @@ from internal.gc import ( free, register_finalizer, seq_alloc, - seq_alloc_atomic, seq_gc_add_roots, alloc_uncollectable + seq_alloc_atomic, seq_gc_add_roots, alloc_uncollectable, + alloc_atomic_uncollectable, atomic ) @pure diff --git a/stdlib/internal/python.codon b/stdlib/internal/python.codon index 8660e130..c207e343 100644 --- a/stdlib/internal/python.codon +++ b/stdlib/internal/python.codon @@ -1897,8 +1897,12 @@ class _PyWrap: return cobj() def wrap_to_py(o) -> cobj: - pytype = _PyWrap.py_type(type(o)) - obj = Ptr[PyWrapper[type(o)]](alloc_uncollectable(sizeof(type(o)))) + O = type(o) + P = PyWrapper[O] + sz = sizeof(P) + pytype = _PyWrap.py_type(O) + mem = alloc_atomic_uncollectable(sz) if atomic(O) else alloc_uncollectable(sz) + obj = Ptr[P](mem.as_byte()) obj[0] = PyWrapper(PyObject(1, pytype), o) return obj.as_byte()