static void
_temps_free(Eo_Lexer_Temps *tmp)
{
- Eolian_Type *tp;
Eolian_Typedecl *tpd;
- if (tmp->kls)
- database_class_del(tmp->kls);
-
- if (tmp->var)
- database_var_del(tmp->var);
-
- EINA_LIST_FREE(tmp->type_defs, tp)
- database_type_del(tp);
-
EINA_LIST_FREE(tmp->type_decls, tpd)
database_typedecl_del(tpd);
}
typedef struct _Eo_Lexer_Temps
{
Eolian_Class *kls;
- Eolian_Variable *var;
- Eina_List *type_defs;
Eina_List *type_decls;
Eina_List *expr_defs;
} Eo_Lexer_Temps;
return (Eolian_Type *)eo_lexer_node_release(ls, (Eolian_Object *)tp);
}
+static inline Eolian_Typedecl *
+eo_lexer_typedecl_new(Eo_Lexer *ls)
+{
+ return (Eolian_Typedecl *)eo_lexer_node_new(ls, sizeof(Eolian_Typedecl));
+}
+
+static inline Eolian_Typedecl *
+eo_lexer_typedecl_release(Eo_Lexer *ls, Eolian_Typedecl *tp)
+{
+ return (Eolian_Typedecl *)eo_lexer_node_release(ls, (Eolian_Object *)tp);
+}
+
+static inline Eolian_Variable *
+eo_lexer_variable_new(Eo_Lexer *ls)
+{
+ return (Eolian_Variable *)eo_lexer_node_new(ls, sizeof(Eolian_Variable));
+}
+
+static inline Eolian_Variable *
+eo_lexer_variable_release(Eo_Lexer *ls, Eolian_Variable *var)
+{
+ return (Eolian_Variable *)eo_lexer_node_release(ls, (Eolian_Object *)var);
+}
+
+static inline Eolian_Expression *
+eo_lexer_expr_new(Eo_Lexer *ls)
+{
+ return (Eolian_Expression *)eo_lexer_node_new(ls, sizeof(Eolian_Expression));
+}
+
+static inline Eolian_Expression *
+eo_lexer_expr_release(Eo_Lexer *ls, Eolian_Expression *expr)
+{
+ return (Eolian_Expression *)eo_lexer_node_release(ls, (Eolian_Object *)expr);
+}
+
/* "stack" management, only to protect against errors (jumps) in parsing */
void eo_lexer_dtor_push(Eo_Lexer *ls, Eina_Free_Cb free_cb, void *data);
void eo_lexer_dtor_pop(Eo_Lexer *ls);
static Eolian_Variable *
parse_variable(Eo_Lexer *ls, Eina_Bool global)
{
- Eolian_Variable *def = calloc(1, sizeof(Eolian_Variable));
+ Eolian_Variable *def = eo_lexer_variable_new(ls);
Eina_Strbuf *buf;
- ls->tmp.var = def;
eo_lexer_get(ls);
if (ls->t.kw == KW_at_extern)
{
int line, col;
Eina_Strbuf *buf = eina_strbuf_new();
eo_lexer_dtor_push(ls, EINA_FREE_CB(eina_strbuf_free), buf);
- ls->klass = (ls->tmp.kls = calloc(1, sizeof(Eolian_Class)));
+ ls->klass = (Eolian_Class *)eo_lexer_node_new(ls, sizeof(Eolian_Class));
FILL_BASE(ls->klass->base, ls, ls->line_number, ls->column, CLASS);
eo_lexer_get(ls);
ls->klass->type = type;
case KW_const:
case KW_var:
{
- database_var_add(ls->unit, parse_variable(ls, ls->t.kw == KW_var));
- eolian_object_ref(&ls->tmp.var->base);
- ls->tmp.var = NULL;
+ Eolian_Variable *var = parse_variable(ls, ls->t.kw == KW_var);
+ database_var_add(ls->unit, eo_lexer_variable_release(ls, var));
+ eolian_object_ref(&var->base);
break;
}
case KW_struct:
_eolian_log("eolian: no class for file '%s'", filename);
goto error;
}
- ls->klass = ls->tmp.kls = NULL;
-
+ ls->klass = NULL;
EOLIAN_OBJECT_ADD(ls->unit, cl->base.name, cl, classes);
eina_hash_set(ls->state->classes_f, cl->base.file, cl);
+ eo_lexer_node_release(ls, &cl->base);
done:
ret = ls->unit;