@@ -123,10 +123,25 @@ static zval *xmlreader_get_property_ptr_ptr(zend_object *object, zend_string *na
123
123
}
124
124
/* }}} */
125
125
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
+
126
141
static int xmlreader_has_property (zend_object * object , zend_string * name , int type , void * * cache_slot )
127
142
{
128
143
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 );
130
145
131
146
if (hnd != NULL ) {
132
147
if (type == ZEND_PROPERTY_EXISTS ) {
@@ -162,7 +177,7 @@ static zval *xmlreader_read_property(zend_object *object, zend_string *name, int
162
177
{
163
178
zval * retval = NULL ;
164
179
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 );
166
181
167
182
if (hnd != NULL ) {
168
183
if (xmlreader_property_reader (obj , hnd , rv ) == FAILURE ) {
@@ -181,7 +196,7 @@ static zval *xmlreader_read_property(zend_object *object, zend_string *name, int
181
196
/* {{{ xmlreader_write_property */
182
197
static zval * xmlreader_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot )
183
198
{
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 );
185
200
186
201
if (hnd != NULL ) {
187
202
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
195
210
196
211
void xmlreader_unset_property (zend_object * object , zend_string * name , void * * cache_slot )
197
212
{
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 );
199
214
200
215
if (hnd != NULL ) {
201
216
zend_throw_error (NULL , "Cannot unset %s::$%s" , ZSTR_VAL (object -> ce -> name ), ZSTR_VAL (name ));
0 commit comments