From 047e0811e9991d4c97d95013defbfa2fd9b95d30 Mon Sep 17 00:00:00 2001 From: cxl Date: Sat, 23 Nov 2019 09:52:37 +0000 Subject: [PATCH] ide: PDB debugger BiVector/BiArray support git-svn-id: svn://ultimatepp.org/upp/trunk@13708 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/ide/Debuggers/Pdb.h | 2 ++ uppsrc/ide/Debuggers/Pretty.cpp | 22 ++++++++++++++++++++++ uppsrc/ide/Debuggers/Sym.cpp | 2 ++ 3 files changed, 26 insertions(+) diff --git a/uppsrc/ide/Debuggers/Pdb.h b/uppsrc/ide/Debuggers/Pdb.h index a043a5b7d..8bd4fb30c 100644 --- a/uppsrc/ide/Debuggers/Pdb.h +++ b/uppsrc/ide/Debuggers/Pdb.h @@ -390,6 +390,8 @@ struct Pdb : Debugger, ParentCtrl { void PrettyWString(Val val, const Vector& tparam, int64 from, int count, Pretty& p); void PrettyVector(Val val, const Vector& tparam, int64 from, int count, Pretty& p); void PrettyArray(Val val, const Vector& tparam, int64 from, int count, Pretty& p); + void PrettyBiVector(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p); + void PrettyBiArray(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p); void PrettyIndex(Val val, const Vector& tparam, int64 from, int count, Pretty& p); void PrettyMap(Pretty& p, Pretty& key, Pretty& value); void PrettyVectorMap(Val val, const Vector& tparam, int64 from, int count, Pretty& p); diff --git a/uppsrc/ide/Debuggers/Pretty.cpp b/uppsrc/ide/Debuggers/Pretty.cpp index 0d2e8d8bd..ee8cad341 100644 --- a/uppsrc/ide/Debuggers/Pretty.cpp +++ b/uppsrc/ide/Debuggers/Pretty.cpp @@ -36,6 +36,19 @@ void Pdb::PrettyVector(Pdb::Val val, const Vector& tparam, int64 from, i p.data_ptr.Add(item.address + (i + from) * sz); } +void Pdb::PrettyBiVector(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p) +{ + p.data_count = GetInt64(GetAttr(val, "items")); + int start = GetInt(GetAttr(val, "items")); + int alloc = GetInt(GetAttr(val, "alloc")); + Val item = DeRef(GetAttr(val, "vector")); + int sz = SizeOfType(tparam[0]); + for(int i = 0; i < count; i++) { + int ii = i + start < alloc ? i + start : i + start - alloc; + p.data_ptr.Add(item.address + (ii + from) * sz); + } +} + void Pdb::PrettyIndex(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p) { return PrettyVector(GetAttr(val, "key"), tparam, from, count, p); @@ -48,6 +61,13 @@ void Pdb::PrettyArray(Pdb::Val val, const Vector& tparam, int64 from, in a = PeekPtr(a); } +void Pdb::PrettyBiArray(Pdb::Val val, const Vector& tparam, int64 from, int count, Pdb::Pretty& p) +{ + PrettyBiVector(GetAttr(val, "bv"), { "int *" }, from, count, p); + for(adr_t& a : p.data_ptr) + a = PeekPtr(a); +} + void Pdb::PrettyMap(Pdb::Pretty& p, Pdb::Pretty& key, Pdb::Pretty& value) { p.data_count = min(key.data_count, value.data_count); @@ -234,7 +254,9 @@ bool Pdb::PrettyData(Visual& result, Pdb::Val val, dword flags) pretty.Add("Upp::String", { 0, THISFN(PrettyString) }); pretty.Add("Upp::WString", { 0, THISFN(PrettyWString) }); pretty.Add("Upp::Vector", { 1, THISFN(PrettyVector) }); + pretty.Add("Upp::BiVector", { 1, THISFN(PrettyBiVector) }); pretty.Add("Upp::Array", { 1, THISFN(PrettyArray) }); + pretty.Add("Upp::BiArray", { 1, THISFN(PrettyBiArray) }); pretty.Add("Upp::Index", { 1, THISFN(PrettyIndex) }); pretty.Add("Upp::VectorMap", { 2, THISFN(PrettyVectorMap) }); pretty.Add("Upp::ArrayMap", { 2, THISFN(PrettyArrayMap) }); diff --git a/uppsrc/ide/Debuggers/Sym.cpp b/uppsrc/ide/Debuggers/Sym.cpp index e7cbf07e3..41b00c24c 100644 --- a/uppsrc/ide/Debuggers/Sym.cpp +++ b/uppsrc/ide/Debuggers/Sym.cpp @@ -297,6 +297,8 @@ int Pdb::GetTypeIndex(adr_t modbase, dword typeindex) const Pdb::Type& Pdb::GetType(int ti) { + if(ti < 0 || ti >= type.GetCount()) + ThrowError("Invalid type"); Type& t = type[ti]; int typeindex = type.GetKey(ti); if(t.size < 0) {