Skip to content

replace match statements with if statements in gdb debug script #18226

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 2, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 60 additions & 65 deletions main/debug_gdb_scripts.c
Original file line number Diff line number Diff line change
@@ -782,28 +782,27 @@ asm(
".ascii \" for bit in range(0, type_mask_size):\\n\"\n"
".ascii \" if type_mask & (1 << bit):\\n\"\n"
".ascii \" type_name = ZendTypeBits.zendTypeName(bit)\\n\"\n"
".ascii \" match type_name:\\n\"\n"
".ascii \" case None:\\n\"\n"
".ascii \" parts.append('(1<<%d)' % bit)\\n\"\n"
".ascii \" case 'list':\\n\"\n"
".ascii \" list = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())\\n\"\n"
".ascii \" num_types = int(list['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 \" str = self.format_type(types[i])\\n\"\n"
".ascii \" if any((c in set('|&()')) for c in str):\\n\"\n"
".ascii \" str = '(%s)' % str\\n\"\n"
".ascii \" parts.append(str)\\n\"\n"
".ascii \" case 'union' | 'arena':\\n\"\n"
".ascii \" meta.append(type_name)\\n\"\n"
".ascii \" case 'intersection':\\n\"\n"
".ascii \" meta.append(type_name)\\n\"\n"
".ascii \" separator = '&'\\n\"\n"
".ascii \" case 'name':\\n\"\n"
".ascii \" str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())\\n\"\n"
".ascii \" parts.append(format_zstr(str))\\n\"\n"
".ascii \" case _:\\n\"\n"
".ascii \" parts.append(type_name)\\n\"\n"
".ascii \" if type_name is None:\\n\"\n"
".ascii \" parts.append('(1<<%d)' % bit)\\n\"\n"
".ascii \" elif type_name == 'list':\\n\"\n"
".ascii \" list_ptr = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())\\n\"\n"
".ascii \" num_types = int(list_ptr['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 \" type_str = self.format_type(types[i])\\n\"\n"
".ascii \" if any((c in set('|&()')) for c in type_str):\\n\"\n"
".ascii \" type_str = '(%s)' % type_str\\n\"\n"
".ascii \" parts.append(type_str)\\n\"\n"
".ascii \" elif type_name == 'union' or type_name == 'arena':\\n\"\n"
".ascii \" meta.append(type_name)\\n\"\n"
".ascii \" elif type_name == 'intersection':\\n\"\n"
".ascii \" meta.append(type_name)\\n\"\n"
".ascii \" separator = '&'\\n\"\n"
".ascii \" elif type_name == 'name':\\n\"\n"
".ascii \" name_str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())\\n\"\n"
".ascii \" parts.append(format_zstr(name_str))\\n\"\n"
".ascii \" else:\\n\"\n"
".ascii \" parts.append(type_name)\\n\"\n"
".ascii \"\\n\"\n"
".ascii \" str = separator.join(parts)\\n\"\n"
".ascii \"\\n\"\n"
@@ -1073,15 +1072,15 @@ asm(
".ascii \" self.val = val\\n\"\n"
".ascii \"\\n\"\n"
".ascii \" def to_string(self):\\n\"\n"
".ascii \" match int(self.val['type']):\\n\"\n"
".ascii \" case ZendFnTypes.ZEND_INTERNAL_FUNCTION:\\n\"\n"
".ascii \" typestr = 'internal'\\n\"\n"
".ascii \" case ZendFnTypes.ZEND_USER_FUNCTION:\\n\"\n"
".ascii \" typestr = 'user'\\n\"\n"
".ascii \" case ZendFnTypes.ZEND_EVAL_CODE:\\n\"\n"
".ascii \" typestr = 'eval'\\n\"\n"
".ascii \" case _:\\n\"\n"
".ascii \" typestr = '\?\?\?'\\n\"\n"
".ascii \" val_type = int(self.val['type'])\\n\"\n"
".ascii \" if val_type == ZendFnTypes.ZEND_INTERNAL_FUNCTION:\\n\"\n"
".ascii \" typestr = 'internal'\\n\"\n"
".ascii \" elif val_type == ZendFnTypes.ZEND_USER_FUNCTION:\\n\"\n"
".ascii \" typestr = 'user'\\n\"\n"
".ascii \" elif val_type == ZendFnTypes.ZEND_EVAL_CODE:\\n\"\n"
".ascii \" typestr = 'eval'\\n\"\n"
".ascii \" else:\\n\"\n"
".ascii \" typestr = '\?\?\?'\\n\"\n"
".ascii \"\\n\"\n"
".ascii \" if 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 \" bits = self._bits\\n\"\n"
".ascii \" type_bits = None\\n\"\n"
".ascii \" match type_name:\\n\"\n"
".ascii \" case 'string':\\n\"\n"
".ascii \" type_bits = self._str_bits\\n\"\n"
".ascii \" case 'array':\\n\"\n"
".ascii \" type_bits = self._array_bits\\n\"\n"
".ascii \" case 'object':\\n\"\n"
".ascii \" type_bits = self._obj_bits\\n\"\n"
".ascii \" if type_name == 'string':\\n\"\n"
".ascii \" type_bits = self._str_bits\\n\"\n"
".ascii \" elif type_name == 'array':\\n\"\n"
".ascii \" type_bits = self._array_bits\\n\"\n"
".ascii \" elif type_name == 'object':\\n\"\n"
".ascii \" type_bits = self._obj_bits\\n\"\n"
".ascii \"\\n\"\n"
".ascii \" type_flags = flags & self._flags_mask\\n\"\n"
".ascii \" for i in range(0, 31):\\n\"\n"
@@ -1530,15 +1528,14 @@ asm(
".ascii \"\\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 \" match gc_color:\\n\"\n"
".ascii \" case self._gc_black:\\n\"\n"
".ascii \" names.append('GC_BLACK')\\n\"\n"
".ascii \" case self._gc_white:\\n\"\n"
".ascii \" names.append('GC_WHITE')\\n\"\n"
".ascii \" case self._gc_grey:\\n\"\n"
".ascii \" names.append('GC_GREY')\\n\"\n"
".ascii \" case self._gc_purple:\\n\"\n"
".ascii \" names.append('GC_PURPLE')\\n\"\n"
".ascii \" if gc_color == self._gc_black:\\n\"\n"
".ascii \" names.append('GC_BLACK')\\n\"\n"
".ascii \" elif gc_color == self._gc_white:\\n\"\n"
".ascii \" names.append('GC_WHITE')\\n\"\n"
".ascii \" elif gc_color == self._gc_grey:\\n\"\n"
".ascii \" names.append('GC_GREY')\\n\"\n"
".ascii \" elif gc_color == self._gc_purple:\\n\"\n"
".ascii \" names.append('GC_PURPLE')\\n\"\n"
".ascii \"\\n\"\n"
".ascii \" gc_address = (flags >> self._info_shift) & self._gc_address\\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 \" matches = pattern.findall(content)\\n\"\n"
".ascii \" for name, bit, _ in matches:\\n\"\n"
".ascii \" match name:\\n\"\n"
".ascii \" case 'GC_TYPE_MASK':\\n\"\n"
".ascii \" self._type_mask = int(bit, 0)\\n\"\n"
".ascii \" case 'GC_FLAGS_MASK':\\n\"\n"
".ascii \" self._flags_mask = int(bit, 0)\\n\"\n"
".ascii \" case 'GC_INFO_MASK':\\n\"\n"
".ascii \" self._info_mask = int(bit, 0)\\n\"\n"
".ascii \" case 'GC_INFO_SHIFT':\\n\"\n"
".ascii \" self._info_shift = int(bit, 0)\\n\"\n"
".ascii \" case 'GC_FLAGS_SHIFT':\\n\"\n"
".ascii \" self._flags_shift = int(bit, 0)\\n\"\n"
".ascii \" if name == 'GC_TYPE_MASK':\\n\"\n"
".ascii \" self._type_mask = int(bit, 0)\\n\"\n"
".ascii \" elif name == 'GC_FLAGS_MASK':\\n\"\n"
".ascii \" self._flags_mask = int(bit, 0)\\n\"\n"
".ascii \" elif name == 'GC_INFO_MASK':\\n\"\n"
".ascii \" self._info_mask = int(bit, 0)\\n\"\n"
".ascii \" elif name == 'GC_INFO_SHIFT':\\n\"\n"
".ascii \" self._info_shift = int(bit, 0)\\n\"\n"
".ascii \" elif name == 'GC_FLAGS_SHIFT':\\n\"\n"
".ascii \" self._flags_shift = int(bit, 0)\\n\"\n"
".ascii \"\\n\"\n"
".ascii \" # IS_STR_INTERNED GC_IMMUTABLE\\n\"\n"
".ascii \" # IS_STR_PERMANENT (1<<8)\\n\"\n"
@@ -1598,13 +1594,12 @@ asm(
".ascii \" bit = bits.get(val)\\n\"\n"
".ascii \" if bit == None:\\n\"\n"
".ascii \" continue\\n\"\n"
".ascii \" match type:\\n\"\n"
".ascii \" case 'STR':\\n\"\n"
".ascii \" target = str_bits\\n\"\n"
".ascii \" case 'ARRAY':\\n\"\n"
".ascii \" target = array_bits\\n\"\n"
".ascii \" case 'OBJ':\\n\"\n"
".ascii \" target = obj_bits\\n\"\n"
".ascii \" if type == 'STR':\\n\"\n"
".ascii \" target = str_bits\\n\"\n"
".ascii \" elif type == 'ARRAY':\\n\"\n"
".ascii \" target = array_bits\\n\"\n"
".ascii \" elif type == 'OBJ':\\n\"\n"
".ascii \" target = obj_bits\\n\"\n"
".ascii \" target[name] = int(bit)\\n\"\n"
".ascii \"\\n\"\n"
".ascii \" # Hard coded because these are not exposed in header files\\n\"\n"
125 changes: 60 additions & 65 deletions scripts/gdb/php_gdb.py
Original file line number Diff line number Diff line change
@@ -112,28 +112,27 @@ def format_type(self, t):
for bit in range(0, type_mask_size):
if type_mask & (1 << bit):
type_name = ZendTypeBits.zendTypeName(bit)
match type_name:
case None:
parts.append('(1<<%d)' % bit)
case 'list':
list = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())
num_types = int(list['num_types'])
types = list['types'].dereference().cast(gdb.lookup_type('zend_type').array(num_types))
for i in range(0, num_types):
str = self.format_type(types[i])
if any((c in set('|&()')) for c in str):
str = '(%s)' % str
parts.append(str)
case 'union' | 'arena':
meta.append(type_name)
case 'intersection':
meta.append(type_name)
separator = '&'
case 'name':
str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())
parts.append(format_zstr(str))
case _:
parts.append(type_name)
if type_name is None:
parts.append('(1<<%d)' % bit)
elif type_name == 'list':
list_ptr = t['ptr'].cast(gdb.lookup_type('zend_type_list').pointer())
num_types = int(list_ptr['num_types'])
types = list_ptr['types'].dereference().cast(gdb.lookup_type('zend_type').array(num_types))
for i in range(0, num_types):
type_str = self.format_type(types[i])
if any((c in set('|&()')) for c in type_str):
type_str = '(%s)' % type_str
parts.append(type_str)
elif type_name == 'union' or type_name == 'arena':
meta.append(type_name)
elif type_name == 'intersection':
meta.append(type_name)
separator = '&'
elif type_name == 'name':
name_str = t['ptr'].cast(gdb.lookup_type('zend_string').pointer())
parts.append(format_zstr(name_str))
else:
parts.append(type_name)

str = separator.join(parts)

@@ -403,15 +402,15 @@ def __init__(self, val):
self.val = val

def to_string(self):
match int(self.val['type']):
case ZendFnTypes.ZEND_INTERNAL_FUNCTION:
typestr = 'internal'
case ZendFnTypes.ZEND_USER_FUNCTION:
typestr = 'user'
case ZendFnTypes.ZEND_EVAL_CODE:
typestr = 'eval'
case _:
typestr = '???'
val_type = int(self.val['type'])
if val_type == ZendFnTypes.ZEND_INTERNAL_FUNCTION:
typestr = 'internal'
elif val_type == ZendFnTypes.ZEND_USER_FUNCTION:
typestr = 'user'
elif val_type == ZendFnTypes.ZEND_EVAL_CODE:
typestr = 'eval'
else:
typestr = '???'

if self.val['common']['function_name']:
namestr = format_zstr(self.val['common']['function_name'])
@@ -831,13 +830,12 @@ def format(self, flags):

bits = self._bits
type_bits = None
match type_name:
case 'string':
type_bits = self._str_bits
case 'array':
type_bits = self._array_bits
case 'object':
type_bits = self._obj_bits
if type_name == 'string':
type_bits = self._str_bits
elif type_name == 'array':
type_bits = self._array_bits
elif type_name == 'object':
type_bits = self._obj_bits

type_flags = flags & self._flags_mask
for i in range(0, 31):
@@ -860,15 +858,14 @@ def format(self, flags):

if (flags & (1<<self.bit('GC_NOT_COLLECTABLE'))) == 0:
gc_color = (flags >> self._info_shift) & self._gc_color
match gc_color:
case self._gc_black:
names.append('GC_BLACK')
case self._gc_white:
names.append('GC_WHITE')
case self._gc_grey:
names.append('GC_GREY')
case self._gc_purple:
names.append('GC_PURPLE')
if gc_color == self._gc_black:
names.append('GC_BLACK')
elif gc_color == self._gc_white:
names.append('GC_WHITE')
elif gc_color == self._gc_grey:
names.append('GC_GREY')
elif gc_color == self._gc_purple:
names.append('GC_PURPLE')

gc_address = (flags >> self._info_shift) & self._gc_address
if gc_address != 0:
@@ -907,17 +904,16 @@ def _load(self):
pattern = re.compile(r'#define (GC_[^\s]+)\s+((0x)?[0-9a-f]+)')
matches = pattern.findall(content)
for name, bit, _ in matches:
match name:
case 'GC_TYPE_MASK':
self._type_mask = int(bit, 0)
case 'GC_FLAGS_MASK':
self._flags_mask = int(bit, 0)
case 'GC_INFO_MASK':
self._info_mask = int(bit, 0)
case 'GC_INFO_SHIFT':
self._info_shift = int(bit, 0)
case 'GC_FLAGS_SHIFT':
self._flags_shift = int(bit, 0)
if name == 'GC_TYPE_MASK':
self._type_mask = int(bit, 0)
elif name == 'GC_FLAGS_MASK':
self._flags_mask = int(bit, 0)
elif name == 'GC_INFO_MASK':
self._info_mask = int(bit, 0)
elif name == 'GC_INFO_SHIFT':
self._info_shift = int(bit, 0)
elif name == 'GC_FLAGS_SHIFT':
self._flags_shift = int(bit, 0)

# IS_STR_INTERNED GC_IMMUTABLE
# IS_STR_PERMANENT (1<<8)
@@ -928,13 +924,12 @@ def _load(self):
bit = bits.get(val)
if bit == None:
continue
match type:
case 'STR':
target = str_bits
case 'ARRAY':
target = array_bits
case 'OBJ':
target = obj_bits
if type == 'STR':
target = str_bits
elif type == 'ARRAY':
target = array_bits
elif type == 'OBJ':
target = obj_bits
target[name] = int(bit)

# Hard coded because these are not exposed in header files