summaryrefslogtreecommitdiff
path: root/ext/dom/php_dom.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2014-04-16 17:12:22 +0200
committerNikita Popov <nikic@php.net>2014-04-16 17:14:34 +0200
commite59c8661fdb894429f25bc6af0ee919ce0f7d0f1 (patch)
treebcd8909e35d9202fcdac43b73c30758ec14d2f99 /ext/dom/php_dom.c
parent59f6d189c8c6a2a11574b5b4ce98e0e8b6a7bc0b (diff)
downloadphp-git-e59c8661fdb894429f25bc6af0ee919ce0f7d0f1.tar.gz
Finish DOM port
All tests pass now
Diffstat (limited to 'ext/dom/php_dom.c')
-rw-r--r--ext/dom/php_dom.c88
1 files changed, 31 insertions, 57 deletions
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index c584ef39b7..c6856cf66a 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -111,6 +111,10 @@ typedef struct _dom_prop_handler {
dom_write_t write_func;
} dom_prop_handler;
+static zend_object_handlers* dom_get_obj_handlers(TSRMLS_D) {
+ return &dom_object_handlers;
+}
+
/* {{{ int dom_node_is_read_only(xmlNodePtr node) */
int dom_node_is_read_only(xmlNodePtr node) {
switch (node->type) {
@@ -507,31 +511,36 @@ PHP_FUNCTION(dom_import_simplexml)
}
/* }}} */
-zend_object *dom_objects_store_clone_obj(zval *zobject TSRMLS_DC) /* {{{ */
-{
- ZEND_ASSERT(0);
- /*void *new_object;
- dom_object *intern;
- dom_object *old_object;
- zend_object_handle handle = Z_OBJ_HANDLE_P(zobject);
-
- obj = &EG(objects_store).object_buckets[handle].bucket.obj;
+static dom_object* dom_objects_set_class(zend_class_entry *class_type, zend_bool hash_copy TSRMLS_DC);
- if (obj->clone == NULL) {
- php_error(E_ERROR, "Trying to clone an uncloneable object of class %s", Z_OBJCE_P(zobject)->name);
- }
+static zend_object *dom_objects_store_clone_obj(zval *zobject TSRMLS_DC) /* {{{ */
+{
+ dom_object *intern = Z_DOMOBJ_P(zobject);
+ dom_object *clone = dom_objects_set_class(intern->std.ce, 0 TSRMLS_CC);
- obj->clone(obj->object, &new_object TSRMLS_CC);
+ clone->std.handlers = dom_get_obj_handlers(TSRMLS_C);
+ zend_objects_clone_members(&clone->std, &intern->std TSRMLS_CC);
- retval.handle = zend_objects_store_put(new_object, obj->dtor, obj->free_storage, obj->clone TSRMLS_CC);
- intern = (dom_object *) new_object;
- intern->handle = retval.handle;
- retval.handlers = Z_OBJ_HT_P(zobject);
+ if (instanceof_function(intern->std.ce, dom_node_class_entry TSRMLS_CC)) {
+ xmlNodePtr node = (xmlNodePtr)dom_object_get_node(intern);
+ if (node != NULL) {
+ xmlNodePtr cloned_node = xmlDocCopyNode(node, node->doc, 1);
+ if (cloned_node != NULL) {
+ /* If we cloned a document then we must create new doc proxy */
+ if (cloned_node->doc == node->doc) {
+ clone->document = intern->document;
+ }
+ php_libxml_increment_doc_ref((php_libxml_node_object *)clone, cloned_node->doc TSRMLS_CC);
+ php_libxml_increment_node_ptr((php_libxml_node_object *)clone, cloned_node, (void *)clone TSRMLS_CC);
+ if (intern->document != clone->document) {
+ dom_copy_doc_props(intern->document, clone->document);
+ }
+ }
- old_object = (dom_object *) obj->object;
- zend_objects_clone_members(&intern->std, retval, &old_object->std, intern->handle TSRMLS_CC);
+ }
+ }
- return retval;*/
+ return &clone->std;
}
/* }}} */
@@ -559,10 +568,6 @@ static const zend_function_entry dom_functions[] = {
PHP_FE_END
};
-static zend_object_handlers* dom_get_obj_handlers(TSRMLS_D) {
- return &dom_object_handlers;
-}
-
static const zend_module_dep dom_deps[] = {
ZEND_MOD_REQUIRED("libxml")
ZEND_MOD_CONFLICTS("domxml")
@@ -590,6 +595,7 @@ ZEND_GET_MODULE(dom)
void dom_objects_free_storage(zend_object *object TSRMLS_DC);
void dom_nnodemap_objects_free_storage(zend_object *object TSRMLS_DC);
+static zend_object *dom_objects_store_clone_obj(zval *zobject TSRMLS_DC);
static void dom_nnodemap_object_dtor(zend_object *object TSRMLS_DC);
#if defined(LIBXML_XPATH_ENABLED)
void dom_xpath_objects_free_storage(zend_object *object TSRMLS_DC);
@@ -603,6 +609,7 @@ PHP_MINIT_FUNCTION(dom)
memcpy(&dom_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
dom_object_handlers.offset = XtOffsetOf(dom_object, std);
dom_object_handlers.free_obj = dom_objects_free_storage;
+ dom_object_handlers.clone_obj = dom_objects_store_clone_obj;
dom_object_handlers.read_property = dom_read_property;
dom_object_handlers.write_property = dom_write_property;
dom_object_handlers.get_property_ptr_ptr = dom_get_property_ptr_ptr;
@@ -1091,39 +1098,6 @@ static dom_object* dom_objects_set_class(zend_class_entry *class_type, zend_bool
}
/* }}} */
-/* {{{ dom_objects_clone */
-void dom_objects_clone(void *object, void **object_clone TSRMLS_DC)
-{
- dom_object *intern = (dom_object *) object;
- dom_object *clone;
- xmlNodePtr node;
- xmlNodePtr cloned_node;
-
- clone = dom_objects_set_class(intern->std.ce, 0 TSRMLS_CC);
-
- if (instanceof_function(intern->std.ce, dom_node_class_entry TSRMLS_CC)) {
- node = (xmlNodePtr)dom_object_get_node((dom_object *) object);
- if (node != NULL) {
- cloned_node = xmlDocCopyNode(node, node->doc, 1);
- if (cloned_node != NULL) {
- /* If we cloned a document then we must create new doc proxy */
- if (cloned_node->doc == node->doc) {
- clone->document = intern->document;
- }
- php_libxml_increment_doc_ref((php_libxml_node_object *)clone, cloned_node->doc TSRMLS_CC);
- php_libxml_increment_node_ptr((php_libxml_node_object *)clone, cloned_node, (void *)clone TSRMLS_CC);
- if (intern->document != clone->document) {
- dom_copy_doc_props(intern->document, clone->document);
- }
- }
-
- }
- }
-
- *object_clone = (void *) clone;
-}
-/* }}} */
-
/* {{{ dom_objects_new */
zend_object *dom_objects_new(zend_class_entry *class_type TSRMLS_DC)
{