This new patch just allocate and build the match automate for
callbacks and programs only when required. On load for programs and
when callbacks list has been updated.

-- 
Cedric BAIL
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/edje_load.c e17-dev/libs/edje/src/lib/edje_load.c
--- e17-clean/libs/edje/src/lib/edje_load.c	2008-02-06 17:40:08.000000000 +0100
+++ e17-dev/libs/edje/src/lib/edje_load.c	2008-02-14 16:37:17.000000000 +0100
@@ -411,6 +411,8 @@
 	       }
 	  }
 	n = evas_list_count(ed->collection->programs);
+        ed->patterns.programs.signals_patterns = edje_match_programs_signal_init(ed->collection->programs);
+        ed->patterns.programs.sources_patterns = edje_match_programs_source_init(ed->collection->programs);
 	if (n > 0)
 	  {
 	     /* FIXME: keeping a table AND a list is just bad - nuke list */
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/edje_match.c e17-dev/libs/edje/src/lib/edje_match.c
--- e17-clean/libs/edje/src/lib/edje_match.c	2008-01-18 07:34:04.000000000 +0100
+++ e17-dev/libs/edje/src/lib/edje_match.c	2008-02-11 20:00:12.000000000 +0100
@@ -14,7 +14,6 @@
   size_t        pos;
 };
 
-typedef struct _Edje_States     Edje_States;
 struct _Edje_States
 {
   size_t         size;
@@ -37,12 +36,13 @@
      Size++;                                    \
   };
 
-static Edje_States*
-_edje_match_states_alloc(size_t n,
-                         size_t patterns_size,
-                         size_t patterns_max_length)
+static int
+_edje_match_states_alloc(Edje_Patterns *ppat, int n)
 {
-   Edje_States  *l;
+   Edje_States *l;
+
+   const size_t patterns_size = ppat->patterns_size;
+   const size_t patterns_max_length = ppat->max_length;
 
    const size_t array_len = (patterns_max_length + 1) * patterns_size;
 
@@ -69,8 +69,9 @@
    struct_size += states_has_size;
 
    l = malloc(n * struct_size);
-   if (!l) return NULL;
+   if (!l) return -1;
 
+   ppat->states = l;
    states = (unsigned char *) (l + n);
    has = states + states_size;
 
@@ -82,7 +83,7 @@
         has += states_has_size;
      }
 
-   return l;
+   return 0;
 }
 
 static void
@@ -295,6 +296,12 @@
           lst = evas_list_next(lst);                            \
        }                                                        \
                                                                 \
+     if (_edje_match_states_alloc(r, 2))                        \
+       {                                                        \
+          free(r);                                              \
+          return NULL;                                          \
+       }                                                        \
+                                                                \
      return r;                                                  \
   }
 
@@ -451,22 +458,16 @@
 edje_match_collection_dir_exec(const Edje_Patterns      *ppat,
                                const char               *string)
 {
-   Edje_States  *states = _edje_match_states_alloc(2,
-                                                   ppat->patterns_size,
-                                                   ppat->max_length);
    Edje_States  *result;
    int           r = 0;
 
-   if (!states)
-     return 0;
-   _edje_match_patterns_exec_init_states(states, ppat->patterns_size, ppat->max_length);
+   _edje_match_patterns_exec_init_states(ppat->states, ppat->patterns_size, ppat->max_length);
 
-   result = _edje_match_fn(ppat, string, states);
+   result = _edje_match_fn(ppat, string, ppat->states);
 
    if (result)
      r = _edje_match_collection_dir_exec_finals(ppat->finals, result);
 
-   _edje_match_states_free(states, 2);
    return r;
 }
 
@@ -479,28 +480,19 @@
                          int (*func)(Edje_Program *pr, void *data),
                          void                   *data)
 {
-   Edje_States  *signal_states = _edje_match_states_alloc(2,
-                                                          ppat_signal->patterns_size,
-                                                          ppat_signal->max_length);
-   Edje_States  *source_states = _edje_match_states_alloc(2,
-                                                          ppat_source->patterns_size,
-                                                          ppat_source->max_length);
    Edje_States  *signal_result;
    Edje_States  *source_result;
    int           r = 0;
 
-   if (!signal_states || !source_states)
-     return 0;
-
-   _edje_match_patterns_exec_init_states(signal_states,
+   _edje_match_patterns_exec_init_states(ppat_signal->states,
                                          ppat_signal->patterns_size,
                                          ppat_signal->max_length);
-   _edje_match_patterns_exec_init_states(source_states,
+   _edje_match_patterns_exec_init_states(ppat_source->states,
                                          ppat_source->patterns_size,
                                          ppat_source->max_length);
 
-   signal_result = _edje_match_fn(ppat_signal, signal, signal_states);
-   source_result = _edje_match_fn(ppat_source, source, source_states);
+   signal_result = _edje_match_fn(ppat_signal, signal, ppat_signal->states);
+   source_result = _edje_match_fn(ppat_source, source, ppat_source->states);
 
    if (signal_result && source_result)
      r = edje_match_programs_exec_check_finals(ppat_signal->finals,
@@ -510,9 +502,6 @@
                                                programs,
                                                func,
                                                data);
-
-   _edje_match_states_free(source_states, 2);
-   _edje_match_states_free(signal_states, 2);
    return r;
 }
 
@@ -524,28 +513,19 @@
                          Evas_List              *callbacks,
                          Edje                   *ed)
 {
-   Edje_States  *signal_states = _edje_match_states_alloc(2,
-                                                          ppat_signal->patterns_size,
-                                                          ppat_signal->max_length);
-   Edje_States  *source_states = _edje_match_states_alloc(2,
-                                                          ppat_source->patterns_size,
-                                                          ppat_source->max_length);
    Edje_States  *signal_result;
    Edje_States  *source_result;
    int           r = 0;
 
-   if (!signal_states || !source_states)
-     return 0;
-
-   _edje_match_patterns_exec_init_states(signal_states,
+   _edje_match_patterns_exec_init_states(ppat_signal->states,
                                          ppat_signal->patterns_size,
                                          ppat_signal->max_length);
-   _edje_match_patterns_exec_init_states(source_states,
+   _edje_match_patterns_exec_init_states(ppat_source->states,
                                          ppat_source->patterns_size,
                                          ppat_source->max_length);
 
-   signal_result = _edje_match_fn(ppat_signal, signal, signal_states);
-   source_result = _edje_match_fn(ppat_source, source, source_states);
+   signal_result = _edje_match_fn(ppat_signal, signal, ppat_signal->states);
+   source_result = _edje_match_fn(ppat_source, source, ppat_source->states);
 
    if (signal_result && source_result)
      r = edje_match_callback_exec_check_finals(ppat_signal->finals,
@@ -556,15 +536,13 @@
                                                source,
                                                callbacks,
                                                ed);
-
-   _edje_match_states_free(source_states, 2);
-   _edje_match_states_free(signal_states, 2);
    return r;
 }
 
 void
 edje_match_patterns_free(Edje_Patterns *ppat)
 {
+   _edje_match_states_free(ppat->states, 2);
    free(ppat);
 }
 
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/edje_private.h e17-dev/libs/edje/src/lib/edje_private.h
--- e17-clean/libs/edje/src/lib/edje_private.h	2008-02-06 17:40:08.000000000 +0100
+++ e17-dev/libs/edje/src/lib/edje_private.h	2008-02-14 16:07:59.000000000 +0100
@@ -122,6 +123,7 @@
 typedef struct _Edje_Part_Image_Id                   Edje_Part_Image_Id;
 typedef struct _Edje_Part_Description                Edje_Part_Description;
 typedef struct _Edje_Spectrum_Color                  Edje_Spectrum_Color;
+typedef struct _Edje_Patterns                        Edje_Patterns;
 
 #define PI 3.14159265358979323846
 
@@ -606,6 +612,20 @@
    int                   table_programs_size;
    int                   table_parts_size;
 
+   struct
+   {
+     struct
+     {
+       Edje_Patterns                  *signals_patterns;
+       Edje_Patterns                  *sources_patterns;
+     } callbacks;
+     struct
+     {
+       Edje_Patterns                  *signals_patterns;
+       Edje_Patterns                  *sources_patterns;
+     } programs;
+   } patterns;
+
    int                   references;
    int                   block;
    int                   load_error;
@@ -913,14 +934,16 @@
      
 } Edje_Match_Error;
 
-typedef struct _Edje_Patterns   Edje_Patterns;
+typedef struct _Edje_States     Edje_States;
 struct _Edje_Patterns
 {
    const char    **patterns;
+
+   Edje_States    *states;
+
    size_t          patterns_size;
    size_t          max_length;
    size_t          finals[];
-   
 };
 
 Edje_Patterns   *edje_match_collection_dir_init(Evas_List *lst);
diff -Nrua -X exclude.cvs e17-clean/libs/edje/src/lib/edje_program.c e17-dev/libs/edje/src/lib/edje_program.c
--- e17-clean/libs/edje/src/lib/edje_program.c	2008-02-06 17:40:09.000000000 +0100
+++ e17-dev/libs/edje/src/lib/edje_program.c	2008-02-11 18:32:46.000000000 +0100
@@ -105,6 +105,13 @@
 	escb->just_added = 1;
 	ed->just_added_callbacks = 1;
      }
+   if (ed->patterns.callbacks.signals_patterns)
+     {
+        edje_match_patterns_free(ed->patterns.callbacks.signals_patterns);
+        edje_match_patterns_free(ed->patterns.callbacks.sources_patterns);
+        ed->patterns.callbacks.signals_patterns = NULL;
+        ed->patterns.callbacks.sources_patterns = NULL;
+     }
 }
 
 /** Remove a callback from an object
@@ -150,6 +157,14 @@
 	       }
 	     else
 	       {
+                  if (ed->patterns.callbacks.signals_patterns)
+                    {
+                       edje_match_patterns_free(ed->patterns.callbacks.signals_patterns);
+                       edje_match_patterns_free(ed->patterns.callbacks.sources_patterns);
+                       ed->patterns.callbacks.signals_patterns = NULL;
+                       ed->patterns.callbacks.sources_patterns = NULL;
+                    }
+
 		  ed->callbacks = evas_list_remove_list(ed->callbacks, l);
 		  if (escb->signal) evas_stringshare_del(escb->signal);
 		  if (escb->source) evas_stringshare_del(escb->source);
@@ -926,29 +941,16 @@
 	     data.matched = 0;
 	     data.matches = NULL;
 #endif
-             Edje_Patterns      *signals_patterns;
-             Edje_Patterns      *sources_patterns;
-
              if (ed->collection->programs)
                {
-                  signals_patterns = edje_match_programs_signal_init(ed->collection->programs);
-                  sources_patterns = edje_match_programs_source_init(ed->collection->programs);
-
-                  if (edje_match_programs_exec(signals_patterns,
-                                               sources_patterns,
+                  if (edje_match_programs_exec(ed->patterns.programs.signals_patterns,
+                                               ed->patterns.programs.sources_patterns,
                                                sig,
                                                src,
                                                ed->collection->programs,
                                                _edje_glob_callback,
                                                &data) == 0)
-                    {
-                       edje_match_patterns_free(signals_patterns);
-                       edje_match_patterns_free(sources_patterns);
-                       goto break_prog;
-                    }
-
-                  edje_match_patterns_free(signals_patterns);
-                  edje_match_patterns_free(sources_patterns);
+                    goto break_prog;
                }
 
 #ifdef EDJE_PROGRAM_CACHE
@@ -979,8 +981,6 @@
 static void
 _edje_emit_cb(Edje *ed, const char *sig, const char *src)
 {
-   Edje_Patterns        *signals_patterns;
-   Edje_Patterns        *sources_patterns;
    Evas_List            *l;
 
    if (ed->delete_me) return;
@@ -993,25 +993,21 @@
      {
         int     r;
 
-        signals_patterns = edje_match_callback_signal_init(ed->callbacks);
-        sources_patterns = edje_match_callback_source_init(ed->callbacks);
+        if (!ed->patterns.callbacks.signals_patterns)
+          {
+             ed->patterns.callbacks.signals_patterns = edje_match_callback_signal_init(ed->callbacks);
+             ed->patterns.callbacks.sources_patterns = edje_match_callback_source_init(ed->callbacks);
+          }
 
-        r = edje_match_callback_exec(signals_patterns,
-                                     sources_patterns,
+        r = edje_match_callback_exec(ed->patterns.callbacks.signals_patterns,
+                                     ed->patterns.callbacks.sources_patterns,
                                      sig,
                                      src,
                                      ed->callbacks,
                                      ed);
 
         if (!r)
-          {
-             edje_match_patterns_free(signals_patterns);
-             edje_match_patterns_free(sources_patterns);
-             goto break_prog;
-          }
-
-        edje_match_patterns_free(signals_patterns);
-        edje_match_patterns_free(sources_patterns);
+          goto break_prog;
      }
 
    ed->walking_callbacks = 0;
@@ -1030,6 +1026,14 @@
 	       escb->just_added = 0;
 	     if (escb->delete_me)
 	       {
+                  if (ed->patterns.callbacks.signals_patterns)
+                    {
+                       edje_match_patterns_free(ed->patterns.callbacks.signals_patterns);
+                       edje_match_patterns_free(ed->patterns.callbacks.sources_patterns);
+                       ed->patterns.callbacks.signals_patterns = NULL;
+                       ed->patterns.callbacks.sources_patterns = NULL;
+                    }
+
 		  ed->callbacks = evas_list_remove_list(ed->callbacks, l);
 		  if (escb->signal) evas_stringshare_del(escb->signal);
 		  if (escb->source) evas_stringshare_del(escb->source);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to