mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
- make static methods calls work from within xslt
- extended tests
This commit is contained in:
parent
e9c3ac04f5
commit
65bc57a81f
3 changed files with 39 additions and 21 deletions
|
@ -142,7 +142,8 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t
|
|||
zval handler;
|
||||
xmlXPathObjectPtr obj;
|
||||
char *str;
|
||||
|
||||
char *callable = NULL;
|
||||
|
||||
TSRMLS_FETCH();
|
||||
|
||||
tctxt = xsltXPathGetTransformContext(ctxt);
|
||||
|
@ -243,29 +244,34 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t
|
|||
fci.retval_ptr_ptr = &retval;
|
||||
fci.no_separation = 0;
|
||||
/*fci.function_handler_cache = &function_ptr;*/
|
||||
|
||||
result = zend_call_function(&fci, NULL TSRMLS_CC);
|
||||
if (result == FAILURE) {
|
||||
if (Z_TYPE(handler) == IS_STRING) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call handler %s()", Z_STRVAL_P(&handler));
|
||||
}
|
||||
if (!zend_make_callable(&handler, &callable TSRMLS_CC)) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call handler %s()", callable);
|
||||
efree(callable);
|
||||
|
||||
} else {
|
||||
if (retval->type == IS_OBJECT && instanceof_function( Z_OBJCE_P(retval), dom_node_class_entry TSRMLS_CC)) {
|
||||
xmlNode *nodep;
|
||||
dom_object *obj;
|
||||
obj = (dom_object *)zend_object_store_get_object(retval TSRMLS_CC);
|
||||
nodep = dom_object_get_node(obj);
|
||||
valuePush(ctxt, xmlXPathNewNodeSet(nodep));
|
||||
} else if (retval->type == IS_BOOL) {
|
||||
valuePush(ctxt, xmlXPathNewBoolean(retval->value.lval));
|
||||
} else if (retval->type == IS_OBJECT) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "A PHP Object can not be converted to a XPath-string");
|
||||
valuePush(ctxt, xmlXPathNewString(""));
|
||||
result = zend_call_function(&fci, NULL TSRMLS_CC);
|
||||
if (result == FAILURE) {
|
||||
if (Z_TYPE(handler) == IS_STRING) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call handler %s()", Z_STRVAL_P(&handler));
|
||||
}
|
||||
} else {
|
||||
convert_to_string_ex(&retval);
|
||||
valuePush(ctxt, xmlXPathNewString( Z_STRVAL_P(retval)));
|
||||
if (retval->type == IS_OBJECT && instanceof_function( Z_OBJCE_P(retval), dom_node_class_entry TSRMLS_CC)) {
|
||||
xmlNode *nodep;
|
||||
dom_object *obj;
|
||||
obj = (dom_object *)zend_object_store_get_object(retval TSRMLS_CC);
|
||||
nodep = dom_object_get_node(obj);
|
||||
valuePush(ctxt, xmlXPathNewNodeSet(nodep));
|
||||
} else if (retval->type == IS_BOOL) {
|
||||
valuePush(ctxt, xmlXPathNewBoolean(retval->value.lval));
|
||||
} else if (retval->type == IS_OBJECT) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "A PHP Object can not be converted to a XPath-string");
|
||||
valuePush(ctxt, xmlXPathNewString(""));
|
||||
} else {
|
||||
convert_to_string_ex(&retval);
|
||||
valuePush(ctxt, xmlXPathNewString( Z_STRVAL_P(retval)));
|
||||
}
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
zval_ptr_dtor(&retval);
|
||||
}
|
||||
zval_dtor(&handler);
|
||||
for (i = 0; i < nargs - 1; i++) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue