This structure looked familiar to me:
+-------+
| *---+-> hidden class (aka map)
+-------+
| *---+-> out-of-object properties storage
+-------+
| *---+-> elements storage
+-------+
| 1 +-+
+-------+ |
| 2 | |
+-------+ > N slots reserved for in-object properties
~~~~~~~~~ |
+-------+ |
| N +-+
+-------+
That's because it's very close to PHP 7's implementation of objects (PHP has "traditional" class-based OOP): zend_object:
+-------------+-------------+------------+-----------------------------------------+
| gc_info | flags | IS_OBJECT | refcount (32-bit) |
+-------------+-------------+------------+-----------------------------------------+
| UNUSED (32-bit) | handle (32-bit) FIXME |
+----------------------------------------+-----------------------------------------+
| ce - pointer to zend_class_entry (64-bit or 32-bit) |
+----------------------------------------------------------------------------------+
| handlers - pointer to object handlers (64-bit or 32-bit) |
+----------------------------------------------------------------------------------+
| properties - pointer to HashTable of dynamic properties (64-bit or 32-bit) |
+----------------------------------------------------------------------------------+
| guards - pointer to HashTable used for recursion protection (64-bit or 32-bit) |
+----------------------------------------------------------------------------------+
| properties_table[0] - embedded cell of the first declared property (128-bit) |
+----------------------------------------------------------------------------------+
| ... |
+----------------------------------------------------------------------------------+
| properties_table[N] - embedded cell of the last declared property (128-bit) |
+----------------------------------------------------------------------------------+
| optional user data of internal classes (variable size) |
+----------------------------------------------------------------------------------+
63 48 47 40 39 32 31 0
(source: https://wiki.php.net/phpng-int#is_object)PHP 7 objects contain N slots for properties defined in the class, plus a hashtable for any additional properties, just like V8 objects.
I guess it's an obvious way to design it.