[Python-checkins] cpython: Update for PEP 393.

martin.v.loewis python-checkins at python.org
Wed Sep 28 08:36:00 CEST 2011


http://hg.python.org/cpython/rev/69a6c56e8989
changeset:   72476:69a6c56e8989
user:        Martin v. Löwis <martin at v.loewis.de>
date:        Wed Sep 28 08:35:25 2011 +0200
summary:
  Update for PEP 393.

files:
  Tools/gdb/libpython.py |  37 ++++++++++++++++++++---------
  1 files changed, 25 insertions(+), 12 deletions(-)


diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py
--- a/Tools/gdb/libpython.py
+++ b/Tools/gdb/libpython.py
@@ -50,6 +50,8 @@
 _type_unsigned_char_ptr = gdb.lookup_type('unsigned char').pointer() # unsigned char*
 _type_void_ptr = gdb.lookup_type('void').pointer() # void*
 _type_size_t = gdb.lookup_type('size_t')
+_type_unsigned_short_ptr = gdb.lookup_type('unsigned short').pointer()
+_type_unsigned_int_ptr = gdb.lookup_type('unsigned int').pointer()
 
 _is_pep393 = 'data' in [f.name for f in gdb.lookup_type('PyUnicodeObject').target().fields()]
 
@@ -1124,25 +1126,36 @@
         # From unicodeobject.h:
         #     Py_ssize_t length;  /* Length of raw Unicode data in buffer */
         #     Py_UNICODE *str;    /* Raw Unicode buffer */
-        field_length = long(self.field('length'))
         if _is_pep393:
             # Python 3.3 and newer
             may_have_surrogates = False
-            field_state = long(self.field('state'))
-            repr_kind = (field_state & 0xC) >> 2
-            if repr_kind == 0:
+            compact = self.field('_base')
+            ascii = compact['_base']
+            state = ascii['state']
+            field_length = long(ascii['length'])
+            if not int(state['ready']):
                 # string is not ready
                 may_have_surrogates = True
-                field_str = self.field('wstr')
-                field_length = self.field('wstr_length')
-            elif repr_kind == 1:
-                field_str = self.field('data')['latin1']
-            elif repr_kind == 2:
-                field_str = self.field('data')['ucs2']
-            elif repr_kind == 3:
-                field_str = self.field('data')['ucs4']
+                field_str = ascii['wstr']
+                if not int(state['ascii']):
+                    field_length = compact('wstr_length')
+            else:
+                if int(state['ascii']):
+                    field_str = ascii.address + 1
+                elif int(state['compact']):
+                    field_str = compact.address + 1
+                else:
+                    field_str = self.field('data')['any']
+                repr_kind = int(state['kind'])
+                if repr_kind == 1:
+                    field_str = field_str.cast(_type_unsigned_char_ptr)
+                elif repr_kind == 2:
+                    field_str = field_str.cast(_type_unsigned_short_ptr)
+                elif repr_kind == 3:
+                    field_str = field_str.cast(_type_unsigned_int_ptr)
         else:
             # Python 3.2 and earlier
+            field_length = long(self.field('length'))
             field_str = self.field('str')
             may_have_surrogates = self.char_width() == 2
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list