On Thu, Apr 24, 2014 at 9:18 PM, Diego Novillo <dnovi...@google.com> wrote:
> Please remember to send patches to gcc-patches.
>
> I'm wondering if you couldn't just use std::string here.  No need to change
> one complicated allocation scheme with another.
Since we were using c-styled strings throughout genmatch, I thought of
using obstack instead of std::string.
This patch uses std::string in parse_c_expr to build c-code string.
Should we also change AST (operand and subclasses) to use std::string
instead of c-styled strings ?

Thanks and Regards,
Prathamesh
>
>
> Diego.
>
>
> On Thu, Apr 24, 2014 at 8:15 AM, Prathamesh Kulkarni
> <bilbotheelffri...@gmail.com> wrote:
>>
>> Hi,
>>    There was a comment in parse_c_expr, mentioning to use obstack to
>> build c-code string. I have attached patch for the same.
>> OK to commit ?
>>
>> * genmatch.c (parse_c_expr): Use obstack to build c code string.
>>
>> Thanks and Regards,
>> Prathamesh
>
>
Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c	(revision 209470)
+++ gcc/genmatch.c	(working copy)
@@ -29,7 +29,7 @@ along with GCC; see the file COPYING3.
 #include "hashtab.h"
 #include "hash-table.h"
 #include "vec.h"
-
+#include <string>
 
 /* Grammar
 
@@ -689,15 +689,17 @@ parse_c_expr (cpp_reader *r, cpp_ttype s
   cpp_ttype end;
   unsigned opencnt;
   char *code;
+  std::string cstr;
+
   eat_token (r, start);
   if (start == CPP_OPEN_PAREN)
     {
-      code = xstrdup ("(");
+      cstr += "("; 
       end = CPP_CLOSE_PAREN;
     }
   else if (start == CPP_OPEN_BRACE)
     {
-      code = xstrdup ("({");
+      cstr += "({";
       end = CPP_CLOSE_BRACE;
     }
   else
@@ -714,13 +716,9 @@ parse_c_expr (cpp_reader *r, cpp_ttype s
 	  if (n->type == CPP_NUMBER
 	      && !(n->flags & PREV_WHITE))
 	    {
-	      code = (char *)xrealloc (code, strlen (code)
-				       + strlen ("captures[") + 4);
 	      if (token->flags & PREV_WHITE)
-		strcat (code, " ");
-	      strcat (code, "captures[");
-	      strcat (code, get_number (r));
-	      strcat (code, "]");
+		cstr += " ";	
+	      cstr.append ("captures[").append (get_number (r)).append ("]");
 	      continue;
 	    }
 	}
@@ -734,24 +732,19 @@ parse_c_expr (cpp_reader *r, cpp_ttype s
 
       /* Output the token as string.  */
       char *tk = (char *)cpp_token_as_text (r, token);
-      code = (char *)xrealloc (code, strlen (code) + strlen (tk) + 2);
       if (token->flags & PREV_WHITE)
-	strcat (code, " ");
-      strcat (code, tk);
+	cstr += " ";	
+      cstr += tk;
     }
   while (1);
   if (end == CPP_CLOSE_PAREN)
-    {
-      code = (char *)xrealloc (code, strlen (code) + 1 + 1);
-      strcat (code, ")");
-    }
+    cstr += ")";
   else if (end == CPP_CLOSE_BRACE)
-    {
-      code = (char *)xrealloc (code, strlen (code) + 1 + 2);
-      strcat (code, "})");
-    }
+    cstr += "})"; 
   else
     gcc_unreachable ();
+
+  code = (char *) xstrdup (cstr.c_str ());
   return new c_expr (code);
 }
 

Reply via email to