edje: fix run on 64bits system.
authorCedric Bail <cedric.bail@free.fr>
Sun, 17 Mar 2013 04:00:20 +0000 (13:00 +0900)
committerCedric BAIL <cedric.bail@samsung.com>
Mon, 18 Mar 2013 07:28:22 +0000 (16:28 +0900)
src/lib/edje/edje_match.c
src/lib/edje/edje_private.h
src/lib/edje/edje_program.c
src/lib/edje/edje_signal.c

index 5d66b61..5db023c 100644 (file)
@@ -509,8 +509,6 @@ edje_match_programs_exec_check_finals(const unsigned int *signal_finals,
 static int
 edje_match_callback_exec_check_finals(const Edje_Signals_Sources_Patterns *ssp,
                                       const Edje_Signal_Callback_Match    *matches,
-                                      const void       **custom_data,
-                                      const Eina_Bool   *flags,
                                       const Edje_States *signal_states,
                                       const Edje_States *source_states,
                                       const char        *sig,
@@ -541,7 +539,7 @@ edje_match_callback_exec_check_finals(const Edje_Signals_Sources_Patterns *ssp,
                     cb = &matches[*e];
                     if (cb)
                       {
-                         if ((prop) && _edje_signal_callback_prop(flags, *e)) continue;
+                        if ((prop) && _edje_signal_callback_prop(ed->callbacks->flags, *e)) continue;
                         eina_array_push(&run, cb);
                         r = 2;
                       }
@@ -553,7 +551,9 @@ edje_match_callback_exec_check_finals(const Edje_Signals_Sources_Patterns *ssp,
      {
         int idx = cb - matches;
 
-        cb->func((void*) custom_data[idx], ed->obj, sig, source);
+       if (_edje_signal_callback_run(ed->callbacks->flags, idx)) continue; 
+
+        cb->func((void*) ed->callbacks->custom_data[idx], ed->obj, sig, source);
         if (_edje_block_break(ed))
          {
              r = 0;
@@ -684,8 +684,6 @@ edje_match_programs_exec(const Edje_Patterns    *ppat_signal,
 int
 edje_match_callback_exec(const Edje_Signals_Sources_Patterns *ssp,
                         const Edje_Signal_Callback_Match *matches,
-                        const void **custom_data,
-                        const Eina_Bool *flags,
                          const char *sig,
                          const char *source,
                          Edje *ed,
@@ -713,8 +711,6 @@ edje_match_callback_exec(const Edje_Signals_Sources_Patterns *ssp,
    if (signal_result && source_result)
      r = edje_match_callback_exec_check_finals(ssp,
                                               matches,
-                                              custom_data,
-                                              flags,
                                                signal_result,
                                                source_result,
                                                sig,
index c6bd236..376cb1b 100644 (file)
@@ -1836,8 +1836,6 @@ Eina_Bool        edje_match_programs_exec(const Edje_Patterns    *ppat_signal,
                                           Eina_Bool               prop);
 int edje_match_callback_exec(const Edje_Signals_Sources_Patterns *ssp,
                             const Edje_Signal_Callback_Match *matches,
-                            const void **custom_data,
-                            const Eina_Bool *flags,
                             const char *sig,
                             const char *source,
                             Edje *ed,
@@ -1967,6 +1965,8 @@ void  _edje_signals_sources_patterns_clean(Edje_Signals_Sources_Patterns *ssp);
 const Edje_Signals_Sources_Patterns *_edje_signal_callback_patterns_ref(const Edje_Signal_Callback_Group *gp);
 void _edje_signal_callback_patterns_unref(const Edje_Signals_Sources_Patterns *essp);
 Eina_Bool _edje_signal_callback_prop(const Eina_Bool *flags, int i);
+Eina_Bool _edje_signal_callback_run(const Eina_Bool *flags, unsigned int i);
+void _edje_signal_callback_reset(Eina_Bool *flags, unsigned int length);
 
 void _edje_signal_callback_free(const Edje_Signal_Callback_Group *gp);
 
index 2eb3630..b916d76 100644 (file)
@@ -1408,8 +1408,6 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
 {
    const Edje_Signals_Sources_Patterns *ssp;
    Edje_Signal_Callback_Matches *m;
-   const void **custom_data;
-   Eina_Bool *flags;
    const Eina_Inarray *match;
    int r = 1;
 
@@ -1420,22 +1418,18 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
    _edje_freeze(ed);
    _edje_block(ed);
 
+   ed->walking_callbacks++;
+
    ssp = _edje_signal_callback_patterns_ref(ed->callbacks);
 
    m = (Edje_Signal_Callback_Matches*) ed->callbacks->matches;
    EINA_REFCOUNT_REF(m);
 
    callback_extra_data = (data) ? data->data : NULL;
-   custom_data = alloca(sizeof (void*) * m->matches_count);
-   memcpy(custom_data, ed->callbacks->custom_data, sizeof (void*) * m->matches_count);
-   flags = alloca(sizeof (Eina_Bool) * m->matches_count);
-   memcpy(flags, ed->callbacks->flags, sizeof (Eina_Bool) * (m->matches_count >> 1));
 
    if (eina_inarray_count(&ssp->u.callbacks.globing))
      r = edje_match_callback_exec(ssp,
                                  m->matches,
-                                 custom_data,
-                                 flags,
                                   sig,
                                   src,
                                   ed,
@@ -1453,11 +1447,13 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
 
         EINA_INARRAY_FOREACH(match, i)
           {
-             cb = &m->matches[*i];
+            if (_edje_signal_callback_run(ed->callbacks->flags, *i)) continue;
+             if ((prop) && (_edje_signal_callback_prop(ed->callbacks->flags,
+                                                      *i))) continue;
 
-             if ((prop) && (_edje_signal_callback_prop(flags, *i))) continue;
+             cb = &m->matches[*i];
 
-             cb->func((void*) custom_data[*i], ed->obj, sig, src);
+             cb->func((void*) ed->callbacks->custom_data[*i], ed->obj, sig, src);
              if (_edje_block_break(ed))
                break;
           }
@@ -1468,6 +1464,12 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da
 
    _edje_signal_callback_patterns_unref(ssp);
 
+   ed->walking_callbacks--;
+
+   if (ed->walking_callbacks == 0)
+     _edje_signal_callback_reset(ed->callbacks->flags,
+                                ed->callbacks->matches->matches_count);
+
    _edje_unblock(ed);
    _edje_thaw(ed);
    _edje_unref(ed);
index 3dfdae1..64c9e4a 100644 (file)
@@ -475,3 +475,27 @@ _edje_signal_callback_patterns_unref(const Edje_Signals_Sources_Patterns *essp)
       free(ssp);
    }
 }
+
+Eina_Bool
+_edje_signal_callback_run(const Eina_Bool *flags, unsigned int i)
+{
+   Eina_Bool r;
+  
+   r = flags[i >> 1] & ((_DELETE_ME) << ((i & 0x1) * 4));
+
+   return r;
+}
+
+void
+_edje_signal_callback_reset(Eina_Bool *flags, unsigned int length)
+{
+   Eina_Bool mask;
+   unsigned int i;
+
+   mask = ~((_JUST_ADDED << 4) | _JUST_ADDED);
+
+   length >>= 1;
+   for (i = 0; i < length; ++i)
+     flags[i] &= mask;
+}
+