]> granicus.if.org Git - php/commitdiff
take advantage of the fast_call_user_function() api call for all of the
authorSterling Hughes <sterling@php.net>
Thu, 22 May 2003 03:04:11 +0000 (03:04 +0000)
committerSterling Hughes <sterling@php.net>
Thu, 22 May 2003 03:04:11 +0000 (03:04 +0000)
callbacks.

ext/xml/php_xml.h
ext/xml/xml.c

index ca77d3d224cc777f5215053f5148472ac0e0c0e0..dc69c19edbae22b96801a999da412c968d002c43 100644 (file)
@@ -14,6 +14,7 @@
    +----------------------------------------------------------------------+
    | Authors: Stig Sæther Bakken <ssb@php.net>                            |
    |          Thies C. Arntzen <thies@thieso.net>                         |
+   |          Sterling Hughes <sterling@php.net>                          |
    +----------------------------------------------------------------------+
 */
 
@@ -53,6 +54,7 @@ typedef struct {
        int case_folding;
        XML_Parser parser;
        XML_Char *target_encoding;
+
        zval *startElementHandler;
        zval *endElementHandler;
        zval *characterDataHandler;
@@ -61,9 +63,22 @@ typedef struct {
        zval *unparsedEntityDeclHandler;
        zval *notationDeclHandler;
        zval *externalEntityRefHandler;
-       zval *unknownEncodingHandler;
+       zval *unknownEncodingHandler;   
        zval *startNamespaceDeclHandler;
        zval *endNamespaceDeclHandler;
+
+       zend_function *startElementPtr;
+       zend_function *endElementPtr;
+       zend_function *characterDataPtr;
+       zend_function *processingInstructionPtr;
+       zend_function *defaultPtr;
+       zend_function *unparsedEntityDeclPtr;
+       zend_function *notationDeclPtr;
+       zend_function *externalEntityRefPtr;
+       zend_function *unknownEncodingPtr;
+       zend_function *startNamespaceDeclPtr;
+       zend_function *endNamespaceDeclPtr;
+
        zval *object;
 
        zval *data;
index 378ae2f55a5426dcc59930c9a36535f89e32b3ac..8342510f3d0b26826b9245a323b4b161612b5107 100644 (file)
@@ -13,7 +13,8 @@
    | license@php.net so we can mail you a copy immediately.               |
    +----------------------------------------------------------------------+
    | Authors: Stig Sæther Bakken <ssb@php.net>                            |
-   |          Thies C. Arntzen <thies@thieso.net>                         | 
+   |          Thies C. Arntzen <thies@thieso.net>                         |
+   |          Sterling Hughes <sterling@php.net>                          |
    +----------------------------------------------------------------------+
  */
 
@@ -79,7 +80,7 @@ inline static char xml_decode_iso_8859_1(unsigned short);
 inline static unsigned short xml_encode_us_ascii(unsigned char);
 inline static char xml_decode_us_ascii(unsigned short);
 static XML_Char *xml_utf8_encode(const char *, int, int *, const XML_Char *);
-static zval *xml_call_handler(xml_parser *, zval *, int, zval **);
+static zval *xml_call_handler(xml_parser *, zval *, zend_function *, int, zval **);
 static zval *_xml_xmlchar_zval(const XML_Char *, int, const XML_Char *);
 static int _xml_xmlcharlen(const XML_Char *);
 static void _xml_add_to_info(xml_parser *parser,char *name);
@@ -385,20 +386,22 @@ static void xml_set_handler(zval **handler, zval **data)
 /* }}} */
 
 /* {{{ xml_call_handler() */
-static zval *xml_call_handler(xml_parser *parser, zval *handler, int argc, zval **argv)
+static zval *xml_call_handler(xml_parser *parser, zval *handler, zend_function *function_ptr, int argc, zval **argv)
 {
        TSRMLS_FETCH();
 
        if (parser && handler) {
+               zval ***args;
                zval *retval;
                int i;  
                int result;
 
-               MAKE_STD_ZVAL(retval);
-               ZVAL_FALSE(retval);
-
-               result = call_user_function(EG(function_table), &parser->object, handler, retval, argc, argv TSRMLS_CC);
-
+               args = emalloc(sizeof(zval **) * argc);
+               for (i = 0; i < argc; i++) {
+                       args[i] = &argv[i];
+               }
+               
+               result = fast_call_user_function(EG(function_table), &parser->object, handler, &retval, argc, args, 0, NULL, &function_ptr TSRMLS_CC);
                if (result == FAILURE) {
                        zval **method;
                        zval **obj;
@@ -412,14 +415,14 @@ static zval *xml_call_handler(xml_parser *parser, zval *handler, int argc, zval
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call handler %s::%s()", Z_OBJCE_PP(obj)->name, Z_STRVAL_PP(method));
                        } else 
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call handler");
-
-                       zval_dtor(retval);
-                       efree(retval);
+                       
+                       zval_ptr_dtor(&retval);
                }
 
                for (i = 0; i < argc; i++) {
-                       zval_ptr_dtor(&(argv[i]));
+                       zval_ptr_dtor(args[i]);
                }
+               efree(args);
 
                if (result == FAILURE) {
                        return NULL;
@@ -676,7 +679,7 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch
                                efree(att);
                        }
                        
-                       if ((retval = xml_call_handler(parser, parser->startElementHandler, 3, args))) {
+                       if ((retval = xml_call_handler(parser, parser->startElementHandler, parser->startElementPtr, 3, args))) {
                                zval_dtor(retval);
                                efree(retval);
                        }
@@ -745,7 +748,7 @@ void _xml_endElementHandler(void *userData, const XML_Char *name)
                        args[0] = _xml_resource_zval(parser->index);
                        args[1] = _xml_string_zval(tag_name);
 
-                       if ((retval = xml_call_handler(parser, parser->endElementHandler, 2, args))) {
+                       if ((retval = xml_call_handler(parser, parser->endElementHandler, parser->endElementPtr, 2, args))) {
                                zval_dtor(retval);
                                efree(retval);
                        }
@@ -795,7 +798,7 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len)
                if (parser->characterDataHandler) {
                        args[0] = _xml_resource_zval(parser->index);
                        args[1] = _xml_xmlchar_zval(s, len, parser->target_encoding);
-                       if ((retval = xml_call_handler(parser, parser->characterDataHandler, 2, args))) {
+                       if ((retval = xml_call_handler(parser, parser->characterDataHandler, parser->characterDataPtr, 2, args))) {
                                zval_dtor(retval);
                                efree(retval);
                        }
@@ -873,7 +876,7 @@ void _xml_processingInstructionHandler(void *userData, const XML_Char *target, c
                args[0] = _xml_resource_zval(parser->index);
                args[1] = _xml_xmlchar_zval(target, 0, parser->target_encoding);
                args[2] = _xml_xmlchar_zval(data, 0, parser->target_encoding);
-               if ((retval = xml_call_handler(parser, parser->processingInstructionHandler, 3, args))) {
+               if ((retval = xml_call_handler(parser, parser->processingInstructionHandler, parser->processingInstructionPtr, 3, args))) {
                        zval_dtor(retval);
                        efree(retval);
                }
@@ -891,7 +894,7 @@ void _xml_defaultHandler(void *userData, const XML_Char *s, int len)
 
                args[0] = _xml_resource_zval(parser->index);
                args[1] = _xml_xmlchar_zval(s, len, parser->target_encoding);
-               if ((retval = xml_call_handler(parser, parser->defaultHandler, 2, args))) {
+               if ((retval = xml_call_handler(parser, parser->defaultHandler, parser->defaultPtr, 2, args))) {
                        zval_dtor(retval);
                        efree(retval);
                }
@@ -918,7 +921,7 @@ void _xml_unparsedEntityDeclHandler(void *userData,
                args[3] = _xml_xmlchar_zval(systemId, 0, parser->target_encoding);
                args[4] = _xml_xmlchar_zval(publicId, 0, parser->target_encoding);
                args[5] = _xml_xmlchar_zval(notationName, 0, parser->target_encoding);
-               if ((retval = xml_call_handler(parser, parser->unparsedEntityDeclHandler, 6, args))) {
+               if ((retval = xml_call_handler(parser, parser->unparsedEntityDeclHandler, parser->unparsedEntityDeclPtr, 6, args))) {
                        zval_dtor(retval);
                        efree(retval);
                }
@@ -943,7 +946,7 @@ void _xml_notationDeclHandler(void *userData,
                args[2] = _xml_xmlchar_zval(base, 0, parser->target_encoding);
                args[3] = _xml_xmlchar_zval(systemId, 0, parser->target_encoding);
                args[4] = _xml_xmlchar_zval(publicId, 0, parser->target_encoding);
-               if ((retval = xml_call_handler(parser, parser->notationDeclHandler, 5, args))) {
+               if ((retval = xml_call_handler(parser, parser->notationDeclHandler, parser->notationDeclPtr, 5, args))) {
                        zval_dtor(retval);
                        efree(retval);
                }
@@ -969,7 +972,7 @@ int _xml_externalEntityRefHandler(XML_Parser parserPtr,
                args[2] = _xml_xmlchar_zval(base, 0, parser->target_encoding);
                args[3] = _xml_xmlchar_zval(systemId, 0, parser->target_encoding);
                args[4] = _xml_xmlchar_zval(publicId, 0, parser->target_encoding);
-               if ((retval = xml_call_handler(parser, parser->externalEntityRefHandler, 5, args))) {
+               if ((retval = xml_call_handler(parser, parser->externalEntityRefHandler, parser->externalEntityRefPtr, 5, args))) {
                        convert_to_long(retval);
                        ret = Z_LVAL_P(retval);
                        efree(retval);
@@ -992,7 +995,7 @@ void _xml_startNamespaceDeclHandler(void *userData,const XML_Char *prefix, const
                args[0] = _xml_resource_zval(parser->index);
                args[1] = _xml_xmlchar_zval(prefix, 0, parser->target_encoding);
                args[2] = _xml_xmlchar_zval(uri, 0, parser->target_encoding);
-               if ((retval = xml_call_handler(parser, parser->startNamespaceDeclHandler, 3, args))) {
+               if ((retval = xml_call_handler(parser, parser->startNamespaceDeclHandler, parser->startNamespaceDeclPtr, 3, args))) {
                        zval_dtor(retval);
                        efree(retval);
                }
@@ -1010,7 +1013,7 @@ void _xml_endNamespaceDeclHandler(void *userData, const XML_Char *prefix)
 
                args[0] = _xml_resource_zval(parser->index);
                args[1] = _xml_xmlchar_zval(prefix, 0, parser->target_encoding);
-               if ((retval = xml_call_handler(parser, parser->endNamespaceDeclHandler, 2, args))) {
+               if ((retval = xml_call_handler(parser, parser->endNamespaceDeclHandler, parser->endNamespaceDeclPtr, 2, args))) {
                        zval_dtor(retval);
                        efree(retval);
                }