bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: CRT in generated parser


From: Akim Demaille
Subject: Re: CRT in generated parser
Date: Sun, 30 Aug 2020 09:48:41 +0200

Hi Kovalex,

> Le 22 août 2020 à 17:55, kovalex.pro@gmail.com a écrit :
> 
> Hi folks, I'm working on a tool that uses flex/bison and runs in rather
> scarce environment thus needs C runtime substitution.
> 
> Tool employs reentrant scanner/parser. As far as I can see bison 3.0.4
> (default on Ubuntu 18.04) and latest git version both
> generates yypstate_new/yypstate_delete using straightforward calls to
> malloc() and free(). Is it possible to override this?
> 
> I see YYMALLOC/YYFREE used in other parts of generated parser's code,
> perhaps, they could be used in yypstate* routines as well?

You are right, it should have been this way from the start...

Thanks for reporting.  I'm installing the patch below.


> Is there any best known method for substituting runtime in generated parser
> code? (besides, SED-like search-replace).

Besides updating to a future version of Bison?  I'm afraid not.

Cheers!


commit 629902bc603d4bd07bb5c45c7ed638f4fbf3b91f
Author: Akim Demaille <akim.demaille@gmail.com>
Date:   Sun Aug 30 09:45:34 2020 +0200

    c: always use YYMALLOC/YYFREE
    
    Reported by Kovalex <kovalex.pro@gmail.com>.
    https://lists.gnu.org/r/bug-bison/2020-08/msg00015.html
    
    * data/skeletons/yacc.c: Don't make direct calls to malloc/free.

diff --git a/NEWS b/NEWS
index 68bbbb81..a5c59f0d 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,9 @@ GNU Bison NEWS
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Bug fixes
+
+  Push parsers use YYMALLOC/YYFREE instead of direct calls to malloc/free.
 
 * Noteworthy changes in release 3.7.1 (2020-08-02) [stable]
 
diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c
index 9ec153ac..c695a039 100644
--- a/data/skeletons/yacc.c
+++ b/data/skeletons/yacc.c
@@ -1486,7 +1486,7 @@ yypstate_new (void)
   yypstate *yyps;]b4_pure_if([], [[
   if (yypstate_allocated)
     return YY_NULLPTR;]])[
-  yyps = YY_CAST (yypstate *, malloc (sizeof *yyps));
+  yyps = YY_CAST (yypstate *, YYMALLOC (sizeof *yyps));
   if (!yyps)
     return YY_NULLPTR;]b4_pure_if([], [[
   yypstate_allocated = 1;]])[
@@ -1515,7 +1515,7 @@ yypstate_delete (yypstate *yyps)
 #endif]b4_lac_if([[
       if (yyes != yyesa)
         YYSTACK_FREE (yyes);]])[
-      free (yyps);]b4_pure_if([], [[
+      YYFREE (yyps);]b4_pure_if([], [[
       yypstate_allocated = 0;]])[
     }
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]