Browse Source

- make static methods calls work from within xslt

- extended tests
PHP-5.0
Christian Stocker 22 years ago
parent
commit
65bc57a81f
  1. 8
      ext/xsl/tests/xslt011.phpt
  2. 4
      ext/xsl/tests/xslt011.xsl
  3. 48
      ext/xsl/xsltprocessor.c

8
ext/xsl/tests/xslt011.phpt

@ -39,6 +39,13 @@ $dom = new domDocument();
function nonDomNode() {
return new foo();
}
class aClass {
static function aStaticFunction($id) {
return $id;
}
}
--EXPECTF--
Test 11: php:function Support
@ -48,4 +55,5 @@ foobar - secondArg
foobar -
this is from an external DomDocument
from the Input Document
static

4
ext/xsl/tests/xslt011.xsl

@ -16,6 +16,10 @@
<xsl:value-of select="php:function('nodeSet',/doc)/i"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="php:function('aClass::aStaticFunction','static')"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="php:function('nonDomNode')"/>
</xsl:template>
</xsl:stylesheet>

48
ext/xsl/xsltprocessor.c

@ -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…
Cancel
Save