q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=3dc9d282795e1269d9b3b8b16f8bb86e75dbb970

commit 3dc9d282795e1269d9b3b8b16f8bb86e75dbb970
Author: Daniel Kolesa <d.kol...@osg.samsung.com>
Date:   Mon Jan 2 15:28:26 2017 +0100

    eolian: fill ctor class early on
---
 src/lib/eolian/database_constructor_api.c |  3 +--
 src/lib/eolian/database_fill.c            | 35 +++++++++++++++++++++++++++++++
 src/lib/eolian/database_implement_api.c   |  3 +--
 src/lib/eolian/eolian_database.c          | 13 ------------
 src/lib/eolian/eolian_database.h          |  1 -
 5 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/src/lib/eolian/database_constructor_api.c 
b/src/lib/eolian/database_constructor_api.c
index 6eedefd..90b1d47 100644
--- a/src/lib/eolian/database_constructor_api.c
+++ b/src/lib/eolian/database_constructor_api.c
@@ -16,8 +16,7 @@ EAPI const Eolian_Class *
 eolian_constructor_class_get(const Eolian_Constructor *ctor)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(ctor, NULL);
-   Eolian_Constructor *mctor = (Eolian_Constructor *)ctor;
-   return database_object_class_fill(ctor->full_name, &mctor->klass);
+   return ctor->klass;
 }
 
 EAPI const Eolian_Function *
diff --git a/src/lib/eolian/database_fill.c b/src/lib/eolian/database_fill.c
index 743419d..d380cc7 100644
--- a/src/lib/eolian/database_fill.c
+++ b/src/lib/eolian/database_fill.c
@@ -204,11 +204,46 @@ _db_fill_implements(Eolian_Class *cl)
 }
 
 static Eina_Bool
+_db_fill_ctors(Eolian_Class *cl)
+{
+   Eolian_Constructor *ctor;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(cl->constructors, l, ctor)
+     {
+        const char *ldot = strrchr(ctor->full_name, '.');
+        if (!ldot)
+          return EINA_FALSE;
+        char *cnbuf = alloca(ldot - ctor->full_name + 1);
+        memcpy(cnbuf, ctor->full_name, ldot - ctor->full_name);
+        cnbuf[ldot - ctor->full_name] = '\0';
+        const Eolian_Class *tcl = NULL;
+        /* referencing self */
+        if (!strcmp(cnbuf, cl->full_name))
+          tcl = cl;
+        else
+          tcl = eolian_class_get_by_name(cnbuf);
+        if (!tcl)
+          {
+             fprintf(stderr, "eolian:%s:%d:%d: class not found for ctor 
'%s'\n",
+                ctor->base.file, ctor->base.line, ctor->base.column, 
ctor->full_name);
+             return EINA_FALSE;
+          }
+        ctor->klass = tcl;
+     }
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
 _db_fill_class(Eolian_Class *cl)
 {
    if (!_db_fill_implements(cl))
      return EINA_FALSE;
 
+   if (!_db_fill_ctors(cl))
+     return EINA_FALSE;
+
    eina_hash_set(_classes, cl->full_name, cl);
    eina_hash_set(_classesf, cl->base.file, cl);
 
diff --git a/src/lib/eolian/database_implement_api.c 
b/src/lib/eolian/database_implement_api.c
index dfaa686..9ab6a83 100644
--- a/src/lib/eolian/database_implement_api.c
+++ b/src/lib/eolian/database_implement_api.c
@@ -16,8 +16,7 @@ EAPI const Eolian_Class *
 eolian_implement_class_get(const Eolian_Implement *impl)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(impl, NULL);
-   Eolian_Implement *mimpl = (Eolian_Implement *)impl;
-   return database_object_class_fill(impl->full_name, &mimpl->klass);
+   return impl->klass;
 }
 
 EAPI const Eolian_Function *
diff --git a/src/lib/eolian/eolian_database.c b/src/lib/eolian/eolian_database.c
index 2298b80..6cf71c5 100644
--- a/src/lib/eolian/eolian_database.c
+++ b/src/lib/eolian/eolian_database.c
@@ -655,19 +655,6 @@ database_class_to_filename(const char *cname)
    return ret;
 }
 
-const Eolian_Class *
-database_object_class_fill(const char *class_name, const Eolian_Class **cl)
-{
-   if (*cl) return *cl;
-   char *name = strdup(class_name);
-   char *ldot = strrchr(name + 1, '.');
-   if (ldot) *ldot = '\0';
-   const Eolian_Class *found = eolian_class_get_by_name(name);
-   *cl = found;
-   free(name);
-   return found;
-}
-
 static Eina_Bool
 _eolian_file_parse_nodep(const char *filepath)
 {
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 479b357..783558e 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -288,7 +288,6 @@ int database_shutdown(void);
 
 char *database_class_to_filename(const char *cname);
 Eina_Bool database_validate();
-const Eolian_Class *database_object_class_fill(const char *class_name, const 
Eolian_Class **cl);
 
 void database_decl_add(Eina_Stringshare *name, Eolian_Declaration_Type type,
                        Eina_Stringshare *file, void *ptr);

-- 


Reply via email to