summaryrefslogtreecommitdiff
path: root/src/lib/eolian/eolian_database.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/eolian/eolian_database.h')
-rw-r--r--src/lib/eolian/eolian_database.h188
1 files changed, 131 insertions, 57 deletions
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index f68093df3b..dfbad0c304 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -1,6 +1,8 @@
#ifndef __EOLIAN_DATABASE_H
#define __EOLIAN_DATABASE_H
+#include <setjmp.h>
+
#include <Eolian.h>
extern int _eolian_log_dom;
@@ -33,7 +35,8 @@ extern Eina_Prefix *_eolian_prefix;
struct _Eolian_Unit
{
- Eolian *state;
+ const char *file;
+ Eolian_State *state;
Eina_Hash *children;
Eina_Hash *classes;
Eina_Hash *globals;
@@ -41,20 +44,13 @@ struct _Eolian_Unit
Eina_Hash *aliases;
Eina_Hash *structs;
Eina_Hash *enums;
- Eina_Hash *decls;
+ Eina_Hash *objects;
};
-struct _Eolian
+typedef struct _Eolian_State_Area
{
Eolian_Unit unit;
- Eina_Hash *filenames_eo; /* filename to full path mapping */
- Eina_Hash *filenames_eot;
-
- Eina_Hash *parsing;
- Eina_Hash *parsed;
- Eina_Hash *defer;
-
Eina_Hash *units;
Eina_Hash *classes_f;
@@ -63,17 +59,38 @@ struct _Eolian
Eina_Hash *enums_f;
Eina_Hash *globals_f;
Eina_Hash *constants_f;
- Eina_Hash *decls_f;
+ Eina_Hash *objects_f;
+} Eolian_State_Area;
+
+struct _Eolian_State
+{
+ Eolian_State_Area main;
+ Eolian_State_Area staging;
+
+ Eolian_Panic_Cb panic;
+ Eina_Stringshare *panic_msg;
+ jmp_buf jmp_env;
+
+ Eolian_Error_Cb error;
+ void *error_data;
+
+ Eina_Hash *filenames_eo; /* filename to full path mapping */
+ Eina_Hash *filenames_eot;
+
+ Eina_Hash *defer;
};
-typedef struct _Eolian_Object
+struct _Eolian_Object
{
- const char *file;
+ Eolian_Unit *unit;
+ Eina_Stringshare *file;
+ Eina_Stringshare *name;
int line;
int column;
int refcount;
+ Eolian_Object_Type type;
Eina_Bool validated;
-} Eolian_Object;
+};
static inline void
eolian_object_ref(Eolian_Object *obj)
@@ -87,27 +104,76 @@ eolian_object_unref(Eolian_Object *obj)
return (--obj->refcount > 0);
}
+static inline void
+eolian_object_add(Eolian_Object *obj, Eina_Stringshare *name, Eina_Hash *hash)
+{
+ eina_hash_add(hash, name, obj);
+ eolian_object_ref(obj);
+}
+
+#define EOLIAN_OBJECT_ADD(tunit, name, obj, memb) \
+{ \
+ eolian_object_add(&obj->base, name, tunit->state->staging.unit.memb); \
+ eolian_object_add(&obj->base, name, tunit->memb); \
+}
+
+static inline void eolian_state_vlog(const Eolian_State *state, const Eolian_Object *obj, const char *fmt, va_list args) EINA_ARG_NONNULL(1, 3);
+static inline void eolian_state_log(const Eolian_State *state, const char *fmt, ...) EINA_ARG_NONNULL(1, 2) EINA_PRINTF(2, 3);
+static inline void eolian_state_log_obj(const Eolian_State *state, const Eolian_Object *obj, const char *fmt, ...) EINA_ARG_NONNULL(1, 2, 3) EINA_PRINTF(3, 4);
+
+static inline void eolian_state_panic(Eolian_State *state, const char *fmt, ...) EINA_ARG_NONNULL(1, 2) EINA_PRINTF(2, 3);
+
+static inline void
+eolian_state_vlog(const Eolian_State *state, const Eolian_Object *obj,
+ const char *fmt, va_list args)
+{
+ Eina_Strbuf *sb = eina_strbuf_new();
+ eina_strbuf_append_vprintf(sb, fmt, args);
+ state->error(obj, eina_strbuf_string_get(sb), state->error_data);
+ eina_strbuf_free(sb);
+}
+
+static inline void
+eolian_state_log(const Eolian_State *state, const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ eolian_state_vlog(state, NULL, fmt, args);
+ va_end(args);
+}
+
+static inline void
+eolian_state_log_obj(const Eolian_State *state, const Eolian_Object *obj,
+ const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ eolian_state_vlog(state, obj, fmt, args);
+ va_end(args);
+}
+
+static inline void
+eolian_state_panic(Eolian_State *state, const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ state->panic_msg = eina_stringshare_vprintf(fmt, args);
+ va_end(args);
+ longjmp(state->jmp_env, 1);
+}
+
struct _Eolian_Documentation
{
Eolian_Object base;
Eina_Stringshare *summary;
Eina_Stringshare *description;
Eina_Stringshare *since;
-};
-
-struct _Eolian_Declaration
-{
- Eolian_Declaration_Type type;
- Eina_Stringshare *name;
- void *data;
+ Eina_List *ref_dbg;
};
struct _Eolian_Class
{
Eolian_Object base;
- Eina_Stringshare *full_name;
- Eina_List *namespaces; /* List Eina_Stringshare * */
- Eina_Stringshare *name;
Eolian_Class_Type type;
Eolian_Documentation *doc;
Eina_Stringshare *legacy_prefix;
@@ -129,7 +195,6 @@ struct _Eolian_Function
{
Eolian_Object base;
Eolian_Object set_base;
- Eina_Stringshare *name;
union { /* lists of Eolian_Function_Parameter */
Eina_List *params;
struct {
@@ -167,15 +232,18 @@ struct _Eolian_Function
struct _Eolian_Part
{
Eolian_Object base;
- Eina_Stringshare *name;
- Eolian_Class *klass;
+ /* when not validated, class name is stored */
+ union
+ {
+ Eina_Stringshare *klass_name;
+ Eolian_Class *klass;
+ };
Eolian_Documentation *doc;
};
struct _Eolian_Function_Parameter
{
Eolian_Object base;
- Eina_Stringshare *name;
Eolian_Type *type;
Eolian_Expression *value;
Eolian_Documentation *doc;
@@ -192,10 +260,12 @@ struct _Eolian_Type
Eolian_Type_Builtin_Type btype;
Eolian_Type *base_type;
Eolian_Type *next_type;
- Eina_Stringshare *name;
- Eina_Stringshare *full_name;
- Eina_List *namespaces;
Eina_Stringshare *freefunc;
+ union
+ {
+ Eolian_Class *klass;
+ Eolian_Typedecl *tdecl;
+ };
Eina_Bool is_const :1;
Eina_Bool is_ptr :1;
Eina_Bool owned :1;
@@ -207,9 +277,6 @@ struct _Eolian_Typedecl
Eolian_Object base;
Eolian_Typedecl_Type type;
Eolian_Type *base_type;
- Eina_Stringshare *name;
- Eina_Stringshare *full_name;
- Eina_List *namespaces;
Eina_Hash *fields;
Eina_List *field_list;
Eolian_Function *function_pointer;
@@ -224,7 +291,6 @@ struct _Eolian_Implement
Eolian_Object base;
const Eolian_Class *klass;
const Eolian_Function *foo_id;
- Eina_Stringshare *full_name;
Eolian_Documentation *common_doc;
Eolian_Documentation *get_doc;
Eolian_Documentation *set_doc;
@@ -242,14 +308,12 @@ struct _Eolian_Constructor
{
Eolian_Object base;
const Eolian_Class *klass;
- Eina_Stringshare *full_name;
Eina_Bool is_optional: 1;
};
struct _Eolian_Event
{
Eolian_Object base;
- Eina_Stringshare *name;
Eolian_Documentation *doc;
Eolian_Type *type;
Eolian_Class *klass;
@@ -262,7 +326,6 @@ struct _Eolian_Event
struct _Eolian_Struct_Type_Field
{
Eolian_Object base;
- Eina_Stringshare *name;
Eolian_Type *type;
Eolian_Documentation *doc;
};
@@ -271,7 +334,6 @@ struct _Eolian_Enum_Type_Field
{
Eolian_Object base;
Eolian_Typedecl *base_enum;
- Eina_Stringshare *name;
Eolian_Expression *value;
Eolian_Documentation *doc;
Eina_Bool is_public_value :1;
@@ -291,10 +353,13 @@ struct _Eolian_Expression
};
struct
{
- Eolian_Unary_Operator unop;
+ union
+ {
+ Eolian_Unary_Operator unop;
+ Eolian_Value_Union value;
+ };
Eolian_Expression *expr;
};
- Eolian_Value_Union value;
};
Eina_Bool weak_lhs :1;
Eina_Bool weak_rhs :1;
@@ -304,9 +369,6 @@ struct _Eolian_Variable
{
Eolian_Object base;
Eolian_Variable_Type type;
- Eina_Stringshare *name;
- Eina_Stringshare *full_name;
- Eina_List *namespaces;
Eolian_Type *base_type;
Eolian_Expression *value;
Eolian_Documentation *doc;
@@ -314,40 +376,52 @@ struct _Eolian_Variable
};
char *database_class_to_filename(const char *cname);
-Eina_Bool database_validate(Eolian *state, const Eolian_Unit *src);
+Eina_Bool database_validate(const Eolian_Unit *src);
+Eina_Bool database_check(const Eolian_State *state);
+/* if isdep is EINA_TRUE, parse as a dependency of current unit */
+void database_defer(Eolian_State *state, const char *fname, Eina_Bool isdep);
-void database_decl_add(Eolian *state, Eina_Stringshare *name,
- Eolian_Declaration_Type type,
- Eina_Stringshare *file, void *ptr);
+void database_object_add(Eolian_Unit *unit, const Eolian_Object *obj);
void database_doc_del(Eolian_Documentation *doc);
-void database_unit_init(Eolian *state, Eolian_Unit *unit);
+void database_unit_init(Eolian_State *state, Eolian_Unit *unit, const char *file);
void database_unit_del(Eolian_Unit *unit);
+Eolian_Object_Type database_doc_token_ref_resolve(const Eolian_Doc_Token *tok,
+ const Eolian_Unit *unit1,
+ const Eolian_Unit *unit2,
+ const Eolian_Object **data1,
+ const Eolian_Object **data2);
+
/* types */
-void database_type_add(Eolian *state, Eolian_Typedecl *def);
-void database_struct_add(Eolian *state, Eolian_Typedecl *tp);
-void database_enum_add(Eolian *state, Eolian_Typedecl *tp);
+void database_type_add(Eolian_Unit *unit, Eolian_Typedecl *tp);
+void database_struct_add(Eolian_Unit *unit, Eolian_Typedecl *tp);
+void database_enum_add(Eolian_Unit *unit, Eolian_Typedecl *tp);
void database_type_del(Eolian_Type *tp);
void database_typedecl_del(Eolian_Typedecl *tp);
-void database_type_to_str(const Eolian_Unit *src, const Eolian_Type *tp, Eina_Strbuf *buf, const char *name, Eolian_C_Type_Type ctype);
-void database_typedecl_to_str(const Eolian_Unit *src, const Eolian_Typedecl *tp, Eina_Strbuf *buf);
+void database_type_to_str(const Eolian_Type *tp, Eina_Strbuf *buf, const char *name, Eolian_C_Type_Type ctype);
+void database_typedecl_to_str(const Eolian_Typedecl *tp, Eina_Strbuf *buf);
+
+Eolian_Typedecl *database_type_decl_find(const Eolian_Unit *src, const Eolian_Type *tp);
-Eina_Bool database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *tp);
+Eina_Bool database_type_is_ownable(const Eolian_Unit *unit, const Eolian_Type *tp, Eina_Bool allow_void);
/* expressions */
-Eolian_Value database_expr_eval(const Eolian_Unit *unit, const Eolian_Expression *expr, Eolian_Expression_Mask mask);
+typedef void (*Expr_Obj_Cb)(const Eolian_Object *obj, void *data);
+
+Eolian_Value database_expr_eval(const Eolian_Unit *unit, Eolian_Expression *expr, Eolian_Expression_Mask mask, Expr_Obj_Cb cb, void *data);
+Eolian_Value database_expr_eval_type(const Eolian_Unit *unit, Eolian_Expression *expr, const Eolian_Type *type, Expr_Obj_Cb cb, void *data);
void database_expr_del(Eolian_Expression *expr);
void database_expr_print(Eolian_Expression *expr);
/* variables */
void database_var_del(Eolian_Variable *var);
-void database_var_add(Eolian *state, Eolian_Variable *var);
+void database_var_add(Eolian_Unit *unit, Eolian_Variable *var);
/* classes */
void database_class_del(Eolian_Class *cl);