Browse Source

Merge pull request #31 from SRSSoftware/debugger_deref_pointers

allow debugger to derefence pointers
Brucey 9 years ago
parent
commit
2058dd785a
1 changed files with 84 additions and 2 deletions
  1. 84 2
      appstub.mod/debugger_mt.stdio.bmx

+ 84 - 2
appstub.mod/debugger_mt.stdio.bmx

@@ -341,10 +341,13 @@ Function DebugDeclValue$( decl:Int Ptr,inst:Byte Ptr )
 		Local s$=String.FromWString( Short Ptr p )
 		Return DebugEscapeString( s )
 	Case Asc("*"),Asc("?"),Asc("#")
+		Local deref$
 ?Not ptr64
-		Return "$"+ToHex( (Int Ptr p)[0] )
+		If tag=Asc("*") deref = DebugDerefPointer(decl,Int Ptr p)
+		Return "$"+ToHex( (Int Ptr p)[0] )+deref
 ?ptr64
-		Return "$"+ToHex( (Long Ptr p)[0] )
+		If tag=Asc("*") deref = DebugDerefPointer(decl,Long Ptr p)
+		Return "$"+ToHex( (Long Ptr p)[0] )+deref
 ?
 	Case Asc("(")
 		p=(Byte Ptr Ptr p)[0]
@@ -388,6 +391,85 @@ Function DebugScopeKind$( scope:Int Ptr )
 	DebugError "Invalid scope kind"
 End Function
 
+?ptr64
+Function DebugDerefPointer$(decl:Int Ptr, pointer:Long Ptr)
+?Not ptr64
+Function DebugDerefPointer$(decl:Int Ptr, pointer:Int Ptr)
+? 
+	Local tipe$=DebugDeclType( decl )
+	Local datatype$ = tipe[..tipe.Find(" ",0)]
+	Local start:Int
+	Local count:Int
+	
+	Repeat
+		start = tipe.Find("Ptr",start+1)
+		If start = -1 Exit
+		count :+ 1
+	Forever
+	
+	For Local i:Int = 0 Until count
+?ptr64
+		pointer = Long Ptr (Varptr pointer)[0]
+?Not ptr64
+		pointer = Int Ptr (Varptr pointer)[0]
+?
+	Next
+
+	Local value:String
+	Select datatype
+	Case "Byte"
+		value = Byte Ptr (Varptr pointer)[0]
+		Return " {"+value+"}"
+
+	Case "Short"
+		value = Short Ptr (Varptr pointer)[0]
+		Return " {"+value+"}"
+
+	Case "Int"
+		value = Int Ptr (Varptr pointer)[0]
+		Return " {"+value+"}"
+
+	Case "Long"
+		value = Long Ptr (Varptr pointer)[0]
+		Return " {"+value+"}"
+
+	Case "Float"
+		value = Float Ptr (Varptr pointer)[0]
+		Return " {"+value+"}"
+		
+	Case "Double"
+		value = Double Ptr (Varptr pointer)[0]
+		Return " {"+value+"}"
+
+	Case "Float64"
+		value = String(Float Ptr (Varptr pointer)[0])
+		value :+ "," + String(Float Ptr (Varptr pointer)[1])
+		Return " {"+value+"}"
+
+	Case "Float128"
+		value = String(Float Ptr (Varptr pointer)[0])
+		value :+ "," + String(Float Ptr (Varptr pointer)[1])
+		value :+ "," + String(Float Ptr (Varptr pointer)[2])
+		value :+ "," + String(Float Ptr (Varptr pointer)[3])
+		Return " {"+value+"}"
+
+	Case "Double128"
+		value = String(Double Ptr (Varptr pointer)[0])
+		value :+ "," + String(Double Ptr (Varptr pointer)[1])
+		Return " {"+value+"}"
+
+	Case "Int128"
+		value = String(Int Ptr (Varptr pointer)[0])
+		value :+ "," + String(Int Ptr (Varptr pointer)[1])
+		value :+ "," + String(Int Ptr (Varptr pointer)[2])
+		value :+ "," + String(Int Ptr (Varptr pointer)[3])
+		Return " {"+value+"}"
+
+	EndSelect
+	
+	Return ""
+EndFunction
+
 'Function DebugScopeDecls:Int Ptr[]( scope:Int Ptr )
 '	Local n,p:Int Ptr=scope+DEBUGSCOPE_DECLS
 '	While p[n]<>DEBUGDECLKIND_END