Fix dump of NODE [ci skip]

This commit is contained in:
Nobuyoshi Nakada 2024-05-16 21:25:52 +09:00
parent 5111b3d479
commit d076101af9
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465

View File

@ -60,6 +60,9 @@ class RbInspector(LLDBInterface):
rbUndef = self.ruby_globals["RUBY_Qundef"] rbUndef = self.ruby_globals["RUBY_Qundef"]
rbImmediateMask = self.ruby_globals["RUBY_IMMEDIATE_MASK"] rbImmediateMask = self.ruby_globals["RUBY_IMMEDIATE_MASK"]
if self.inspect_node(val):
return
num = val.GetValueAsSigned() num = val.GetValueAsSigned()
if num == rbFalse: if num == rbFalse:
print('false', file=self.result) print('false', file=self.result)
@ -245,13 +248,45 @@ class RbInspector(LLDBInterface):
print("T_DATA:", file=self.result) print("T_DATA:", file=self.result)
self._append_expression("*(struct RData *) %0#x" % val.GetValueAsUnsigned()) self._append_expression("*(struct RData *) %0#x" % val.GetValueAsUnsigned())
elif rval.is_type("RUBY_T_NODE"): elif rval.is_type("RUBY_T_IMEMO"):
imemo_type = ((rval.flags >> self.ruby_globals["RUBY_FL_USHIFT"])
& IMEMO_MASK)
print("T_IMEMO: ", file=self.result)
self._append_expression("(enum imemo_type) %d" % imemo_type)
self._append_expression("*(struct MEMO *) %0#x" % val.GetValueAsUnsigned())
elif rval.is_type("RUBY_T_FILE"):
self.generic_inspect(val, "RFile")
elif rval.is_type("RUBY_T_MOVED"):
self.generic_inspect(val, "RMoved")
elif rval.is_type("RUBY_T_MATCH"):
self.generic_inspect(val, "RMatch")
elif rval.is_type("RUBY_T_STRUCT"):
self.generic_inspect(val, "RStruct")
elif rval.is_type("RUBY_T_ZOMBIE"):
self.generic_inspect(val, "RZombie")
else:
print("Not-handled type %0#x" % rval.type, file=self.result)
print(val, file=self.result)
def inspect_node(self, val):
tRNode = self.target.FindFirstType("struct RNode").GetPointerType() tRNode = self.target.FindFirstType("struct RNode").GetPointerType()
# if val.GetType() != tRNode: does not work for unknown reason
if val.GetType().GetPointeeType().name != "NODE":
return False
rbNodeTypeMask = self.ruby_globals["RUBY_NODE_TYPEMASK"] rbNodeTypeMask = self.ruby_globals["RUBY_NODE_TYPEMASK"]
rbNodeTypeShift = self.ruby_globals["RUBY_NODE_TYPESHIFT"] rbNodeTypeShift = self.ruby_globals["RUBY_NODE_TYPESHIFT"]
flags = val.Cast(tRNode).GetChildMemberWithName("flags").GetValueAsUnsigned()
nd_type = (rval.flags & rbNodeTypeMask) >> rbNodeTypeShift nd_type = (flags & rbNodeTypeMask) >> rbNodeTypeShift
val = val.Cast(tRNode)
self._append_expression("(node_type) %d" % nd_type) self._append_expression("(node_type) %d" % nd_type)
@ -465,30 +500,4 @@ class RbInspector(LLDBInterface):
self._append_expression("*(struct RNode_FILE *) %0#x" % val.GetValueAsUnsigned()) self._append_expression("*(struct RNode_FILE *) %0#x" % val.GetValueAsUnsigned())
else: else:
self._append_expression("*(struct RNode *) %0#x" % val.GetValueAsUnsigned()) self._append_expression("*(struct RNode *) %0#x" % val.GetValueAsUnsigned())
return True
elif rval.is_type("RUBY_T_IMEMO"):
imemo_type = ((rval.flags >> self.ruby_globals["RUBY_FL_USHIFT"])
& IMEMO_MASK)
print("T_IMEMO: ", file=self.result)
self._append_expression("(enum imemo_type) %d" % imemo_type)
self._append_expression("*(struct MEMO *) %0#x" % val.GetValueAsUnsigned())
elif rval.is_type("RUBY_T_FILE"):
self.generic_inspect(val, "RFile")
elif rval.is_type("RUBY_T_MOVED"):
self.generic_inspect(val, "RMoved")
elif rval.is_type("RUBY_T_MATCH"):
self.generic_inspect(val, "RMatch")
elif rval.is_type("RUBY_T_STRUCT"):
self.generic_inspect(val, "RStruct")
elif rval.is_type("RUBY_T_ZOMBIE"):
self.generic_inspect(val, "RZombie")
else:
print("Not-handled type %0#x" % rval.type, file=self.result)
print(val, file=self.result)