Use strtok_r instead of strsep in rust_get_disr_info

Message ID CAFOnWk=a2g-XEtsFjXp85DhTSmT4fVNSkWLuAa0WoS9JY_XM=w@mail.gmail.com
State New, archived
Headers

Commit Message

Manish Goregaokar June 29, 2016, 10:31 a.m. UTC
  Fixed.

From 6b577bb78279a453c77b08c5a1090d8dec1eeee7 Mon Sep 17 00:00:00 2001
From: Manish Goregaokar <manish@mozilla.com>
Date: Wed, 29 Jun 2016 15:42:28 +0530
Subject: [PATCH] Use strtok_r instead of strsep in rust_get_disr_info

strsep doesn't exist on Windows.

2016-06-29  Manish Goregaokar  <manish@mozilla.com>

gdb/ChangeLog:
    * rust-lang.c (rust_get_disr_info): Use strtok_r instead of strsep.
---
 gdb/rust-lang.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

       LONGEST value;
@@ -145,7 +145,9 @@ rust_get_disr_info (struct type *type, const
gdb_byte *valaddr,
          traversed in order to find the field (which may be several
fields deep)
          and the variantname is the name of the variant of the case when the
          field is zero.  */
-      while ((token = strsep (&tail, "$")) != NULL)
+      for (token = strtok_r (tail, "$", &saveptr);
+           token != NULL;
+           token = strtok_r (NULL, "$", &saveptr))
         {
       if (sscanf (token, "%lu", &fieldno) != 1)
         {
@@ -161,8 +163,6 @@ rust_get_disr_info (struct type *type, const
gdb_byte *valaddr,
           member_type = TYPE_FIELD_TYPE (member_type, fieldno);
         }

-      if (token >= name + strlen (TYPE_FIELD_NAME (type, 0)))
-    error (_("Invalid form for %s"), RUST_ENUM_PREFIX);
       value = unpack_long (member_type, valaddr + embedded_offset);

       if (value == 0)
  

Comments

Pedro Alves June 29, 2016, 10:36 a.m. UTC | #1
On 06/29/2016 11:31 AM, Manish Goregaokar wrote:
> @@ -161,8 +163,6 @@ rust_get_disr_info (struct type *type, const
> gdb_byte *valaddr,
>            member_type = TYPE_FIELD_TYPE (member_type, fieldno);
>          }
> 
> -      if (token >= name + strlen (TYPE_FIELD_NAME (type, 0)))
> -    error (_("Invalid form for %s"), RUST_ENUM_PREFIX);
>        value = unpack_long (member_type, valaddr + embedded_offset);
> 
>        if (value == 0)

Why was this bit removed?

Thanks,
Pedro Alves
  
Manish Goregaokar June 29, 2016, 10:38 a.m. UTC | #2
strsep moves the pointer to the end of the string. We want to ensure
the early break happens, since we need token to contain the name of
the variant at this stage.

strtok doesn't do this. However, strtok does make it NULL, which we
don't want either. I added a check for it in my most recent email,
tests still pass.

Thanks,
-Manish


On Wed, Jun 29, 2016 at 4:06 PM, Pedro Alves <palves@redhat.com> wrote:
> On 06/29/2016 11:31 AM, Manish Goregaokar wrote:
>> @@ -161,8 +163,6 @@ rust_get_disr_info (struct type *type, const
>> gdb_byte *valaddr,
>>            member_type = TYPE_FIELD_TYPE (member_type, fieldno);
>>          }
>>
>> -      if (token >= name + strlen (TYPE_FIELD_NAME (type, 0)))
>> -    error (_("Invalid form for %s"), RUST_ENUM_PREFIX);
>>        value = unpack_long (member_type, valaddr + embedded_offset);
>>
>>        if (value == 0)
>
> Why was this bit removed?
>
> Thanks,
> Pedro Alves
>
  
Pedro Alves June 29, 2016, 10:44 a.m. UTC | #3
On 06/29/2016 11:38 AM, Manish Goregaokar wrote:
> strsep moves the pointer to the end of the string. We want to ensure
> the early break happens, since we need token to contain the name of
> the variant at this stage.
> 
> strtok doesn't do this. However, strtok does make it NULL, which we
> don't want either. I added a check for it in my most recent email,
> tests still pass.

Right, that one is OK.  Please push.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index 23ddd5a..5910d4b 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -121,7 +121,7 @@  rust_get_disr_info (struct type *type, const
gdb_byte *valaddr,
   if (strncmp (TYPE_FIELD_NAME (type, 0), RUST_ENUM_PREFIX,
            strlen (RUST_ENUM_PREFIX)) == 0)
     {
-      char *name, *tail, *token;
+      char *tail, *token, *name, *saveptr;
       unsigned long fieldno;
       struct type *member_type;