The previous code had the 32-bit object handle cast to a uint16_t and stuffed into o_subclassData.u16, so it would have crashed if more than 64K objects were passed through zend compat. With NativeData, you get to actually allocate space for that object handle. When I was explaining this to ptarjan, he said to make it int64_t, but if I thought about it myself I probably would have made the type the same as zend_object_handle (i.e. unsigned int).