mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 12:49:40 +00:00
gdb: Handle the case where the fundamental type table is optimized out
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5986>
This commit is contained in:
parent
f1070b4380
commit
e98c515c58
2 changed files with 33 additions and 12 deletions
|
@ -49,29 +49,53 @@ def g_quark_to_string(quark):
|
|||
##
|
||||
|
||||
|
||||
def is_fundamental(gtype):
|
||||
gtype = long(gtype)
|
||||
typenode = gtype - gtype % 4
|
||||
|
||||
return typenode < (255 << 2)
|
||||
|
||||
|
||||
def g_type_to_typenode(gtype):
|
||||
def lookup_fundamental_type(typenode):
|
||||
if typenode == 0:
|
||||
return None
|
||||
val = read_global_var("static_fundamental_type_nodes")
|
||||
if val is None:
|
||||
if val is None or val.is_optimized_out:
|
||||
return None
|
||||
return val[typenode >> 2].address
|
||||
|
||||
gtype = long(gtype)
|
||||
typenode = gtype - gtype % 4
|
||||
if typenode > (255 << 2):
|
||||
typenode = gdb.Value(typenode).cast(gdb.lookup_type("TypeNode").pointer())
|
||||
if not is_fundamental(gtype):
|
||||
res = gdb.Value(typenode).cast(gdb.lookup_type("TypeNode").pointer())
|
||||
else:
|
||||
typenode = lookup_fundamental_type(typenode)
|
||||
return typenode
|
||||
res = lookup_fundamental_type(typenode)
|
||||
|
||||
return res
|
||||
|
||||
|
||||
def g_type_fundamental_name(gtype):
|
||||
if is_fundamental(gtype):
|
||||
return g_type_to_name(gtype)
|
||||
else:
|
||||
typenode = g_type_to_typenode(gtype)
|
||||
if typenode:
|
||||
return g_quark_to_string(typenode["qname"])
|
||||
return None
|
||||
|
||||
return g_type_to_name(typenode["supers"][int(typenode["n_supers"])])
|
||||
|
||||
|
||||
def g_type_to_name(gtype):
|
||||
typenode = g_type_to_typenode(gtype)
|
||||
if typenode:
|
||||
return g_quark_to_string(typenode["qname"])
|
||||
return None
|
||||
|
||||
try:
|
||||
return gdb.parse_and_eval(f"g_type_name({gtype})").string()
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
|
||||
def g_type_name_from_instance(instance):
|
||||
|
|
|
@ -23,7 +23,7 @@ import sys
|
|||
import re
|
||||
|
||||
from glib_gobject_helper import g_type_to_name, g_type_name_from_instance, \
|
||||
g_type_to_typenode, g_quark_to_string
|
||||
g_type_to_typenode, g_quark_to_string, g_type_fundamental_name
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
long = int
|
||||
|
@ -214,11 +214,8 @@ def _g_array_iter(array, element_type):
|
|||
|
||||
|
||||
def _g_value_get_value(val):
|
||||
typenode = g_type_to_typenode(val["g_type"])
|
||||
if not typenode:
|
||||
return None
|
||||
tname = g_quark_to_string(typenode["qname"])
|
||||
fname = g_type_to_name(typenode["supers"][int(typenode["n_supers"])])
|
||||
tname = g_type_to_name(val["g_type"])
|
||||
fname = g_type_fundamental_name(val["g_type"])
|
||||
if fname in ("gchar", "guchar", "gboolean", "gint", "guint", "glong",
|
||||
"gulong", "gint64", "guint64", "gfloat", "gdouble",
|
||||
"gpointer", "GFlags"):
|
||||
|
|
Loading…
Reference in a new issue