@@ -142,7 +142,8 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t
142
142
zval handler ;
143
143
xmlXPathObjectPtr obj ;
144
144
char * str ;
145
-
145
+ char * callable = NULL ;
146
+
146
147
TSRMLS_FETCH ();
147
148
148
149
tctxt = xsltXPathGetTransformContext (ctxt );
@@ -243,29 +244,34 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t
243
244
fci .retval_ptr_ptr = & retval ;
244
245
fci .no_separation = 0 ;
245
246
/*fci.function_handler_cache = &function_ptr;*/
246
-
247
- result = zend_call_function (& fci , NULL TSRMLS_CC );
248
- if (result == FAILURE ) {
249
- if (Z_TYPE (handler ) == IS_STRING ) {
250
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "Unable to call handler %s()" , Z_STRVAL_P (& handler ));
251
- }
247
+ if (!zend_make_callable (& handler , & callable TSRMLS_CC )) {
248
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Unable to call handler %s()" , callable );
249
+ efree (callable );
250
+
252
251
} else {
253
- if (retval -> type == IS_OBJECT && instanceof_function ( Z_OBJCE_P (retval ), dom_node_class_entry TSRMLS_CC )) {
254
- xmlNode * nodep ;
255
- dom_object * obj ;
256
- obj = (dom_object * )zend_object_store_get_object (retval TSRMLS_CC );
257
- nodep = dom_object_get_node (obj );
258
- valuePush (ctxt , xmlXPathNewNodeSet (nodep ));
259
- } else if (retval -> type == IS_BOOL ) {
260
- valuePush (ctxt , xmlXPathNewBoolean (retval -> value .lval ));
261
- } else if (retval -> type == IS_OBJECT ) {
262
- php_error_docref (NULL TSRMLS_CC , E_WARNING , "A PHP Object can not be converted to a XPath-string" );
263
- valuePush (ctxt , xmlXPathNewString ("" ));
252
+ result = zend_call_function (& fci , NULL TSRMLS_CC );
253
+ if (result == FAILURE ) {
254
+ if (Z_TYPE (handler ) == IS_STRING ) {
255
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Unable to call handler %s()" , Z_STRVAL_P (& handler ));
256
+ }
264
257
} else {
265
- convert_to_string_ex (& retval );
266
- valuePush (ctxt , xmlXPathNewString ( Z_STRVAL_P (retval )));
258
+ if (retval -> type == IS_OBJECT && instanceof_function ( Z_OBJCE_P (retval ), dom_node_class_entry TSRMLS_CC )) {
259
+ xmlNode * nodep ;
260
+ dom_object * obj ;
261
+ obj = (dom_object * )zend_object_store_get_object (retval TSRMLS_CC );
262
+ nodep = dom_object_get_node (obj );
263
+ valuePush (ctxt , xmlXPathNewNodeSet (nodep ));
264
+ } else if (retval -> type == IS_BOOL ) {
265
+ valuePush (ctxt , xmlXPathNewBoolean (retval -> value .lval ));
266
+ } else if (retval -> type == IS_OBJECT ) {
267
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "A PHP Object can not be converted to a XPath-string" );
268
+ valuePush (ctxt , xmlXPathNewString ("" ));
269
+ } else {
270
+ convert_to_string_ex (& retval );
271
+ valuePush (ctxt , xmlXPathNewString ( Z_STRVAL_P (retval )));
272
+ }
273
+ zval_ptr_dtor (& retval );
267
274
}
268
- zval_ptr_dtor (& retval );
269
275
}
270
276
zval_dtor (& handler );
271
277
for (i = 0 ; i < nargs - 1 ; i ++ ) {
0 commit comments