summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <michael.drake@codethink.co.uk>2021-05-15 19:55:22 +0100
committerMichael Drake <michael.drake@codethink.co.uk>2021-05-15 19:59:24 +0100
commitc4039d355598c9fabbdcc7ef5a663571ef40211d (patch)
tree00f830a13e08c56c1cbecddaf4e21918fa89b391
parent4de031adb16019295d67fe02e515f9982b32a74b (diff)
downloadlibhubbub-c4039d355598c9fabbdcc7ef5a663571ef40211d.tar.gz
libhubbub-c4039d355598c9fabbdcc7ef5a663571ef40211d.tar.bz2
Treebuilder: Allow element_type_from_name to be inlined.
Now it is mostly a wrapper for the gperf-generated hubbub_element_type_lookup. This reduces total instruction fetch cost from 4,523,112,517 to 4,511,919,445.
-rw-r--r--src/treebuilder/element-type.h26
-rw-r--r--src/treebuilder/internal.h3
-rw-r--r--src/treebuilder/treebuilder.c23
3 files changed, 26 insertions, 26 deletions
diff --git a/src/treebuilder/element-type.h b/src/treebuilder/element-type.h
index 08f58de..a8e33d9 100644
--- a/src/treebuilder/element-type.h
+++ b/src/treebuilder/element-type.h
@@ -9,6 +9,7 @@
#define hubbub_treebuilder_element_type_h_
#include "treebuilder/treebuilder.h"
+#include "utils/utils.h"
typedef enum
{
@@ -41,9 +42,34 @@ struct element_type_map {
element_type type;
};
+/* Generated by gperf */
const struct element_type_map *hubbub_element_type_lookup(
register const char *str,
register size_t len);
+/**
+ * Convert an element name into an element type
+ *
+ * \param treebuilder The treebuilder instance
+ * \param tag_name The tag name to consider
+ * \return The corresponding element type
+ */
+static inline element_type element_type_from_name(
+ hubbub_treebuilder *treebuilder,
+ const hubbub_string *tag_name)
+{
+ const struct element_type_map *value;
+
+ UNUSED(treebuilder);
+
+ value = hubbub_element_type_lookup((const char *)tag_name->ptr,
+ tag_name->len);
+ if (value == NULL) {
+ return UNKNOWN;
+ }
+
+ return value->type;
+}
+
#endif
diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h
index d9e1a00..debc33e 100644
--- a/src/treebuilder/internal.h
+++ b/src/treebuilder/internal.h
@@ -128,9 +128,6 @@ hubbub_error append_text(hubbub_treebuilder *treebuilder,
const hubbub_string *string);
hubbub_error complete_script(hubbub_treebuilder *treebuilder);
-element_type element_type_from_name(hubbub_treebuilder *treebuilder,
- const hubbub_string *tag_name);
-
bool is_special_element(element_type type);
bool is_scoping_element(element_type type);
bool is_formatting_element(element_type type);
diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c
index d2a186d..2d2d047 100644
--- a/src/treebuilder/treebuilder.c
+++ b/src/treebuilder/treebuilder.c
@@ -915,29 +915,6 @@ hubbub_error append_text(hubbub_treebuilder *treebuilder,
}
/**
- * Convert an element name into an element type
- *
- * \param treebuilder The treebuilder instance
- * \param tag_name The tag name to consider
- * \return The corresponding element type
- */
-element_type element_type_from_name(hubbub_treebuilder *treebuilder,
- const hubbub_string *tag_name)
-{
- const struct element_type_map *value;
-
- UNUSED(treebuilder);
-
- value = hubbub_element_type_lookup((const char *)tag_name->ptr,
- tag_name->len);
- if (value == NULL) {
- return UNKNOWN;
- }
-
- return value->type;
-}
-
-/**
* Determine if a node is a special element
*
* \param type Node type to consider