@@ -123,10 +123,25 @@ static zval *xmlreader_get_property_ptr_ptr(zend_object *object, zend_string *na
123123}
124124/* }}} */
125125
126+ static xmlreader_prop_handler * xmlreader_get_prop_handler (zend_string * name , void * * cache_slot )
127+ {
128+ /* We don't store the `ce` as that may match with how the std cache slot code works in the fallback,
129+ * instead use the prop handlers table as `ce`. */
130+ if (cache_slot && cache_slot [0 ] == & xmlreader_prop_handlers ) {
131+ return cache_slot [1 ];
132+ } else {
133+ xmlreader_prop_handler * hnd = zend_hash_find_ptr (& xmlreader_prop_handlers , name );
134+ if (hnd != NULL && cache_slot ) {
135+ CACHE_POLYMORPHIC_PTR_EX (cache_slot , & xmlreader_prop_handlers , hnd );
136+ }
137+ return hnd ;
138+ }
139+ }
140+
126141static int xmlreader_has_property (zend_object * object , zend_string * name , int type , void * * cache_slot )
127142{
128143 xmlreader_object * obj = php_xmlreader_fetch_object (object );
129- xmlreader_prop_handler * hnd = zend_hash_find_ptr ( & xmlreader_prop_handlers , name );
144+ xmlreader_prop_handler * hnd = xmlreader_get_prop_handler ( name , cache_slot );
130145
131146 if (hnd != NULL ) {
132147 if (type == ZEND_PROPERTY_EXISTS ) {
@@ -162,7 +177,7 @@ static zval *xmlreader_read_property(zend_object *object, zend_string *name, int
162177{
163178 zval * retval = NULL ;
164179 xmlreader_object * obj = php_xmlreader_fetch_object (object );
165- xmlreader_prop_handler * hnd = zend_hash_find_ptr ( & xmlreader_prop_handlers , name );
180+ xmlreader_prop_handler * hnd = xmlreader_get_prop_handler ( name , cache_slot );
166181
167182 if (hnd != NULL ) {
168183 if (xmlreader_property_reader (obj , hnd , rv ) == FAILURE ) {
@@ -181,7 +196,7 @@ static zval *xmlreader_read_property(zend_object *object, zend_string *name, int
181196/* {{{ xmlreader_write_property */
182197static zval * xmlreader_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot )
183198{
184- xmlreader_prop_handler * hnd = zend_hash_find_ptr ( & xmlreader_prop_handlers , name );
199+ xmlreader_prop_handler * hnd = xmlreader_get_prop_handler ( name , cache_slot );
185200
186201 if (hnd != NULL ) {
187202 zend_readonly_property_modification_error_ex (ZSTR_VAL (object -> ce -> name ), ZSTR_VAL (name ));
@@ -195,7 +210,7 @@ static zval *xmlreader_write_property(zend_object *object, zend_string *name, zv
195210
196211void xmlreader_unset_property (zend_object * object , zend_string * name , void * * cache_slot )
197212{
198- xmlreader_prop_handler * hnd = zend_hash_find_ptr ( & xmlreader_prop_handlers , name );
213+ xmlreader_prop_handler * hnd = xmlreader_get_prop_handler ( name , cache_slot );
199214
200215 if (hnd != NULL ) {
201216 zend_throw_error (NULL , "Cannot unset %s::$%s" , ZSTR_VAL (object -> ce -> name ), ZSTR_VAL (name ));
0 commit comments