mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
GDB: replace match statements with if statements in gdb debug script so it works with lower versions (#18226)
This commit is contained in:
parent
a9d4b49252
commit
02d58faad4
2 changed files with 120 additions and 130 deletions
75
main/debug_gdb_scripts.c
generated
75
main/debug_gdb_scripts.c
generated
|
@ -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"
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue