summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@netsurf-browser.org>2012-03-28 19:33:33 +0000
committerDaniel Silverstone <dsilvers@netsurf-browser.org>2012-03-28 19:33:33 +0000
commit805473190561d60f06e3b5d63cc30029137cf593 (patch)
tree8e40217b9719be155e97e030a7980d2bc0e471d7 /src
parent06aebd84b7e2cc8e573642b220b1667afff0bff6 (diff)
downloadlibdom-805473190561d60f06e3b5d63cc30029137cf593.tar.gz
libdom-805473190561d60f06e3b5d63cc30029137cf593.tar.bz2
Promote ref/unref in dom_node to be inlines.
svn path=/trunk/libdom/; revision=13761
Diffstat (limited to 'src')
-rw-r--r--src/core/attr.h1
-rw-r--r--src/core/characterdata.h1
-rw-r--r--src/core/document.c4
-rw-r--r--src/core/document.h1
-rw-r--r--src/core/document_type.h1
-rw-r--r--src/core/element.h1
-rw-r--r--src/core/node.c48
-rw-r--r--src/core/node.h8
8 files changed, 17 insertions, 48 deletions
diff --git a/src/core/attr.h b/src/core/attr.h
index 2558f65..ce40c29 100644
--- a/src/core/attr.h
+++ b/src/core/attr.h
@@ -62,6 +62,7 @@ dom_exception _dom_attr_is_default_namespace(dom_node_internal *node,
dom_exception _dom_attr_lookup_namespace(dom_node_internal *node,
dom_string *prefix, dom_string **result);
#define DOM_NODE_VTABLE_ATTR \
+ _dom_node_try_destroy, \
_dom_node_get_node_name, \
_dom_attr_get_node_value, /*overload*/\
_dom_node_set_node_value, \
diff --git a/src/core/characterdata.h b/src/core/characterdata.h
index cd1be0a..23be9c9 100644
--- a/src/core/characterdata.h
+++ b/src/core/characterdata.h
@@ -65,6 +65,7 @@ dom_exception _dom_characterdata_set_text_content(
_dom_characterdata_replace_data
#define DOM_NODE_VTABLE_CHARACTERDATA \
+ _dom_node_try_destroy, \
_dom_node_get_node_name, \
_dom_node_get_node_value, \
_dom_node_set_node_value, \
diff --git a/src/core/document.c b/src/core/document.c
index 723d4f8..5a286fc 100644
--- a/src/core/document.c
+++ b/src/core/document.c
@@ -1345,7 +1345,7 @@ dom_exception dom_document_dup_node(dom_document *doc, dom_node *node,
}
/**
- * Try to destory the document.
+ * Try to destroy the document.
*
* \param doc The instance of Document
*
@@ -1357,7 +1357,7 @@ dom_exception dom_document_dup_node(dom_document *doc, dom_node *node,
*/
void _dom_document_try_destroy(dom_document *doc)
{
- if (doc->base.refcnt != 0 || doc->base.parent != NULL)
+ if (doc->base.base.refcnt != 0 || doc->base.parent != NULL)
return;
_dom_document_destroy((dom_node_internal *) doc);
diff --git a/src/core/document.h b/src/core/document.h
index d8e6945..a2b1801 100644
--- a/src/core/document.h
+++ b/src/core/document.h
@@ -190,6 +190,7 @@ dom_exception _dom_document_set_text_content(dom_node_internal *node,
/* End of vtable */
#define DOM_NODE_VTABLE_DOCUMENT \
+ _dom_node_try_destroy, \
_dom_node_get_node_name, \
_dom_node_get_node_value, \
_dom_node_set_node_value, \
diff --git a/src/core/document_type.h b/src/core/document_type.h
index bccc469..2426b30 100644
--- a/src/core/document_type.h
+++ b/src/core/document_type.h
@@ -57,6 +57,7 @@ dom_exception _dom_document_type_set_text_content(dom_node_internal *node,
_dom_document_type_get_internal_subset
#define DOM_NODE_VTABLE_DOCUMENT_TYPE \
+ _dom_node_try_destroy, \
_dom_node_get_node_name, \
_dom_node_get_node_value, \
_dom_node_set_node_value, \
diff --git a/src/core/element.h b/src/core/element.h
index 9092a48..5873396 100644
--- a/src/core/element.h
+++ b/src/core/element.h
@@ -145,6 +145,7 @@ dom_exception _dom_element_is_default_namespace(dom_node_internal *node,
dom_exception _dom_element_lookup_namespace(dom_node_internal *node,
dom_string *prefix, dom_string **result);
#define DOM_NODE_VTABLE_ELEMENT \
+ _dom_node_try_destroy, \
_dom_node_get_node_name, \
_dom_node_get_node_value, \
_dom_node_set_node_value, \
diff --git a/src/core/node.c b/src/core/node.c
index 4509f10..628c7c6 100644
--- a/src/core/node.c
+++ b/src/core/node.c
@@ -198,7 +198,7 @@ dom_exception _dom_node_initialise(dom_node_internal *node,
node->user_data = NULL;
- node->refcnt = 1;
+ node->base.refcnt = 1;
list_init(&node->pending_list);
if (node->type != DOM_DOCUMENT_NODE) {
@@ -279,48 +279,12 @@ void _dom_node_finalise(dom_node_internal *node)
}
}
-/**
- * Claim a reference on a DOM node
- *
- * \param node The node to claim a reference on
- */
-struct dom_node *_dom_node_ref(dom_node_internal *node)
-{
- if (node != NULL)
- node->refcnt++;
-
- return (struct dom_node *)node;
-}
-
/* ---------------------------------------------------------------------*/
/* The public virtual function of this interface Node */
/**
- * Release a reference on a DOM node
- *
- * \param node The node to release the reference from
- *
- * If the reference count reaches zero and the node is not part of any
- * document, any memory claimed by the node will be released.
- *
- * If the parent of the node is NULL but the reference count does not reach
- * zero, this means we should put this node to the document's deletion pending
- * list. When the refcnt reach zero, we delete it.
- */
-void _dom_node_unref(dom_node_internal *node)
-{
- if (node == NULL)
- return;
-
- if (node->refcnt > 0)
- node->refcnt--;
-
- dom_node_try_destroy(node);
-}
-
-/**
* Retrieve the name of a DOM node
*
* \param node The node to retrieve the name of
@@ -1872,7 +1836,7 @@ dom_exception _dom_node_copy_internal(dom_node_internal *old,
new->prefix = NULL;
new->user_data = NULL;
- new->refcnt = 1;
+ new->base.refcnt = 1;
list_init(&new->pending_list);
@@ -2214,13 +2178,13 @@ dom_exception _dom_merge_adjacent_text(dom_node_internal *p,
*
* @note: Owning a node does not means this node's refcnt is above zero.
*/
-void _dom_node_try_destroy(dom_node_internal *node)
+dom_exception _dom_node_try_destroy(dom_node_internal *node)
{
if (node == NULL)
- return;
+ return DOM_NO_ERR;
if (node->parent == NULL) {
- if (node->refcnt == 0) {
+ if (node->base.refcnt == 0) {
dom_node_destroy(node);
} else if (node->pending_list.prev == &node->pending_list){
assert (node->pending_list.next == &node->pending_list);
@@ -2228,6 +2192,8 @@ void _dom_node_try_destroy(dom_node_internal *node)
&node->pending_list);
}
}
+
+ return DOM_NO_ERR;
}
/**
diff --git a/src/core/node.h b/src/core/node.h
index 22540c7..87f3cb3 100644
--- a/src/core/node.h
+++ b/src/core/node.h
@@ -73,8 +73,6 @@ struct dom_node_internal {
struct dom_user_data *user_data; /**< User data list */
- uint32_t refcnt; /**< Reference count */
-
struct list_entry pending_list; /**< The document delete pending list */
dom_event_target_internal eti; /**< The EventTarget interface */
@@ -195,7 +193,8 @@ dom_exception _dom_node_get_user_data(dom_node_internal *node,
_dom_node_remove_event_listener_ns
#define DOM_NODE_VTABLE \
- _dom_node_get_node_name, \
+ _dom_node_try_destroy, \
+ _dom_node_get_node_name, \
_dom_node_get_node_value, \
_dom_node_set_node_value, \
_dom_node_get_node_type, \
@@ -283,8 +282,7 @@ dom_exception _dom_merge_adjacent_text(dom_node_internal *p,
/* Try to destroy the node, if its refcnt is not zero, then append it to the
* owner document's pending list */
-void _dom_node_try_destroy(dom_node_internal *node);
-#define dom_node_try_destroy(n) _dom_node_try_destroy((dom_node_internal *) (n))
+dom_exception _dom_node_try_destroy(dom_node_internal *node);
/* To add some node to the pending list */
void _dom_node_mark_pending(dom_node_internal *node);