From b5088a4a633af9184e711ac1cc000bf958eeca3b Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Mon, 6 Dec 2010 22:12:05 +0000 Subject: Fix copy constructors to actually copy all members, instead of leaving the majority of them uninitialised svn path=/trunk/libdom/; revision=11023 --- src/core/attr.c | 11 ++++++++++- src/core/node.c | 32 ++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/core/attr.c b/src/core/attr.c index 4cd9e76..b280057 100644 --- a/src/core/attr.c +++ b/src/core/attr.c @@ -780,9 +780,18 @@ dom_exception _dom_attr_copy(struct dom_node_internal *new, dom_attr *oa = (dom_attr *) old; na->specified = oa->specified; - na->is_id = oa->is_id; /* TODO: deal with dom_type_info, it get no definition ! */ + na->schema_type_info = NULL; + + na->is_id = oa->is_id; + + na->type = oa->type; + + na->value = oa->value; + + /* TODO: is this correct? */ + na->read_only = false; return _dom_node_copy(new, old); } diff --git a/src/core/node.c b/src/core/node.c index d4007df..c10f740 100644 --- a/src/core/node.c +++ b/src/core/node.c @@ -1924,11 +1924,12 @@ dom_exception _dom_node_copy(dom_node_internal *new, dom_node_internal *old) { dom_exception err; - new->vtable = old->vtable; new->base.vtable = old->base.vtable; + new->vtable = old->vtable; - assert(old->owner != NULL); - assert(new->owner != NULL); + new->name = lwc_string_ref(old->name); + + /* Value - see below */ new->type = old->type; new->parent = NULL; @@ -1936,20 +1937,31 @@ dom_exception _dom_node_copy(dom_node_internal *new, dom_node_internal *old) new->last_child = NULL; new->previous = NULL; new->next = NULL; - new->owner = old->owner; - new->name = lwc_string_ref(old->name); + assert(old->owner != NULL); + assert(new->owner != NULL); + new->owner = old->owner; if (old->namespace != NULL) new->namespace = lwc_string_ref(old->namespace); + else + new->namespace = NULL; if (old->prefix != NULL) new->prefix = lwc_string_ref(old->prefix); + else + new->prefix = NULL; - dom_alloc al; - void *pw; - + new->user_data = NULL; + new->refcnt = 1; + + list_init(&new->pending_list); + + /* Value */ if (old->value != NULL) { + dom_alloc al; + void *pw; + _dom_document_get_allocator(new->owner, &al, &pw); dom_string *value; err = dom_string_clone(al, pw, old->value, &value); @@ -1961,10 +1973,6 @@ dom_exception _dom_node_copy(dom_node_internal *new, dom_node_internal *old) new->value = NULL; } - new->user_data = NULL; - new->refcnt = 1; - - list_init(&new->pending_list); /* The new copyed node has no parent, * so it should be put in the pending list. */ dom_node_mark_pending(new); -- cgit v1.2.3