diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2010-12-06 22:12:05 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2010-12-06 22:12:05 +0000 |
commit | c8534543c994eb03ecae71064dae88cc320f2e09 (patch) | |
tree | d345f036b4718830ec7d885671dec5e55a3bd03b | |
parent | 7f6a523284959458c26cd27d9386329223ba920c (diff) | |
download | libdom-c8534543c994eb03ecae71064dae88cc320f2e09.tar.gz libdom-c8534543c994eb03ecae71064dae88cc320f2e09.tar.bz2 |
Fix copy constructors to actually copy all members, instead of leaving the majority of them uninitialised
svn path=/trunk/libdom/; revision=11023
-rw-r--r-- | src/core/attr.c | 11 | ||||
-rw-r--r-- | src/core/node.c | 32 |
2 files changed, 30 insertions, 13 deletions
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); |