1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

xml: Don't make copies of the object, remove self-reference (#20471)

This commit is contained in:
Niels Dossche
2025-11-15 01:02:11 +01:00
committed by GitHub
parent 11070509ae
commit 0375060d16

View File

@@ -64,11 +64,7 @@ typedef struct {
XML_Parser parser;
XML_Char *target_encoding;
/* Reference to the object itself, for convenience.
* It is not owned, do not release it. */
zval index;
zend_object *object;
zend_object *object; /* object with handlers */
zend_fcall_info_cache startElementHandler;
zend_fcall_info_cache endElementHandler;
zend_fcall_info_cache characterDataHandler;
@@ -641,7 +637,7 @@ void xml_startElementHandler(void *userData, const XML_Char *name, const XML_Cha
if (ZEND_FCC_INITIALIZED(parser->startElementHandler)) {
zval args[3];
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
ZVAL_STR(&args[1], xml_stripped_tag(tag_name, parser->toffset));
array_init(&args[2]);
@@ -660,7 +656,6 @@ void xml_startElementHandler(void *userData, const XML_Char *name, const XML_Cha
}
zend_call_known_fcc(&parser->startElementHandler, /* retval */ NULL, /* param_count */ 3, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
zval_ptr_dtor(&args[2]);
}
@@ -742,11 +737,10 @@ void xml_endElementHandler(void *userData, const XML_Char *name)
if (ZEND_FCC_INITIALIZED(parser->endElementHandler)) {
zval args[2];
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
ZVAL_STR(&args[1], xml_stripped_tag(tag_name, parser->toffset));
zend_call_known_fcc(&parser->endElementHandler, /* retval */ NULL, /* param_count */ 2, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
}
@@ -803,11 +797,10 @@ void xml_characterDataHandler(void *userData, const XML_Char *s, int len)
if (ZEND_FCC_INITIALIZED(parser->characterDataHandler)) {
zval args[2];
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
xml_xmlchar_zval(s, len, parser->target_encoding, &args[1]);
zend_call_known_fcc(&parser->characterDataHandler, /* retval */ NULL, /* param_count */ 2, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
}
@@ -911,12 +904,11 @@ void xml_processingInstructionHandler(void *userData, const XML_Char *target, co
zval args[3];
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
xml_xmlchar_zval(target, 0, parser->target_encoding, &args[1]);
xml_xmlchar_zval(data, 0, parser->target_encoding, &args[2]);
zend_call_known_fcc(&parser->processingInstructionHandler, /* retval */ NULL, /* param_count */ 3, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
zval_ptr_dtor_str(&args[2]);
}
@@ -933,11 +925,10 @@ void xml_defaultHandler(void *userData, const XML_Char *s, int len)
zval args[2];
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
xml_xmlchar_zval(s, len, parser->target_encoding, &args[1]);
zend_call_known_fcc(&parser->defaultHandler, /* retval */ NULL, /* param_count */ 2, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
}
/* }}} */
@@ -955,7 +946,7 @@ void xml_unparsedEntityDeclHandler(void *userData,
zval args[6];
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
xml_xmlchar_zval(entityName, 0, parser->target_encoding, &args[1]);
xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]);
xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]);
@@ -963,7 +954,6 @@ void xml_unparsedEntityDeclHandler(void *userData,
xml_xmlchar_zval(notationName, 0, parser->target_encoding, &args[5]);
zend_call_known_fcc(&parser->unparsedEntityDeclHandler, /* retval */ NULL, /* param_count */ 6, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
zval_ptr_dtor_str(&args[2]);
zval_ptr_dtor_str(&args[3]);
@@ -984,14 +974,13 @@ void xml_notationDeclHandler(void *userData, const XML_Char *notationName,
zval args[5];
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
xml_xmlchar_zval(notationName, 0, parser->target_encoding, &args[1]);
xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]);
xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]);
xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]);
zend_call_known_fcc(&parser->notationDeclHandler, /* retval */ NULL, /* param_count */ 5, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
zval_ptr_dtor_str(&args[2]);
zval_ptr_dtor_str(&args[3]);
@@ -1013,14 +1002,13 @@ int xml_externalEntityRefHandler(XML_Parser userData, const XML_Char *openEntity
zval args[5];
zval retval;
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
xml_xmlchar_zval(openEntityNames, 0, parser->target_encoding, &args[1]);
xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]);
xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]);
xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]);
zend_call_known_fcc(&parser->externalEntityRefHandler, /* retval */ &retval, /* param_count */ 5, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
zval_ptr_dtor_str(&args[2]);
zval_ptr_dtor_str(&args[3]);
@@ -1048,12 +1036,11 @@ void xml_startNamespaceDeclHandler(void *userData,const XML_Char *prefix, const
zval args[3];
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
xml_xmlchar_zval(prefix, 0, parser->target_encoding, &args[1]);
xml_xmlchar_zval(uri, 0, parser->target_encoding, &args[2]);
zend_call_known_fcc(&parser->startNamespaceDeclHandler, /* retval */ NULL, /* param_count */ 3, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
zval_ptr_dtor_str(&args[2]);
}
@@ -1070,11 +1057,10 @@ void xml_endNamespaceDeclHandler(void *userData, const XML_Char *prefix)
zval args[2];
ZVAL_COPY(&args[0], &parser->index);
ZVAL_OBJ(&args[0], &parser->std);
xml_xmlchar_zval(prefix, 0, parser->target_encoding, &args[1]);
zend_call_known_fcc(&parser->endNamespaceDeclHandler, /* retval */ NULL, /* param_count */ 2, args, /* named_params */ NULL);
zval_ptr_dtor(&args[0]);
zval_ptr_dtor_str(&args[1]);
}
/* }}} */
@@ -1133,7 +1119,6 @@ static void php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAMETERS, int ns_supp
parser->parsehuge = false; /* It's the default for BC & DoS protection */
XML_SetUserData(parser->parser, parser);
ZVAL_COPY_VALUE(&parser->index, return_value);
}
/* }}} */