@@ -69,7 +69,7 @@ typedef struct {
69
69
* It is not owned, do not release it. */
70
70
zval index ;
71
71
72
- zval object ;
72
+ zend_object * object ;
73
73
zend_fcall_info_cache startElementHandler ;
74
74
zend_fcall_info_cache endElementHandler ;
75
75
zend_fcall_info_cache characterDataHandler ;
@@ -359,8 +359,8 @@ static void xml_parser_free_obj(zend_object *object)
359
359
if (parser -> baseURI ) {
360
360
efree (parser -> baseURI );
361
361
}
362
- if (! Z_ISUNDEF ( parser -> object ) ) {
363
- zval_ptr_dtor ( & parser -> object );
362
+ if (parser -> object ) {
363
+ OBJ_RELEASE ( parser -> object );
364
364
}
365
365
366
366
zend_object_std_dtor (& parser -> std );
@@ -371,7 +371,7 @@ static HashTable *xml_parser_get_gc(zend_object *object, zval **table, int *n)
371
371
xml_parser * parser = xml_parser_from_obj (object );
372
372
373
373
zend_get_gc_buffer * gc_buffer = zend_get_gc_buffer_create ();
374
- zend_get_gc_buffer_add_zval (gc_buffer , & parser -> object );
374
+ zend_get_gc_buffer_add_obj (gc_buffer , parser -> object );
375
375
if (ZEND_FCC_INITIALIZED (parser -> startElementHandler )) {
376
376
zend_get_gc_buffer_add_fcc (gc_buffer , & parser -> startElementHandler );
377
377
}
@@ -1062,8 +1062,13 @@ PHP_FUNCTION(xml_set_object)
1062
1062
1063
1063
parser = Z_XMLPARSER_P (pind );
1064
1064
1065
- zval_ptr_dtor (& parser -> object );
1066
- ZVAL_OBJ_COPY (& parser -> object , Z_OBJ_P (mythis ));
1065
+ if (parser -> object ) {
1066
+ // TODO Check methods exist in set FCCs
1067
+ OBJ_RELEASE (parser -> object );
1068
+ }
1069
+
1070
+ parser -> object = Z_OBJ_P (mythis );
1071
+ GC_ADDREF (parser -> object );
1067
1072
1068
1073
RETURN_TRUE ;
1069
1074
}
@@ -1080,12 +1085,12 @@ static bool php_xml_check_string_method_arg(
1080
1085
return true;
1081
1086
}
1082
1087
1083
- if (Z_ISUNDEF ( parser -> object ) ) {
1088
+ if (! parser -> object ) {
1084
1089
zend_argument_value_error (arg_num , "an object must be set via xml_set_object() to be able to lookup method" );
1085
1090
return false;
1086
1091
}
1087
1092
1088
- zend_class_entry * ce = Z_OBJCE ( parser -> object ) ;
1093
+ zend_class_entry * ce = parser -> object -> ce ;
1089
1094
zend_string * lc_name = zend_string_tolower (method_name );
1090
1095
zend_function * method_ptr = zend_hash_find_ptr (& ce -> function_table , lc_name );
1091
1096
zend_string_release_ex (lc_name , 0 );
@@ -1097,7 +1102,7 @@ static bool php_xml_check_string_method_arg(
1097
1102
parser_handler_fcc -> function_handler = method_ptr ;
1098
1103
parser_handler_fcc -> calling_scope = ce ;
1099
1104
parser_handler_fcc -> called_scope = ce ;
1100
- parser_handler_fcc -> object = Z_OBJ ( parser -> object ) ;
1105
+ parser_handler_fcc -> object = parser -> object ;
1101
1106
1102
1107
return true;
1103
1108
}
0 commit comments