@@ -815,7 +815,7 @@ static bool xmlreader_valid_encoding(const char *encoding)
815815}
816816
817817/* {{{ Sets the URI that the XMLReader will parse. */
818- PHP_METHOD ( XMLReader , open )
818+ static void xml_reader_from_uri ( INTERNAL_FUNCTION_PARAMETERS , zend_class_entry * instance_ce , bool use_exceptions )
819819{
820820 zval * id ;
821821 size_t source_len = 0 , encoding_len = 0 ;
@@ -856,12 +856,20 @@ PHP_METHOD(XMLReader, open)
856856 }
857857
858858 if (reader == NULL ) {
859- php_error_docref (NULL , E_WARNING , "Unable to open source data" );
860- RETURN_FALSE ;
859+ if (use_exceptions ) {
860+ zend_throw_error (NULL , "Unable to open source data" );
861+ RETURN_THROWS ();
862+ } else {
863+ php_error_docref (NULL , E_WARNING , "Unable to open source data" );
864+ RETURN_FALSE ;
865+ }
861866 }
862867
863868 if (id == NULL ) {
864- object_init_ex (return_value , xmlreader_class_entry );
869+ if (UNEXPECTED (object_init_with_constructor (return_value , instance_ce , 0 , NULL , NULL ) != SUCCESS )) {
870+ xmlFreeTextReader (reader );
871+ RETURN_THROWS ();
872+ }
865873 intern = Z_XMLREADER_P (return_value );
866874 intern -> ptr = reader ;
867875 return ;
@@ -872,6 +880,16 @@ PHP_METHOD(XMLReader, open)
872880 RETURN_TRUE ;
873881
874882}
883+
884+ PHP_METHOD (XMLReader , open )
885+ {
886+ xml_reader_from_uri (INTERNAL_FUNCTION_PARAM_PASSTHRU , xmlreader_class_entry , false);
887+ }
888+
889+ PHP_METHOD (XMLReader , fromUri )
890+ {
891+ xml_reader_from_uri (INTERNAL_FUNCTION_PARAM_PASSTHRU , Z_CE_P (ZEND_THIS ), true);
892+ }
875893/* }}} */
876894
877895static int xml_reader_stream_read (void * context , char * buffer , int len )
@@ -1068,7 +1086,7 @@ XMLPUBFUN int XMLCALL
10681086*/
10691087
10701088/* {{{ Sets the string that the XMLReader will parse. */
1071- PHP_METHOD ( XMLReader , XML )
1089+ static void xml_reader_from_string ( INTERNAL_FUNCTION_PARAMETERS , zend_class_entry * instance_ce , bool throw )
10721090{
10731091 zval * id ;
10741092 size_t source_len = 0 , encoding_len = 0 ;
@@ -1125,7 +1143,12 @@ PHP_METHOD(XMLReader, XML)
11251143 ret = xmlTextReaderSetup (reader , NULL , uri , encoding , options );
11261144 if (ret == 0 ) {
11271145 if (id == NULL ) {
1128- object_init_ex (return_value , xmlreader_class_entry );
1146+ if (UNEXPECTED (object_init_with_constructor (return_value , instance_ce , 0 , NULL , NULL ) != SUCCESS )) {
1147+ xmlFree (uri );
1148+ xmlFreeParserInputBuffer (inputbfr );
1149+ xmlFreeTextReader (reader );
1150+ RETURN_THROWS ();
1151+ }
11291152 intern = Z_XMLREADER_P (return_value );
11301153 } else {
11311154 RETVAL_TRUE ;
@@ -1151,11 +1174,27 @@ PHP_METHOD(XMLReader, XML)
11511174 if (inputbfr ) {
11521175 xmlFreeParserInputBuffer (inputbfr );
11531176 }
1154- php_error_docref (NULL , E_WARNING , "Unable to load source data" );
1155- RETURN_FALSE ;
1177+
1178+ if (throw ) {
1179+ zend_throw_error (NULL , "Unable to load source data" );
1180+ RETURN_THROWS ();
1181+ } else {
1182+ php_error_docref (NULL , E_WARNING , "Unable to load source data" );
1183+ RETURN_FALSE ;
1184+ }
11561185}
11571186/* }}} */
11581187
1188+ PHP_METHOD (XMLReader , XML )
1189+ {
1190+ xml_reader_from_string (INTERNAL_FUNCTION_PARAM_PASSTHRU , xmlreader_class_entry , false);
1191+ }
1192+
1193+ PHP_METHOD (XMLReader , fromString )
1194+ {
1195+ xml_reader_from_string (INTERNAL_FUNCTION_PARAM_PASSTHRU , Z_CE_P (ZEND_THIS ), true);
1196+ }
1197+
11591198/* {{{ Moves the position of the current instance to the next node in the stream. */
11601199PHP_METHOD (XMLReader , expand )
11611200{
0 commit comments