Skip to content

Commit 6ae0d25

Browse files
committed
xml: Don't make copies of the object, remove self-reference
1 parent 9483180 commit 6ae0d25

File tree

1 file changed

+11
-26
lines changed

1 file changed

+11
-26
lines changed

ext/xml/xml.c

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,7 @@ typedef struct {
6464
XML_Parser parser;
6565
XML_Char *target_encoding;
6666

67-
/* Reference to the object itself, for convenience.
68-
* It is not owned, do not release it. */
69-
zval index;
70-
71-
zend_object *object;
67+
zend_object *object; /* object with handlers */
7268
zend_fcall_info_cache startElementHandler;
7369
zend_fcall_info_cache endElementHandler;
7470
zend_fcall_info_cache characterDataHandler;
@@ -641,7 +637,7 @@ void xml_startElementHandler(void *userData, const XML_Char *name, const XML_Cha
641637

642638
if (ZEND_FCC_INITIALIZED(parser->startElementHandler)) {
643639
zval args[3];
644-
ZVAL_COPY(&args[0], &parser->index);
640+
ZVAL_OBJ(&args[0], &parser->std);
645641
ZVAL_STR(&args[1], xml_stripped_tag(tag_name, parser->toffset));
646642
array_init(&args[2]);
647643

@@ -660,7 +656,6 @@ void xml_startElementHandler(void *userData, const XML_Char *name, const XML_Cha
660656
}
661657

662658
zend_call_known_fcc(&parser->startElementHandler, /* retval */ NULL, /* param_count */ 3, args, /* named_params */ NULL);
663-
zval_ptr_dtor(&args[0]);
664659
zval_ptr_dtor_str(&args[1]);
665660
zval_ptr_dtor(&args[2]);
666661
}
@@ -742,11 +737,10 @@ void xml_endElementHandler(void *userData, const XML_Char *name)
742737

743738
if (ZEND_FCC_INITIALIZED(parser->endElementHandler)) {
744739
zval args[2];
745-
ZVAL_COPY(&args[0], &parser->index);
740+
ZVAL_OBJ(&args[0], &parser->std);
746741
ZVAL_STR(&args[1], xml_stripped_tag(tag_name, parser->toffset));
747742

748743
zend_call_known_fcc(&parser->endElementHandler, /* retval */ NULL, /* param_count */ 2, args, /* named_params */ NULL);
749-
zval_ptr_dtor(&args[0]);
750744
zval_ptr_dtor_str(&args[1]);
751745
}
752746

@@ -803,11 +797,10 @@ void xml_characterDataHandler(void *userData, const XML_Char *s, int len)
803797

804798
if (ZEND_FCC_INITIALIZED(parser->characterDataHandler)) {
805799
zval args[2];
806-
ZVAL_COPY(&args[0], &parser->index);
800+
ZVAL_OBJ(&args[0], &parser->std);
807801
xml_xmlchar_zval(s, len, parser->target_encoding, &args[1]);
808802

809803
zend_call_known_fcc(&parser->characterDataHandler, /* retval */ NULL, /* param_count */ 2, args, /* named_params */ NULL);
810-
zval_ptr_dtor(&args[0]);
811804
zval_ptr_dtor_str(&args[1]);
812805
}
813806

@@ -911,12 +904,11 @@ void xml_processingInstructionHandler(void *userData, const XML_Char *target, co
911904

912905
zval args[3];
913906

914-
ZVAL_COPY(&args[0], &parser->index);
907+
ZVAL_OBJ(&args[0], &parser->std);
915908
xml_xmlchar_zval(target, 0, parser->target_encoding, &args[1]);
916909
xml_xmlchar_zval(data, 0, parser->target_encoding, &args[2]);
917910

918911
zend_call_known_fcc(&parser->processingInstructionHandler, /* retval */ NULL, /* param_count */ 3, args, /* named_params */ NULL);
919-
zval_ptr_dtor(&args[0]);
920912
zval_ptr_dtor_str(&args[1]);
921913
zval_ptr_dtor_str(&args[2]);
922914
}
@@ -933,11 +925,10 @@ void xml_defaultHandler(void *userData, const XML_Char *s, int len)
933925

934926
zval args[2];
935927

936-
ZVAL_COPY(&args[0], &parser->index);
928+
ZVAL_OBJ(&args[0], &parser->std);
937929
xml_xmlchar_zval(s, len, parser->target_encoding, &args[1]);
938930

939931
zend_call_known_fcc(&parser->defaultHandler, /* retval */ NULL, /* param_count */ 2, args, /* named_params */ NULL);
940-
zval_ptr_dtor(&args[0]);
941932
zval_ptr_dtor_str(&args[1]);
942933
}
943934
/* }}} */
@@ -955,15 +946,14 @@ void xml_unparsedEntityDeclHandler(void *userData,
955946

956947
zval args[6];
957948

958-
ZVAL_COPY(&args[0], &parser->index);
949+
ZVAL_OBJ(&args[0], &parser->std);
959950
xml_xmlchar_zval(entityName, 0, parser->target_encoding, &args[1]);
960951
xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]);
961952
xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]);
962953
xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]);
963954
xml_xmlchar_zval(notationName, 0, parser->target_encoding, &args[5]);
964955

965956
zend_call_known_fcc(&parser->unparsedEntityDeclHandler, /* retval */ NULL, /* param_count */ 6, args, /* named_params */ NULL);
966-
zval_ptr_dtor(&args[0]);
967957
zval_ptr_dtor_str(&args[1]);
968958
zval_ptr_dtor_str(&args[2]);
969959
zval_ptr_dtor_str(&args[3]);
@@ -984,14 +974,13 @@ void xml_notationDeclHandler(void *userData, const XML_Char *notationName,
984974

985975
zval args[5];
986976

987-
ZVAL_COPY(&args[0], &parser->index);
977+
ZVAL_OBJ(&args[0], &parser->std);
988978
xml_xmlchar_zval(notationName, 0, parser->target_encoding, &args[1]);
989979
xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]);
990980
xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]);
991981
xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]);
992982

993983
zend_call_known_fcc(&parser->notationDeclHandler, /* retval */ NULL, /* param_count */ 5, args, /* named_params */ NULL);
994-
zval_ptr_dtor(&args[0]);
995984
zval_ptr_dtor_str(&args[1]);
996985
zval_ptr_dtor_str(&args[2]);
997986
zval_ptr_dtor_str(&args[3]);
@@ -1013,14 +1002,13 @@ int xml_externalEntityRefHandler(XML_Parser userData, const XML_Char *openEntity
10131002
zval args[5];
10141003
zval retval;
10151004

1016-
ZVAL_COPY(&args[0], &parser->index);
1005+
ZVAL_OBJ(&args[0], &parser->std);
10171006
xml_xmlchar_zval(openEntityNames, 0, parser->target_encoding, &args[1]);
10181007
xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]);
10191008
xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]);
10201009
xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]);
10211010

10221011
zend_call_known_fcc(&parser->externalEntityRefHandler, /* retval */ &retval, /* param_count */ 5, args, /* named_params */ NULL);
1023-
zval_ptr_dtor(&args[0]);
10241012
zval_ptr_dtor_str(&args[1]);
10251013
zval_ptr_dtor_str(&args[2]);
10261014
zval_ptr_dtor_str(&args[3]);
@@ -1048,12 +1036,11 @@ void xml_startNamespaceDeclHandler(void *userData,const XML_Char *prefix, const
10481036

10491037
zval args[3];
10501038

1051-
ZVAL_COPY(&args[0], &parser->index);
1039+
ZVAL_OBJ(&args[0], &parser->std);
10521040
xml_xmlchar_zval(prefix, 0, parser->target_encoding, &args[1]);
10531041
xml_xmlchar_zval(uri, 0, parser->target_encoding, &args[2]);
10541042

10551043
zend_call_known_fcc(&parser->startNamespaceDeclHandler, /* retval */ NULL, /* param_count */ 3, args, /* named_params */ NULL);
1056-
zval_ptr_dtor(&args[0]);
10571044
zval_ptr_dtor_str(&args[1]);
10581045
zval_ptr_dtor_str(&args[2]);
10591046
}
@@ -1070,11 +1057,10 @@ void xml_endNamespaceDeclHandler(void *userData, const XML_Char *prefix)
10701057

10711058
zval args[2];
10721059

1073-
ZVAL_COPY(&args[0], &parser->index);
1060+
ZVAL_OBJ(&args[0], &parser->std);
10741061
xml_xmlchar_zval(prefix, 0, parser->target_encoding, &args[1]);
10751062

10761063
zend_call_known_fcc(&parser->endNamespaceDeclHandler, /* retval */ NULL, /* param_count */ 2, args, /* named_params */ NULL);
1077-
zval_ptr_dtor(&args[0]);
10781064
zval_ptr_dtor_str(&args[1]);
10791065
}
10801066
/* }}} */
@@ -1133,7 +1119,6 @@ static void php_xml_parser_create_impl(INTERNAL_FUNCTION_PARAMETERS, int ns_supp
11331119
parser->parsehuge = false; /* It's the default for BC & DoS protection */
11341120

11351121
XML_SetUserData(parser->parser, parser);
1136-
ZVAL_COPY_VALUE(&parser->index, return_value);
11371122
}
11381123
/* }}} */
11391124

0 commit comments

Comments
 (0)