GDB: replace match statements with if statements in gdb debug script so it works with lower versions (#18226)

This commit is contained in:
Luis Carilla Ternero 2025-04-02 11:56:16 +02:00 committed by GitHub
parent a9d4b49252
commit 02d58faad4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 120 additions and 130 deletions

View file

@ -782,27 +782,26 @@ asm(
".ascii \" for bit in range(0, type_mask_size):\\n\"\n" ".ascii \" for bit in range(0, type_mask_size):\\n\"\n"
".ascii \" if type_mask & (1 << bit):\\n\"\n" ".ascii \" if type_mask & (1 << bit):\\n\"\n"
".ascii \" type_name = ZendTypeBits.zendTypeName(bit)\\n\"\n" ".ascii \" type_name = ZendTypeBits.zendTypeName(bit)\\n\"\n"
".ascii \" match type_name:\\n\"\n" ".ascii \" if type_name is None:\\n\"\n"
".ascii \" case None:\\n\"\n"
".ascii \" parts.append('(1<<%d)' % bit)\\n\"\n" ".ascii \" parts.append('(1<<%d)' % bit)\\n\"\n"
".ascii \" case 'list':\\n\"\n" ".ascii \" elif type_name == 'list':\\n\"\n"
".ascii \" list = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())\\n\"\n" ".ascii \" list_ptr = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())\\n\"\n"
".ascii \" num_types = int(list['num_types'])\\n\"\n" ".ascii \" num_types = int(list_ptr['num_types'])\\n\"\n"
".ascii \" types = list['types'].dereference().cast(gdb.lookup_type('zend_type').array(num_types))\\n\"\n" ".ascii \" types = list_ptr['types'].dereference().cast(gdb.lookup_type('zend_type').array(num_types))\\n\"\n"
".ascii \" for i in range(0, num_types):\\n\"\n" ".ascii \" for i in range(0, num_types):\\n\"\n"
".ascii \" str = self.format_type(types[i])\\n\"\n" ".ascii \" type_str = self.format_type(types[i])\\n\"\n"
".ascii \" if any((c in set('|&()')) for c in str):\\n\"\n" ".ascii \" if any((c in set('|&()')) for c in type_str):\\n\"\n"
".ascii \" str = '(%s)' % str\\n\"\n" ".ascii \" type_str = '(%s)' % type_str\\n\"\n"
".ascii \" parts.append(str)\\n\"\n" ".ascii \" parts.append(type_str)\\n\"\n"
".ascii \" case 'union' | 'arena':\\n\"\n" ".ascii \" elif type_name == 'union' or type_name == 'arena':\\n\"\n"
".ascii \" meta.append(type_name)\\n\"\n" ".ascii \" meta.append(type_name)\\n\"\n"
".ascii \" case 'intersection':\\n\"\n" ".ascii \" elif type_name == 'intersection':\\n\"\n"
".ascii \" meta.append(type_name)\\n\"\n" ".ascii \" meta.append(type_name)\\n\"\n"
".ascii \" separator = '&'\\n\"\n" ".ascii \" separator = '&'\\n\"\n"
".ascii \" case 'name':\\n\"\n" ".ascii \" elif type_name == 'name':\\n\"\n"
".ascii \" str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())\\n\"\n" ".ascii \" name_str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())\\n\"\n"
".ascii \" parts.append(format_zstr(str))\\n\"\n" ".ascii \" parts.append(format_zstr(name_str))\\n\"\n"
".ascii \" case _:\\n\"\n" ".ascii \" else:\\n\"\n"
".ascii \" parts.append(type_name)\\n\"\n" ".ascii \" parts.append(type_name)\\n\"\n"
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"
".ascii \" str = separator.join(parts)\\n\"\n" ".ascii \" str = separator.join(parts)\\n\"\n"
@ -1073,14 +1072,14 @@ asm(
".ascii \" self.val = val\\n\"\n" ".ascii \" self.val = val\\n\"\n"
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"
".ascii \" def to_string(self):\\n\"\n" ".ascii \" def to_string(self):\\n\"\n"
".ascii \" match int(self.val['type']):\\n\"\n" ".ascii \" val_type = int(self.val['type'])\\n\"\n"
".ascii \" case ZendFnTypes.ZEND_INTERNAL_FUNCTION:\\n\"\n" ".ascii \" if val_type == ZendFnTypes.ZEND_INTERNAL_FUNCTION:\\n\"\n"
".ascii \" typestr = 'internal'\\n\"\n" ".ascii \" typestr = 'internal'\\n\"\n"
".ascii \" case ZendFnTypes.ZEND_USER_FUNCTION:\\n\"\n" ".ascii \" elif val_type == ZendFnTypes.ZEND_USER_FUNCTION:\\n\"\n"
".ascii \" typestr = 'user'\\n\"\n" ".ascii \" typestr = 'user'\\n\"\n"
".ascii \" case ZendFnTypes.ZEND_EVAL_CODE:\\n\"\n" ".ascii \" elif val_type == ZendFnTypes.ZEND_EVAL_CODE:\\n\"\n"
".ascii \" typestr = 'eval'\\n\"\n" ".ascii \" typestr = 'eval'\\n\"\n"
".ascii \" case _:\\n\"\n" ".ascii \" else:\\n\"\n"
".ascii \" typestr = '\?\?\?'\\n\"\n" ".ascii \" typestr = '\?\?\?'\\n\"\n"
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"
".ascii \" if self.val['common']['function_name']:\\n\"\n" ".ascii \" if self.val['common']['function_name']:\\n\"\n"
@ -1501,12 +1500,11 @@ asm(
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"
".ascii \" bits = self._bits\\n\"\n" ".ascii \" bits = self._bits\\n\"\n"
".ascii \" type_bits = None\\n\"\n" ".ascii \" type_bits = None\\n\"\n"
".ascii \" match type_name:\\n\"\n" ".ascii \" if type_name == 'string':\\n\"\n"
".ascii \" case 'string':\\n\"\n"
".ascii \" type_bits = self._str_bits\\n\"\n" ".ascii \" type_bits = self._str_bits\\n\"\n"
".ascii \" case 'array':\\n\"\n" ".ascii \" elif type_name == 'array':\\n\"\n"
".ascii \" type_bits = self._array_bits\\n\"\n" ".ascii \" type_bits = self._array_bits\\n\"\n"
".ascii \" case 'object':\\n\"\n" ".ascii \" elif type_name == 'object':\\n\"\n"
".ascii \" type_bits = self._obj_bits\\n\"\n" ".ascii \" type_bits = self._obj_bits\\n\"\n"
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"
".ascii \" type_flags = flags & self._flags_mask\\n\"\n" ".ascii \" type_flags = flags & self._flags_mask\\n\"\n"
@ -1530,14 +1528,13 @@ asm(
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"
".ascii \" if (flags & (1<<self.bit('GC_NOT_COLLECTABLE'))) == 0:\\n\"\n" ".ascii \" if (flags & (1<<self.bit('GC_NOT_COLLECTABLE'))) == 0:\\n\"\n"
".ascii \" gc_color = (flags >> self._info_shift) & self._gc_color\\n\"\n" ".ascii \" gc_color = (flags >> self._info_shift) & self._gc_color\\n\"\n"
".ascii \" match gc_color:\\n\"\n" ".ascii \" if gc_color == self._gc_black:\\n\"\n"
".ascii \" case self._gc_black:\\n\"\n"
".ascii \" names.append('GC_BLACK')\\n\"\n" ".ascii \" names.append('GC_BLACK')\\n\"\n"
".ascii \" case self._gc_white:\\n\"\n" ".ascii \" elif gc_color == self._gc_white:\\n\"\n"
".ascii \" names.append('GC_WHITE')\\n\"\n" ".ascii \" names.append('GC_WHITE')\\n\"\n"
".ascii \" case self._gc_grey:\\n\"\n" ".ascii \" elif gc_color == self._gc_grey:\\n\"\n"
".ascii \" names.append('GC_GREY')\\n\"\n" ".ascii \" names.append('GC_GREY')\\n\"\n"
".ascii \" case self._gc_purple:\\n\"\n" ".ascii \" elif gc_color == self._gc_purple:\\n\"\n"
".ascii \" names.append('GC_PURPLE')\\n\"\n" ".ascii \" names.append('GC_PURPLE')\\n\"\n"
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"
".ascii \" gc_address = (flags >> self._info_shift) & self._gc_address\\n\"\n" ".ascii \" gc_address = (flags >> self._info_shift) & self._gc_address\\n\"\n"
@ -1577,16 +1574,15 @@ asm(
".ascii \" pattern = re.compile(r'#define (GC_[^\\\\s]+)\\\\s+((0x)\?[0-9a-f]+)')\\n\"\n" ".ascii \" pattern = re.compile(r'#define (GC_[^\\\\s]+)\\\\s+((0x)\?[0-9a-f]+)')\\n\"\n"
".ascii \" matches = pattern.findall(content)\\n\"\n" ".ascii \" matches = pattern.findall(content)\\n\"\n"
".ascii \" for name, bit, _ in matches:\\n\"\n" ".ascii \" for name, bit, _ in matches:\\n\"\n"
".ascii \" match name:\\n\"\n" ".ascii \" if name == 'GC_TYPE_MASK':\\n\"\n"
".ascii \" case 'GC_TYPE_MASK':\\n\"\n"
".ascii \" self._type_mask = int(bit, 0)\\n\"\n" ".ascii \" self._type_mask = int(bit, 0)\\n\"\n"
".ascii \" case 'GC_FLAGS_MASK':\\n\"\n" ".ascii \" elif name == 'GC_FLAGS_MASK':\\n\"\n"
".ascii \" self._flags_mask = int(bit, 0)\\n\"\n" ".ascii \" self._flags_mask = int(bit, 0)\\n\"\n"
".ascii \" case 'GC_INFO_MASK':\\n\"\n" ".ascii \" elif name == 'GC_INFO_MASK':\\n\"\n"
".ascii \" self._info_mask = int(bit, 0)\\n\"\n" ".ascii \" self._info_mask = int(bit, 0)\\n\"\n"
".ascii \" case 'GC_INFO_SHIFT':\\n\"\n" ".ascii \" elif name == 'GC_INFO_SHIFT':\\n\"\n"
".ascii \" self._info_shift = int(bit, 0)\\n\"\n" ".ascii \" self._info_shift = int(bit, 0)\\n\"\n"
".ascii \" case 'GC_FLAGS_SHIFT':\\n\"\n" ".ascii \" elif name == 'GC_FLAGS_SHIFT':\\n\"\n"
".ascii \" self._flags_shift = int(bit, 0)\\n\"\n" ".ascii \" self._flags_shift = int(bit, 0)\\n\"\n"
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"
".ascii \" # IS_STR_INTERNED GC_IMMUTABLE\\n\"\n" ".ascii \" # IS_STR_INTERNED GC_IMMUTABLE\\n\"\n"
@ -1598,12 +1594,11 @@ asm(
".ascii \" bit = bits.get(val)\\n\"\n" ".ascii \" bit = bits.get(val)\\n\"\n"
".ascii \" if bit == None:\\n\"\n" ".ascii \" if bit == None:\\n\"\n"
".ascii \" continue\\n\"\n" ".ascii \" continue\\n\"\n"
".ascii \" match type:\\n\"\n" ".ascii \" if type == 'STR':\\n\"\n"
".ascii \" case 'STR':\\n\"\n"
".ascii \" target = str_bits\\n\"\n" ".ascii \" target = str_bits\\n\"\n"
".ascii \" case 'ARRAY':\\n\"\n" ".ascii \" elif type == 'ARRAY':\\n\"\n"
".ascii \" target = array_bits\\n\"\n" ".ascii \" target = array_bits\\n\"\n"
".ascii \" case 'OBJ':\\n\"\n" ".ascii \" elif type == 'OBJ':\\n\"\n"
".ascii \" target = obj_bits\\n\"\n" ".ascii \" target = obj_bits\\n\"\n"
".ascii \" target[name] = int(bit)\\n\"\n" ".ascii \" target[name] = int(bit)\\n\"\n"
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"

View file

@ -112,27 +112,26 @@ class ZendTypePrettyPrinter(gdb.printing.PrettyPrinter):
for bit in range(0, type_mask_size): for bit in range(0, type_mask_size):
if type_mask & (1 << bit): if type_mask & (1 << bit):
type_name = ZendTypeBits.zendTypeName(bit) type_name = ZendTypeBits.zendTypeName(bit)
match type_name: if type_name is None:
case None:
parts.append('(1<<%d)' % bit) parts.append('(1<<%d)' % bit)
case 'list': elif type_name == 'list':
list = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer()) list_ptr = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())
num_types = int(list['num_types']) num_types = int(list_ptr['num_types'])
types = list['types'].dereference().cast(gdb.lookup_type('zend_type').array(num_types)) types = list_ptr['types'].dereference().cast(gdb.lookup_type('zend_type').array(num_types))
for i in range(0, num_types): for i in range(0, num_types):
str = self.format_type(types[i]) type_str = self.format_type(types[i])
if any((c in set('|&()')) for c in str): if any((c in set('|&()')) for c in type_str):
str = '(%s)' % str type_str = '(%s)' % type_str
parts.append(str) parts.append(type_str)
case 'union' | 'arena': elif type_name == 'union' or type_name == 'arena':
meta.append(type_name) meta.append(type_name)
case 'intersection': elif type_name == 'intersection':
meta.append(type_name) meta.append(type_name)
separator = '&' separator = '&'
case 'name': elif type_name == 'name':
str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer()) name_str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())
parts.append(format_zstr(str)) parts.append(format_zstr(name_str))
case _: else:
parts.append(type_name) parts.append(type_name)
str = separator.join(parts) str = separator.join(parts)
@ -403,14 +402,14 @@ class ZendFunctionPrettyPrinter(gdb.printing.PrettyPrinter):
self.val = val self.val = val
def to_string(self): def to_string(self):
match int(self.val['type']): val_type = int(self.val['type'])
case ZendFnTypes.ZEND_INTERNAL_FUNCTION: if val_type == ZendFnTypes.ZEND_INTERNAL_FUNCTION:
typestr = 'internal' typestr = 'internal'
case ZendFnTypes.ZEND_USER_FUNCTION: elif val_type == ZendFnTypes.ZEND_USER_FUNCTION:
typestr = 'user' typestr = 'user'
case ZendFnTypes.ZEND_EVAL_CODE: elif val_type == ZendFnTypes.ZEND_EVAL_CODE:
typestr = 'eval' typestr = 'eval'
case _: else:
typestr = '???' typestr = '???'
if self.val['common']['function_name']: if self.val['common']['function_name']:
@ -831,12 +830,11 @@ class ZendRefTypeInfo:
bits = self._bits bits = self._bits
type_bits = None type_bits = None
match type_name: if type_name == 'string':
case 'string':
type_bits = self._str_bits type_bits = self._str_bits
case 'array': elif type_name == 'array':
type_bits = self._array_bits type_bits = self._array_bits
case 'object': elif type_name == 'object':
type_bits = self._obj_bits type_bits = self._obj_bits
type_flags = flags & self._flags_mask type_flags = flags & self._flags_mask
@ -860,14 +858,13 @@ class ZendRefTypeInfo:
if (flags & (1<<self.bit('GC_NOT_COLLECTABLE'))) == 0: if (flags & (1<<self.bit('GC_NOT_COLLECTABLE'))) == 0:
gc_color = (flags >> self._info_shift) & self._gc_color gc_color = (flags >> self._info_shift) & self._gc_color
match gc_color: if gc_color == self._gc_black:
case self._gc_black:
names.append('GC_BLACK') names.append('GC_BLACK')
case self._gc_white: elif gc_color == self._gc_white:
names.append('GC_WHITE') names.append('GC_WHITE')
case self._gc_grey: elif gc_color == self._gc_grey:
names.append('GC_GREY') names.append('GC_GREY')
case self._gc_purple: elif gc_color == self._gc_purple:
names.append('GC_PURPLE') names.append('GC_PURPLE')
gc_address = (flags >> self._info_shift) & self._gc_address gc_address = (flags >> self._info_shift) & self._gc_address
@ -907,16 +904,15 @@ class ZendRefTypeInfo:
pattern = re.compile(r'#define (GC_[^\s]+)\s+((0x)?[0-9a-f]+)') pattern = re.compile(r'#define (GC_[^\s]+)\s+((0x)?[0-9a-f]+)')
matches = pattern.findall(content) matches = pattern.findall(content)
for name, bit, _ in matches: for name, bit, _ in matches:
match name: if name == 'GC_TYPE_MASK':
case 'GC_TYPE_MASK':
self._type_mask = int(bit, 0) self._type_mask = int(bit, 0)
case 'GC_FLAGS_MASK': elif name == 'GC_FLAGS_MASK':
self._flags_mask = int(bit, 0) self._flags_mask = int(bit, 0)
case 'GC_INFO_MASK': elif name == 'GC_INFO_MASK':
self._info_mask = int(bit, 0) self._info_mask = int(bit, 0)
case 'GC_INFO_SHIFT': elif name == 'GC_INFO_SHIFT':
self._info_shift = int(bit, 0) self._info_shift = int(bit, 0)
case 'GC_FLAGS_SHIFT': elif name == 'GC_FLAGS_SHIFT':
self._flags_shift = int(bit, 0) self._flags_shift = int(bit, 0)
# IS_STR_INTERNED GC_IMMUTABLE # IS_STR_INTERNED GC_IMMUTABLE
@ -928,12 +924,11 @@ class ZendRefTypeInfo:
bit = bits.get(val) bit = bits.get(val)
if bit == None: if bit == None:
continue continue
match type: if type == 'STR':
case 'STR':
target = str_bits target = str_bits
case 'ARRAY': elif type == 'ARRAY':
target = array_bits target = array_bits
case 'OBJ': elif type == 'OBJ':
target = obj_bits target = obj_bits
target[name] = int(bit) target[name] = int(bit)