edje: O(1) access time for edje_cc_handler parameter.
authorcedric <cedric>
Tue, 11 Sep 2012 04:38:50 +0000 (04:38 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 11 Sep 2012 04:38:50 +0000 (04:38 +0000)
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).

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@76433 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
NEWS
src/bin/edje_cc.h
src/bin/edje_cc_parse.c

index 5eefd0e..0912771 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 
        * 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/NEWS b/NEWS
index 9a9e879..298d9c6 100644 (file)
--- a/NEWS
+++ b/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:
 
index e7fb7a4..9a6d2f2 100644 (file)
@@ -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;
index 2a3295d..9695700 100644 (file)
@@ -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(&params, 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(&params))
+     return eina_array_data_get(&params, 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(&params)))
+                         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(&params, 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(&params, sizeof (Eina_Array), 8);
         parse(data, size);
+       eina_array_flush(&params);
         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(&params))
+     {
+        result |= _parse_enum(eina_array_data_get(&params, 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(&params);
 }
 
 void
 check_arg_count(int required_args)
 {
-   int num_args = eina_list_count (params);
+   int num_args = eina_array_count(&params);
 
    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(&params);
 
    if (num_args < min_required_args)
      {