From: Marcus Boerger Date: Sat, 17 Jan 2004 15:56:29 +0000 (+0000) Subject: Make inherited sxe classes work X-Git-Tag: php_ibase_before_split~163 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9df72efb7c4d3016e255b173bd001693320dd5af;p=php Make inherited sxe classes work --- diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 839791c772..b460722525 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -62,7 +62,7 @@ static void _node_as_zval(php_sxe_object *sxe, xmlNodePtr node, zval *value TSRM { php_sxe_object *subnode; - subnode = php_sxe_object_new(sxe_class_entry TSRMLS_CC); + subnode = php_sxe_object_new(sxe->zo.ce TSRMLS_CC); subnode->document = sxe->document; subnode->document->refcount++; subnode->nsmapptr = sxe->nsmapptr; @@ -598,7 +598,7 @@ _get_base_node_value(php_sxe_object *sxe_ref, xmlNodePtr node, zval **value TSRM xmlFree(contents); } } else { - subnode = php_sxe_object_new(sxe_class_entry TSRMLS_CC); + subnode = php_sxe_object_new(sxe_ref->zo.ce TSRMLS_CC); subnode->document = sxe_ref->document; subnode->document->refcount++; subnode->nsmapptr = sxe_ref->nsmapptr; @@ -1111,7 +1111,7 @@ sxe_object_clone(void *object, void **clone_ptr TSRMLS_DC) xmlNodePtr nodep = NULL; xmlDocPtr docp = NULL; - clone = php_sxe_object_new(sxe_class_entry TSRMLS_CC); + clone = php_sxe_object_new(sxe->zo.ce TSRMLS_CC); clone->document = sxe->document; if (clone->document) { clone->document->refcount++; @@ -1224,8 +1224,11 @@ PHP_FUNCTION(simplexml_load_file) char *filename; int filename_len; xmlDocPtr docp; + char *classname = ""; + int classname_len = 0; + zend_class_entry *ce= sxe_class_entry; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &filename, &filename_len, &classname, &classname_len) == FAILURE) { return; } @@ -1233,8 +1236,16 @@ PHP_FUNCTION(simplexml_load_file) if (! docp) { RETURN_FALSE; } + + if (classname_len) { + zend_class_entry **pce; + if (zend_lookup_class(classname, classname_len, &pce TSRMLS_CC) == FAILURE) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s does not exist", classname); + } + ce = *pce; + } - sxe = php_sxe_object_new(sxe_class_entry TSRMLS_CC); + sxe = php_sxe_object_new(ce TSRMLS_CC); php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, docp TSRMLS_CC); sxe->nsmapptr = emalloc(sizeof(simplexml_nsmap)); sxe->nsmapptr->nsmap = xmlHashCreate(10); @@ -1254,8 +1265,11 @@ PHP_FUNCTION(simplexml_load_string) char *data; int data_len; xmlDocPtr docp; + char *classname = ""; + int classname_len = 0; + zend_class_entry *ce= sxe_class_entry; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len, &classname, &classname_len) == FAILURE) { return; } @@ -1264,7 +1278,15 @@ PHP_FUNCTION(simplexml_load_string) RETURN_FALSE; } - sxe = php_sxe_object_new(sxe_class_entry TSRMLS_CC); + if (classname_len) { + zend_class_entry **pce; + if (zend_lookup_class(classname, classname_len, &pce TSRMLS_CC) == FAILURE) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s does not exist", classname); + } + ce = *pce; + } + + sxe = php_sxe_object_new(ce TSRMLS_CC); php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, docp TSRMLS_CC); sxe->nsmapptr = emalloc(sizeof(simplexml_nsmap)); sxe->nsmapptr->nsmap = xmlHashCreate(10); @@ -1426,8 +1448,11 @@ PHP_FUNCTION(simplexml_import_dom) zval *node; php_libxml_node_object *object; xmlNodePtr nodep = NULL; + char *classname = ""; + int classname_len = 0; + zend_class_entry *ce= sxe_class_entry; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &node) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|s", &node, &classname, &classname_len) == FAILURE) { return; } @@ -1445,7 +1470,15 @@ PHP_FUNCTION(simplexml_import_dom) } if (nodep && nodep->type == XML_ELEMENT_NODE) { - sxe = php_sxe_object_new(sxe_class_entry TSRMLS_CC); + if (classname_len) { + zend_class_entry **pce; + if (zend_lookup_class(classname, classname_len, &pce TSRMLS_CC) == FAILURE) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Class %s does not exist", classname); + } + ce = *pce; + } + + sxe = php_sxe_object_new(ce TSRMLS_CC); sxe->document = object->document; php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, nodep->doc TSRMLS_CC); sxe->nsmapptr = emalloc(sizeof(simplexml_nsmap));