From 8581c69e71d60012bc4d0eff4f48d745e539af51 Mon Sep 17 00:00:00 2001 From: "luis.carilla" Date: Tue, 1 Apr 2025 23:10:11 +0200 Subject: [PATCH] replace match statements with if statements in gdb debug script so it works with lower GDB versions --- main/debug_gdb_scripts.c | 125 +++++++++++++++++++-------------------- scripts/gdb/php_gdb.py | 125 +++++++++++++++++++-------------------- 2 files changed, 120 insertions(+), 130 deletions(-) diff --git a/main/debug_gdb_scripts.c b/main/debug_gdb_scripts.c index f369e0945cda9..3806f6aab60dd 100644 --- a/main/debug_gdb_scripts.c +++ b/main/debug_gdb_scripts.c @@ -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._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" diff --git a/scripts/gdb/php_gdb.py b/scripts/gdb/php_gdb.py index 724cef6cf19e9..ae8396a2ac0c2 100644 --- a/scripts/gdb/php_gdb.py +++ b/scripts/gdb/php_gdb.py @@ -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._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