diff options
Diffstat (limited to 'src/lib/eolian/eolian_database.h')
-rw-r--r-- | src/lib/eolian/eolian_database.h | 188 |
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); |