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

125
main/debug_gdb_scripts.c generated
View file

@ -782,28 +782,27 @@ 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 \" elif type_name == 'list':\\n\"\n"
".ascii \" case 'list':\\n\"\n" ".ascii \" list_ptr = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())\\n\"\n"
".ascii \" list = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())\\n\"\n" ".ascii \" num_types = int(list_ptr['num_types'])\\n\"\n"
".ascii \" num_types = int(list['num_types'])\\n\"\n" ".ascii \" types = list_ptr['types'].dereference().cast(gdb.lookup_type('zend_type').array(num_types))\\n\"\n"
".ascii \" types = list['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 \" type_str = self.format_type(types[i])\\n\"\n"
".ascii \" str = self.format_type(types[i])\\n\"\n" ".ascii \" if any((c in set('|&()')) for c in type_str):\\n\"\n"
".ascii \" if any((c in set('|&()')) for c in str):\\n\"\n" ".ascii \" type_str = '(%s)' % type_str\\n\"\n"
".ascii \" str = '(%s)' % str\\n\"\n" ".ascii \" parts.append(type_str)\\n\"\n"
".ascii \" parts.append(str)\\n\"\n" ".ascii \" elif type_name == 'union' or type_name == 'arena':\\n\"\n"
".ascii \" case 'union' | 'arena':\\n\"\n" ".ascii \" meta.append(type_name)\\n\"\n"
".ascii \" meta.append(type_name)\\n\"\n" ".ascii \" elif type_name == 'intersection':\\n\"\n"
".ascii \" case '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 \" elif type_name == 'name':\\n\"\n"
".ascii \" case 'name':\\n\"\n" ".ascii \" name_str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())\\n\"\n"
".ascii \" str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())\\n\"\n" ".ascii \" parts.append(format_zstr(name_str))\\n\"\n"
".ascii \" parts.append(format_zstr(str))\\n\"\n" ".ascii \" else:\\n\"\n"
".ascii \" case _:\\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"
".ascii \"\\n\"\n" ".ascii \"\\n\"\n"
@ -1073,15 +1072,15 @@ 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"
".ascii \" namestr = format_zstr(self.val['common']['function_name'])\\n\"\n" ".ascii \" namestr = format_zstr(self.val['common']['function_name'])\\n\"\n"
@ -1501,13 +1500,12 @@ 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 \" elif type_name == 'array':\\n\"\n"
".ascii \" case 'array':\\n\"\n" ".ascii \" type_bits = self._array_bits\\n\"\n"
".ascii \" type_bits = self._array_bits\\n\"\n" ".ascii \" elif type_name == 'object':\\n\"\n"
".ascii \" case '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"
".ascii \" for i in range(0, 31):\\n\"\n" ".ascii \" for i in range(0, 31):\\n\"\n"
@ -1530,15 +1528,14 @@ 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 \" elif gc_color == self._gc_white:\\n\"\n"
".ascii \" case self._gc_white:\\n\"\n" ".ascii \" names.append('GC_WHITE')\\n\"\n"
".ascii \" names.append('GC_WHITE')\\n\"\n" ".ascii \" elif gc_color == self._gc_grey:\\n\"\n"
".ascii \" case self._gc_grey:\\n\"\n" ".ascii \" names.append('GC_GREY')\\n\"\n"
".ascii \" names.append('GC_GREY')\\n\"\n" ".ascii \" elif gc_color == self._gc_purple:\\n\"\n"
".ascii \" case 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"
".ascii \" if gc_address != 0:\\n\"\n" ".ascii \" if gc_address != 0:\\n\"\n"
@ -1577,17 +1574,16 @@ 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 \" elif name == 'GC_FLAGS_MASK':\\n\"\n"
".ascii \" case 'GC_FLAGS_MASK':\\n\"\n" ".ascii \" self._flags_mask = int(bit, 0)\\n\"\n"
".ascii \" self._flags_mask = int(bit, 0)\\n\"\n" ".ascii \" elif name == 'GC_INFO_MASK':\\n\"\n"
".ascii \" case 'GC_INFO_MASK':\\n\"\n" ".ascii \" self._info_mask = int(bit, 0)\\n\"\n"
".ascii \" self._info_mask = int(bit, 0)\\n\"\n" ".ascii \" elif name == 'GC_INFO_SHIFT':\\n\"\n"
".ascii \" case 'GC_INFO_SHIFT':\\n\"\n" ".ascii \" self._info_shift = int(bit, 0)\\n\"\n"
".ascii \" self._info_shift = int(bit, 0)\\n\"\n" ".ascii \" elif name == 'GC_FLAGS_SHIFT':\\n\"\n"
".ascii \" case '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"
".ascii \" # IS_STR_PERMANENT (1<<8)\\n\"\n" ".ascii \" # IS_STR_PERMANENT (1<<8)\\n\"\n"
@ -1598,13 +1594,12 @@ 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 \" elif type == 'ARRAY':\\n\"\n"
".ascii \" case 'ARRAY':\\n\"\n" ".ascii \" target = array_bits\\n\"\n"
".ascii \" target = array_bits\\n\"\n" ".ascii \" elif type == 'OBJ':\\n\"\n"
".ascii \" case '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"
".ascii \" # Hard coded because these are not exposed in header files\\n\"\n" ".ascii \" # Hard coded because these are not exposed in header files\\n\"\n"

View file

@ -112,28 +112,27 @@ 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) elif type_name == 'list':
case 'list': list_ptr = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())
list = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer()) num_types = int(list_ptr['num_types'])
num_types = int(list['num_types']) types = list_ptr['types'].dereference().cast(gdb.lookup_type('zend_type').array(num_types))
types = list['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): type_str = self.format_type(types[i])
str = self.format_type(types[i]) if any((c in set('|&()')) for c in type_str):
if any((c in set('|&()')) for c in str): type_str = '(%s)' % type_str
str = '(%s)' % str parts.append(type_str)
parts.append(str) elif type_name == 'union' or type_name == 'arena':
case 'union' | 'arena': meta.append(type_name)
meta.append(type_name) elif type_name == 'intersection':
case 'intersection': meta.append(type_name)
meta.append(type_name) separator = '&'
separator = '&' elif type_name == 'name':
case 'name': name_str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())
str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer()) parts.append(format_zstr(name_str))
parts.append(format_zstr(str)) else:
case _: parts.append(type_name)
parts.append(type_name)
str = separator.join(parts) str = separator.join(parts)
@ -403,15 +402,15 @@ 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']:
namestr = format_zstr(self.val['common']['function_name']) namestr = format_zstr(self.val['common']['function_name'])
@ -831,13 +830,12 @@ 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 elif type_name == 'array':
case 'array': type_bits = self._array_bits
type_bits = self._array_bits elif type_name == 'object':
case 'object': type_bits = self._obj_bits
type_bits = self._obj_bits
type_flags = flags & self._flags_mask type_flags = flags & self._flags_mask
for i in range(0, 31): for i in range(0, 31):
@ -860,15 +858,14 @@ 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') elif gc_color == self._gc_white:
case self._gc_white: names.append('GC_WHITE')
names.append('GC_WHITE') elif gc_color == self._gc_grey:
case self._gc_grey: names.append('GC_GREY')
names.append('GC_GREY') elif gc_color == self._gc_purple:
case 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
if gc_address != 0: if gc_address != 0:
@ -907,17 +904,16 @@ 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) elif name == 'GC_FLAGS_MASK':
case 'GC_FLAGS_MASK': self._flags_mask = int(bit, 0)
self._flags_mask = int(bit, 0) elif name == 'GC_INFO_MASK':
case 'GC_INFO_MASK': self._info_mask = int(bit, 0)
self._info_mask = int(bit, 0) elif name == 'GC_INFO_SHIFT':
case 'GC_INFO_SHIFT': self._info_shift = int(bit, 0)
self._info_shift = int(bit, 0) elif name == 'GC_FLAGS_SHIFT':
case '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
# IS_STR_PERMANENT (1<<8) # IS_STR_PERMANENT (1<<8)
@ -928,13 +924,12 @@ 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 elif type == 'ARRAY':
case 'ARRAY': target = array_bits
target = array_bits elif type == 'OBJ':
case 'OBJ': target = obj_bits
target = obj_bits
target[name] = int(bit) target[name] = int(bit)
# Hard coded because these are not exposed in header files # Hard coded because these are not exposed in header files