From 9d6ec11e245b6b631b72ce4a2f06105b80f5f591 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 11 Sep 2012 04:38:50 +0000 Subject: [PATCH] edje: O(1) access time for edje_cc_handler parameter. This give another 10% speed improvements (and also reduce massively memory allocation as we do it once for one array instead of thousand of time per list of parameters). SVN revision: 76433 --- legacy/edje/ChangeLog | 1 + legacy/edje/NEWS | 1 + legacy/edje/src/bin/edje_cc.h | 1 - legacy/edje/src/bin/edje_cc_parse.c | 63 +++++++++++++++++------------ 4 files changed, 40 insertions(+), 26 deletions(-) diff --git a/legacy/edje/ChangeLog b/legacy/edje/ChangeLog index 5eefd0efd7..0912771587 100644 --- a/legacy/edje/ChangeLog +++ b/legacy/edje/ChangeLog @@ -610,3 +610,4 @@ * O(1) lookup used when searching Part_Lookup in edje_cc. * O(1) lookup when generating alias of group. + * O(1) access time for parameters in edje_cc_handler. diff --git a/legacy/edje/NEWS b/legacy/edje/NEWS index 9a9e8795af..298d9c6631 100644 --- a/legacy/edje/NEWS +++ b/legacy/edje/NEWS @@ -13,6 +13,7 @@ Improvements: * Check the number of parameter for image in edc. * O(1) lookup used when searching Part_Lookup in edje_cc. * O(1) lookup when generating alias of group. + * O(1) access time for parameters in edje_cc_handler. Fixes: diff --git a/legacy/edje/src/bin/edje_cc.h b/legacy/edje/src/bin/edje_cc.h index e7fb7a4723..9a6d2f257a 100644 --- a/legacy/edje/src/bin/edje_cc.h +++ b/legacy/edje/src/bin/edje_cc.h @@ -237,7 +237,6 @@ extern int min_quality; extern int max_quality; extern int line; extern Eina_List *stack; -extern Eina_List *params; extern Edje_File *edje_file; extern Eina_List *edje_collections; extern Eina_Hash *edje_collections_lookup; diff --git a/legacy/edje/src/bin/edje_cc_parse.c b/legacy/edje/src/bin/edje_cc_parse.c index 2a3295da16..9695700b79 100644 --- a/legacy/edje/src/bin/edje_cc_parse.c +++ b/legacy/edje/src/bin/edje_cc_parse.c @@ -74,7 +74,7 @@ static int strstrip(const char *in, char *out, size_t size); int line = 0; Eina_List *stack = NULL; -Eina_List *params = NULL; +Eina_Array params; static char file_buf[4096]; static int verbatim = 0; @@ -98,11 +98,12 @@ err_show_stack(void) static void err_show_params(void) { - Eina_List *l; + Eina_Array_Iterator iterator; + unsigned int i; char *p; ERR("PARAMS:"); - EINA_LIST_FOREACH(params, l, p) + EINA_ARRAY_ITER_NEXT(¶ms, i, p, iterator) { ERR(" %s", p); } @@ -115,6 +116,14 @@ err_show(void) err_show_params(); } +static char * +_parse_param_get(int n) +{ + if (n < (int) eina_array_count(¶ms)) + return eina_array_data_get(¶ms, n); + return NULL; +} + static Eina_Hash *_new_object_hash = NULL; static Eina_Hash *_new_statement_hash = NULL; static Eina_Hash *_new_nested_hash = NULL; @@ -590,14 +599,13 @@ parse(char *data, off_t size) { if (do_params) { + void *param; + do_params = 0; new_statement(); /* clear out params */ - while (params) - { - free(eina_list_data_get(params)); - params = eina_list_remove(params, eina_list_data_get(params)); - } + while ((param = eina_array_pop(¶ms))) + free(param); /* remove top from stack */ stack_pop(); } @@ -617,7 +625,9 @@ parse(char *data, off_t size) else { if (do_params) - params = eina_list_append(params, token); + { + eina_array_push(¶ms, token); + } else { stack_push(token); @@ -849,7 +859,9 @@ compile(void) if (data && (read(fd, data, size) == size)) { stack_buf = eina_strbuf_new(); + eina_array_step_set(¶ms, sizeof (Eina_Array), 8); parse(data, size); + eina_array_flush(¶ms); eina_strbuf_free(stack_buf); stack_buf = NULL; } @@ -876,7 +888,7 @@ is_param(int n) { char *str; - str = eina_list_nth(params, n); + str = _parse_param_get(n); if (str) return 1; return 0; } @@ -888,7 +900,7 @@ is_num(int n) char *end; long int ret; - str = eina_list_nth(params, n); + str = _parse_param_get(n); if (!str) { ERR("%s:%i no parameter supplied as argument %i", @@ -913,7 +925,7 @@ parse_str(int n) char *str; char *s; - str = eina_list_nth(params, n); + str = _parse_param_get(n); if (!str) { ERR("%s:%i no parameter supplied as argument %i", @@ -977,7 +989,7 @@ parse_enum(int n, ...) int result; va_list va; - str = eina_list_nth(params, n); + str = _parse_param_get(n); if (!str) { ERR("%s:%i no parameter supplied as argument %i", @@ -996,14 +1008,15 @@ parse_enum(int n, ...) int parse_flags(int n, ...) { - Eina_List *lst; int result = 0; va_list va; - char *data; va_start(va, n); - EINA_LIST_FOREACH(eina_list_nth_list(params, n), lst, data) - result |= _parse_enum(data, va); + while (n < (int) eina_array_count(¶ms)) + { + result |= _parse_enum(eina_array_data_get(¶ms, n), va); + n++; + } va_end(va); return result; @@ -1015,7 +1028,7 @@ parse_int(int n) char *str; int i; - str = eina_list_nth(params, n); + str = _parse_param_get(n); if (!str) { ERR("%s:%i no parameter supplied as argument %i", @@ -1033,7 +1046,7 @@ parse_int_range(int n, int f, int t) char *str; int i; - str = eina_list_nth(params, n); + str = _parse_param_get(n); if (!str) { ERR("%s:%i no parameter supplied as argument %i", @@ -1058,7 +1071,7 @@ parse_bool(int n) char *str, buf[4096]; int i; - str = eina_list_nth(params, n); + str = _parse_param_get(n); if (!str) { ERR("%s:%i no parameter supplied as argument %i", @@ -1096,7 +1109,7 @@ parse_float(int n) char *str; double i; - str = eina_list_nth(params, n); + str = _parse_param_get(n); if (!str) { ERR("%s:%i no parameter supplied as argument %i", @@ -1114,7 +1127,7 @@ parse_float_range(int n, double f, double t) char *str; double i; - str = eina_list_nth(params, n); + str = _parse_param_get(n); if (!str) { ERR("%s:%i no parameter supplied as argument %i", @@ -1136,13 +1149,13 @@ parse_float_range(int n, double f, double t) int get_arg_count(void) { - return eina_list_count (params); + return eina_array_count(¶ms); } void check_arg_count(int required_args) { - int num_args = eina_list_count (params); + int num_args = eina_array_count(¶ms); if (num_args != required_args) { @@ -1156,7 +1169,7 @@ check_arg_count(int required_args) void check_min_arg_count(int min_required_args) { - int num_args = eina_list_count (params); + int num_args = eina_array_count(¶ms); if (num_args < min_required_args) {