mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 04:26:14 +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 g_type_to_typenode(gtype):
|
||||||
def lookup_fundamental_type(typenode):
|
def lookup_fundamental_type(typenode):
|
||||||
if typenode == 0:
|
if typenode == 0:
|
||||||
return None
|
return None
|
||||||
val = read_global_var("static_fundamental_type_nodes")
|
val = read_global_var("static_fundamental_type_nodes")
|
||||||
if val is None:
|
if val is None or val.is_optimized_out:
|
||||||
return None
|
return None
|
||||||
return val[typenode >> 2].address
|
return val[typenode >> 2].address
|
||||||
|
|
||||||
gtype = long(gtype)
|
gtype = long(gtype)
|
||||||
typenode = gtype - gtype % 4
|
typenode = gtype - gtype % 4
|
||||||
if typenode > (255 << 2):
|
if not is_fundamental(gtype):
|
||||||
typenode = gdb.Value(typenode).cast(gdb.lookup_type("TypeNode").pointer())
|
res = gdb.Value(typenode).cast(gdb.lookup_type("TypeNode").pointer())
|
||||||
else:
|
else:
|
||||||
typenode = lookup_fundamental_type(typenode)
|
res = lookup_fundamental_type(typenode)
|
||||||
return 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):
|
def g_type_to_name(gtype):
|
||||||
typenode = g_type_to_typenode(gtype)
|
typenode = g_type_to_typenode(gtype)
|
||||||
if typenode:
|
if typenode:
|
||||||
return g_quark_to_string(typenode["qname"])
|
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):
|
def g_type_name_from_instance(instance):
|
||||||
|
|
|
@ -23,7 +23,7 @@ import sys
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from glib_gobject_helper import g_type_to_name, g_type_name_from_instance, \
|
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:
|
if sys.version_info[0] >= 3:
|
||||||
long = int
|
long = int
|
||||||
|
@ -214,11 +214,8 @@ def _g_array_iter(array, element_type):
|
||||||
|
|
||||||
|
|
||||||
def _g_value_get_value(val):
|
def _g_value_get_value(val):
|
||||||
typenode = g_type_to_typenode(val["g_type"])
|
tname = g_type_to_name(val["g_type"])
|
||||||
if not typenode:
|
fname = g_type_fundamental_name(val["g_type"])
|
||||||
return None
|
|
||||||
tname = g_quark_to_string(typenode["qname"])
|
|
||||||
fname = g_type_to_name(typenode["supers"][int(typenode["n_supers"])])
|
|
||||||
if fname in ("gchar", "guchar", "gboolean", "gint", "guint", "glong",
|
if fname in ("gchar", "guchar", "gboolean", "gint", "guint", "glong",
|
||||||
"gulong", "gint64", "guint64", "gfloat", "gdouble",
|
"gulong", "gint64", "guint64", "gfloat", "gdouble",
|
||||||
"gpointer", "GFlags"):
|
"gpointer", "GFlags"):
|
||||||
|
|
Loading…
Reference in a new issue