diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2011-11-06 18:02:23 +0000 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2011-11-06 18:02:23 +0000 |
commit | d37629b3d5eb5433d5de72a3edc39cc036e2ba08 (patch) | |
tree | 9fcf7d31b9c53147c5256c93619cc68fa5e7f534 | |
parent | 421872ffc8e4d36e6fab6c69181642706b4817d6 (diff) | |
download | libcss-d37629b3d5eb5433d5de72a3edc39cc036e2ba08.tar.gz libcss-d37629b3d5eb5433d5de72a3edc39cc036e2ba08.tar.bz2 |
Avoid trying to add already-cached selectors to reject cache. Remove pre-insertion search.
svn path=/trunk/libcss/; revision=13131
-rw-r--r-- | src/select/select.c | 39 |
1 files changed, 15 insertions, 24 deletions
diff --git a/src/select/select.c b/src/select/select.c index cc6b646..d1f4ffd 100644 --- a/src/select/select.c +++ b/src/select/select.c @@ -95,7 +95,7 @@ static css_error match_named_combinator(css_select_ctx *ctx, static css_error match_universal_combinator(css_select_ctx *ctx, css_combinator type, const css_selector *selector, css_select_state *state, void *node, bool may_optimise, - void **next_node); + bool *rejected_by_cache, void **next_node); static css_error match_details(css_select_ctx *ctx, void *node, const css_selector_detail *detail, css_select_state *state, bool *match, css_pseudo_element *pseudo_element); @@ -1135,8 +1135,6 @@ static void update_reject_cache(css_select_state *state, { const css_selector_detail *detail = &s->data; const css_selector_detail *next_detail = NULL; - reject_item *reject = state->reject_cache; - bool match = false; if (detail->next) next_detail = detail + 1; @@ -1150,24 +1148,10 @@ static void update_reject_cache(css_select_state *state, next_detail->type != CSS_SELECTOR_ID)) return; - /* Search cache for matching entry */ - while (reject != state->next_reject) { - if (reject->type == next_detail->type && - lwc_string_isequal(reject->value, - next_detail->qname.name, - &match) == lwc_error_ok && - match) - break; - - reject++; - } - - /* None found: insert */ - if (reject == state->next_reject) { - state->next_reject->type = next_detail->type; - state->next_reject->value = next_detail->qname.name; - state->next_reject++; - } + /* Insert */ + state->next_reject->type = next_detail->type; + state->next_reject->value = next_detail->qname.name; + state->next_reject++; } css_error match_selector_chain(css_select_ctx *ctx, @@ -1177,6 +1161,7 @@ css_error match_selector_chain(css_select_ctx *ctx, void *node = state->node; const css_selector_detail *detail = &s->data; bool match = false, may_optimise = true; + bool rejected_by_cache; css_pseudo_element pseudo; css_error error; @@ -1230,13 +1215,15 @@ css_error match_selector_chain(css_select_ctx *ctx, error = match_universal_combinator(ctx, s->data.comb, s->combinator, state, node, - may_optimise, &next_node); + may_optimise, &rejected_by_cache, + &next_node); if (error != CSS_OK) return error; /* No match for combinator, so reject selector chain */ if (next_node == NULL) { - if (may_optimise && s == selector) { + if (may_optimise && s == selector && + !rejected_by_cache) { update_reject_cache(state, s->data.comb, s->combinator); } @@ -1340,7 +1327,8 @@ css_error match_named_combinator(css_select_ctx *ctx, css_combinator type, css_error match_universal_combinator(css_select_ctx *ctx, css_combinator type, const css_selector *selector, css_select_state *state, - void *node, bool may_optimise, void **next_node) + void *node, bool may_optimise, bool *rejected_by_cache, + void **next_node) { const css_selector_detail *detail = &selector->data; const css_selector_detail *next_detail = NULL; @@ -1350,6 +1338,8 @@ css_error match_universal_combinator(css_select_ctx *ctx, css_combinator type, if (detail->next) next_detail = detail + 1; + *rejected_by_cache = false; + /* Consult reject cache first */ if (may_optimise && (type == CSS_COMBINATOR_ANCESTOR || type == CSS_COMBINATOR_PARENT) && @@ -1368,6 +1358,7 @@ css_error match_universal_combinator(css_select_ctx *ctx, css_combinator type, match) { /* Found it: can't match */ *next_node = NULL; + *rejected_by_cache = true; return CSS_OK; } |