Use raw strings on gdb.python/py-xmethods.exp (and fix Python 3.8's "SyntaxWarning: invalid escape sequence")

Message ID 20190825162136.22727-1-sergiodj@redhat.com
State New, archived
Headers

Commit Message

Sergio Durigan Junior Aug. 25, 2019, 4:21 p.m. UTC
  The way unrecognized escape sequences are handled has changed in
Python 3.8: users now see a SyntaxWarning message, which will
eventually become a SyntaxError in future versions of Python:

  (gdb) source /blabla/gdb.python/py-xmethods/py-xmethods.py
  /blabla/gdb.python/py-xmethods/py-xmethods.py:204: SyntaxWarning: invalid escape seque
  nce \+
    'operator\+',
  /blabla/gdb.python/py-xmethods/py-xmethods.py:211: SyntaxWarning: invalid escape seque
  nce \+
    'operator\+\+',

One of our testcases, gdb.python/py-xmethods.exp, contains strings in
the form of "operator\+".  This is not recognized by Python, but is
still needed by the testsuite to work properly.  The solution is
simple: we just have to make sure these strings are marked as
raw (i.e, r"").  This is what this patch does.  I took the opportunity
to also convert other strings to raw, which, in two cases, allowed the
removal of an extra backslash.

I tested this using Python 3.7 and Python 3.8, and everything works
fine.

I think I could push this as obvious, but decided to send it to
gdb-patches just in case.

gdb/testsuite/ChangeLog:
2019-08-25  Sergio Durigan Junior  <sergiodj@redhat.com>

	* gdb.python/py-xmethods.exp: Use raw strings when passing
	arguments to SimpleXMethodMatcher.
---
 gdb/testsuite/gdb.python/py-xmethods.py | 36 ++++++++++++-------------
 1 file changed, 18 insertions(+), 18 deletions(-)
  

Comments

Simon Marchi Aug. 25, 2019, 10:44 p.m. UTC | #1
On 2019-08-25 12:21 p.m., Sergio Durigan Junior wrote:
> The way unrecognized escape sequences are handled has changed in
> Python 3.8: users now see a SyntaxWarning message, which will
> eventually become a SyntaxError in future versions of Python:
> 
>   (gdb) source /blabla/gdb.python/py-xmethods/py-xmethods.py
>   /blabla/gdb.python/py-xmethods/py-xmethods.py:204: SyntaxWarning: invalid escape seque
>   nce \+
>     'operator\+',
>   /blabla/gdb.python/py-xmethods/py-xmethods.py:211: SyntaxWarning: invalid escape seque
>   nce \+
>     'operator\+\+',
> 
> One of our testcases, gdb.python/py-xmethods.exp, contains strings in
> the form of "operator\+".  This is not recognized by Python, but is
> still needed by the testsuite to work properly.  The solution is
> simple: we just have to make sure these strings are marked as
> raw (i.e, r"").  This is what this patch does.  I took the opportunity
> to also convert other strings to raw, which, in two cases, allowed the
> removal of an extra backslash.
> 
> I tested this using Python 3.7 and Python 3.8, and everything works
> fine.
> 
> I think I could push this as obvious, but decided to send it to
> gdb-patches just in case.

Just to understand correctly, could you have also changed

  'operator\+'

to

  'operator\\+'

?

In any case, I think using raw strings is a good solution, it requires less escaping, so your patch LGTM.

Simon
  
Sergio Durigan Junior Aug. 26, 2019, 1:19 p.m. UTC | #2
On Sunday, August 25 2019, Simon Marchi wrote:

> On 2019-08-25 12:21 p.m., Sergio Durigan Junior wrote:
>> The way unrecognized escape sequences are handled has changed in
>> Python 3.8: users now see a SyntaxWarning message, which will
>> eventually become a SyntaxError in future versions of Python:
>> 
>>   (gdb) source /blabla/gdb.python/py-xmethods/py-xmethods.py
>>   /blabla/gdb.python/py-xmethods/py-xmethods.py:204: SyntaxWarning: invalid escape seque
>>   nce \+
>>     'operator\+',
>>   /blabla/gdb.python/py-xmethods/py-xmethods.py:211: SyntaxWarning: invalid escape seque
>>   nce \+
>>     'operator\+\+',
>> 
>> One of our testcases, gdb.python/py-xmethods.exp, contains strings in
>> the form of "operator\+".  This is not recognized by Python, but is
>> still needed by the testsuite to work properly.  The solution is
>> simple: we just have to make sure these strings are marked as
>> raw (i.e, r"").  This is what this patch does.  I took the opportunity
>> to also convert other strings to raw, which, in two cases, allowed the
>> removal of an extra backslash.
>> 
>> I tested this using Python 3.7 and Python 3.8, and everything works
>> fine.
>> 
>> I think I could push this as obvious, but decided to send it to
>> gdb-patches just in case.
>
> Just to understand correctly, could you have also changed
>
>   'operator\+'
>
> to
>
>   'operator\\+'
>
> ?

Yeah, that works as well.  I thought it made more sense to use raw
strings because that's what the documentation seems to recommend, and
also what other projects started using.

> In any case, I think using raw strings is a good solution, it requires less escaping, so your patch LGTM.

Thanks, pushed: d9c4ba536c522b8dc2194d4100270a159be7894a
  

Patch

diff --git a/gdb/testsuite/gdb.python/py-xmethods.py b/gdb/testsuite/gdb.python/py-xmethods.py
index 587842d736..cea48b80d8 100644
--- a/gdb/testsuite/gdb.python/py-xmethods.py
+++ b/gdb/testsuite/gdb.python/py-xmethods.py
@@ -199,34 +199,34 @@  class G_methods_matcher(XMethodMatcher):
 
 
 global_dm_list = [
-    SimpleXMethodMatcher('A_plus_A',
-                         '^dop::A$',
-                         'operator\+',
+    SimpleXMethodMatcher(r'A_plus_A',
+                         r'^dop::A$',
+                         r'operator\+',
                          A_plus_A,
                          # This is a replacement, hence match the arg type
                          # exactly!
                          type_A.const().reference()),
-    SimpleXMethodMatcher('plus_plus_A',
-                         '^dop::A$',
-                         'operator\+\+',
+    SimpleXMethodMatcher(r'plus_plus_A',
+                         r'^dop::A$',
+                         r'operator\+\+',
                          plus_plus_A),
-    SimpleXMethodMatcher('A_geta',
-                         '^dop::A$',
-                         '^geta$',
+    SimpleXMethodMatcher(r'A_geta',
+                         r'^dop::A$',
+                         r'^geta$',
                          A_geta),
-    SimpleXMethodMatcher('A_getarrayind',
-                         '^dop::A$',
-                         '^getarrayind$',
+    SimpleXMethodMatcher(r'A_getarrayind',
+                         r'^dop::A$',
+                         r'^getarrayind$',
                          A_getarrayind,
                          type_int),
-    SimpleXMethodMatcher('A_indexoper',
-                         '^dop::A$',
-                         'operator\\[\\]',
+    SimpleXMethodMatcher(r'A_indexoper',
+                         r'^dop::A$',
+                         r'operator\[\]',
                          A_indexoper,
                          type_int),
-    SimpleXMethodMatcher('B_indexoper',
-                         '^dop::B$',
-                         'operator\\[\\]',
+    SimpleXMethodMatcher(r'B_indexoper',
+                         r'^dop::B$',
+                         r'operator\[\]',
                          B_indexoper,
                          type_int)
 ]