]> git.draconx.ca Git - cdecl99.git/blobdiff - src/parse.y
libcdecl: Don't dynamically allocate null declarators.
[cdecl99.git] / src / parse.y
index 8631f3b4613fd028b720865f4b85ed03237c3384..ba9bf220f95513df509afca3610ccd4f8adedf92 100644 (file)
@@ -105,6 +105,7 @@ static void free_declarator(struct cdecl_declarator *x)
 
                switch (x->type) {
                case CDECL_DECL_NULL:
+                       x = NULL;
                case CDECL_DECL_IDENT:
                case CDECL_DECL_ARRAY:
                        break;
@@ -168,11 +169,18 @@ static struct cdecl *insert_identifier(struct cdecl *decl, struct parse_item *id
 
        while ((d = *p)->child)
                p = &d->child;
-       free(d);
 
-       *p = d = &ident->u.declarator;
+       *p = &ident->u.declarator;
        return decl;
 }
+
+static struct cdecl_declarator *nulldecl(void)
+{
+       static const struct cdecl_declarator nulldecl = {0};
+       return (void *)&nulldecl;
+}
+#define NULLDECL (nulldecl())
+
 %}
 
 %destructor { free($$); }            <item>
@@ -431,16 +439,14 @@ declarator_ish: direct_declarator_ish | pointer
 postfix: array | parens
 
 direct_declarator_ish: {
-       ALLOC_STRUCT($$, struct cdecl_declarator,
-               .type = CDECL_DECL_NULL);
+       $$ = NULLDECL;
 } | direct_declarator_ish postfix {
        $$ = $2;
        $$->child = $1;
 }
 
 direct_declarator: {
-       ALLOC_STRUCT($$, struct cdecl_declarator,
-               .type = CDECL_DECL_NULL);
+       $$ = NULLDECL;
 } | T_IDENT {
        $$ = &$1->u.declarator;
 } | direct_declarator postfix {
@@ -491,8 +497,7 @@ english_declaration: storage_func_specs english_declarator post_specs {
 }
 
 english_declarator: {
-       ALLOC_STRUCT($$, struct cdecl_declarator,
-               .type = CDECL_DECL_NULL);
+       $$ = NULLDECL;
 } | english_declarator qualifiers T_POINTER T_TO {
        ALLOC_STRUCT($$, struct cdecl_declarator,
                .type = CDECL_DECL_POINTER,
@@ -535,8 +540,7 @@ typedef_name_qual: T_IDENT qualifiers {
 }
 
 null_decl: {
-       ALLOC_STRUCT($$, struct cdecl_declarator,
-               .type = CDECL_DECL_NULL);
+       $$ = NULLDECL;
 }
 
 /*