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:
@@ -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);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user