# HG changeset patch
# User ijl <ijl@mailbox.org>
# Date 1594676920 0
#      Mon Jul 13 21:48:40 2020 +0000
# Node ID a9eff9f72d1e62ae90f6510c38eff135fdd64790
# Parent  282ba2dc0edafdc6da438a644f3b31da020ad334
Fix serializing empty dataclass

diff --git a/src/dataclass.rs b/src/dataclass.rs
--- a/src/dataclass.rs
+++ b/src/dataclass.rs
@@ -46,6 +46,9 @@
         let fields = ffi!(PyObject_GetAttr(self.ptr, DATACLASS_FIELDS_STR));
         ffi!(Py_DECREF(fields));
         let len = unsafe { PyDict_GET_SIZE(fields) as usize };
+        if unlikely!(len == 0) {
+            return serializer.serialize_map(Some(0)).unwrap().end();
+        }
         let mut map = serializer.serialize_map(None).unwrap();
         let mut pos = 0isize;
         let mut str_size: pyo3::ffi::Py_ssize_t = 0;
diff --git a/src/encode.rs b/src/encode.rs
--- a/src/encode.rs
+++ b/src/encode.rs
@@ -366,6 +366,9 @@
                 if !dict.is_null() {
                     ffi!(Py_DECREF(dict));
                     let len = unsafe { PyDict_GET_SIZE(dict) as usize };
+                    if unlikely!(len == 0) {
+                        return serializer.serialize_map(Some(0)).unwrap().end();
+                    }
                     let mut map = serializer.serialize_map(None).unwrap();
                     let mut pos = 0isize;
                     let mut str_size: pyo3::ffi::Py_ssize_t = 0;
diff --git a/test/test_dataclass.py b/test/test_dataclass.py
--- a/test/test_dataclass.py
+++ b/test/test_dataclass.py
@@ -15,6 +15,18 @@
 
 
 @dataclass
+class EmptyDataclass:
+    pass
+
+
+@dataclass
+class EmptyDataclassSlots:
+    __slots__ = ()
+    pass
+
+
+
+@dataclass
 class Dataclass1:
     name: str
     number: int
@@ -115,6 +127,22 @@
         with self.assertRaises(orjson.JSONEncodeError):
             orjson.dumps(obj1)
 
+    def test_dataclass_empty(self):
+        """
+        dumps() no attributes
+        """
+        self.assertEqual(
+            orjson.dumps(EmptyDataclass()), b"{}",
+        )
+
+    def test_dataclass_empty_slots(self):
+        """
+        dumps() no attributes slots
+        """
+        self.assertEqual(
+            orjson.dumps(EmptyDataclassSlots()), b"{}",
+        )
+
     def test_dataclass_default_arg(self):
         """
         dumps() dataclass default arg