From f50d27ec11453100ff07f2ed78625c5821fdcaa9 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 4 Jun 2021 13:35:53 +0900 Subject: [PATCH] [qwaq] Show dereferenced data for poitner defs The code currently assumes a single value is referenced rather than the beginning of an array. --- ruamoko/qwaq/builtins/main.c | 3 +- ruamoko/qwaq/debugger/localsdata.r | 18 ++++--- ruamoko/qwaq/debugger/views/defview.h | 9 ++-- ruamoko/qwaq/debugger/views/defview.r | 35 ++++++++++---- ruamoko/qwaq/debugger/views/doubleview.r | 2 +- ruamoko/qwaq/debugger/views/entityview.r | 2 +- ruamoko/qwaq/debugger/views/fieldview.r | 2 +- ruamoko/qwaq/debugger/views/floatview.r | 2 +- ruamoko/qwaq/debugger/views/funcview.r | 2 +- ruamoko/qwaq/debugger/views/intview.r | 2 +- ruamoko/qwaq/debugger/views/nameview.r | 2 +- ruamoko/qwaq/debugger/views/pointerview.h | 6 +++ ruamoko/qwaq/debugger/views/pointerview.r | 59 ++++++++++++++++++++++- ruamoko/qwaq/debugger/views/quatview.r | 2 +- ruamoko/qwaq/debugger/views/stringview.r | 2 +- ruamoko/qwaq/debugger/views/uintview.r | 2 +- ruamoko/qwaq/debugger/views/vectorview.r | 2 +- ruamoko/qwaq/debugger/views/voidview.r | 2 +- 18 files changed, 121 insertions(+), 33 deletions(-) diff --git a/ruamoko/qwaq/builtins/main.c b/ruamoko/qwaq/builtins/main.c index 4404294dc..733dda6b6 100644 --- a/ruamoko/qwaq/builtins/main.c +++ b/ruamoko/qwaq/builtins/main.c @@ -231,8 +231,9 @@ spawn_progs (qwaq_thread_t *thread) } pr_argv = PR_Zone_Malloc (pr, (pr_argc + 1) * 4); pr_argv[0] = PR_SetTempString (pr, name); - for (i = 1; i < pr_argc; i++) + for (i = 1; i < pr_argc; i++) { pr_argv[i] = PR_SetTempString (pr, thread->args.a[i]); + } pr_argv[i] = 0; PR_RESET_PARAMS (pr); diff --git a/ruamoko/qwaq/debugger/localsdata.r b/ruamoko/qwaq/debugger/localsdata.r index d45a86fb4..808c781de 100644 --- a/ruamoko/qwaq/debugger/localsdata.r +++ b/ruamoko/qwaq/debugger/localsdata.r @@ -90,6 +90,14 @@ free_defs (LocalsData *self) if (data && func.local_size && func.local_data) { qdb_get_data (target, func.local_data, func.local_size, data); } + if (aux_func) { + def_rows[0] = 0; + for (int i = 0; i < aux_func.num_locals; i++) { + [def_views[i] fetchData]; + def_rows[i + 1] = [def_views[i] rows]; + } + prefixsum (def_rows, aux_func.num_locals + 1); + } return self; } @@ -111,14 +119,12 @@ free_defs (LocalsData *self) row:(int)row { View *view = nil; - int *index = bsearch (&row, def_rows, aux_func.num_locals, 1, nil); + int *index = fbsearch (&row, def_rows, aux_func.num_locals, 1, nil); if (index) { - if ([column name] == "name") { - view = [def_views[*index] nameViewAtRow: row - *index]; - } else { - view = [def_views[*index] dataViewAtRow: row - *index]; - } + DefView *dv = def_views[index - def_rows]; + int r = row - *index; + view = [dv viewAtRow: r forColumn:column]; } [view resizeTo:{[column width], 1}]; return view; diff --git a/ruamoko/qwaq/debugger/views/defview.h b/ruamoko/qwaq/debugger/views/defview.h index 60ebf9d65..f0e6bb392 100644 --- a/ruamoko/qwaq/debugger/views/defview.h +++ b/ruamoko/qwaq/debugger/views/defview.h @@ -5,6 +5,8 @@ #include "ruamoko/qwaq/ui/view.h" #include "ruamoko/qwaq/debugger/debug.h" +@class TableViewColumn; + @interface DefView : View { qdb_def_t def; @@ -13,10 +15,11 @@ } +(DefView *)withDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type; +(DefView *)withDef:(qdb_def_t)def in:(void *)data target:(qdb_target_t)target; --initWithDef:(qdb_def_t)def; ++(DefView *)withDef:(qdb_def_t)def type:(qfot_type_t *)type in:(void *)data target:(qdb_target_t)target; +-initWithDef:(qdb_def_t)def type:(qfot_type_t *)type; +-fetchData; -(int) rows; --(View *) nameViewAtRow:(int) row; --(View *) dataViewAtRow:(int) row; +-(View *) viewAtRow:(int) row forColumn:(TableViewColumn *)column; @end #endif//__qwaq_debugger_defview_h diff --git a/ruamoko/qwaq/debugger/views/defview.r b/ruamoko/qwaq/debugger/views/defview.r index 376bf8a5c..aff2905f6 100644 --- a/ruamoko/qwaq/debugger/views/defview.r +++ b/ruamoko/qwaq/debugger/views/defview.r @@ -2,6 +2,7 @@ #include "ruamoko/qwaq/debugger/typeencodings.h" #include "ruamoko/qwaq/debugger/views/defview.h" #include "ruamoko/qwaq/debugger/views/nameview.h" +#include "ruamoko/qwaq/ui/tableview.h" static string meta_views[] = { "BasicView", @@ -23,12 +24,13 @@ static string meta_views[] = { return self; } --initWithDef:(qdb_def_t)def +-initWithDef:(qdb_def_t)def type:(qfot_type_t *)type { if (!(self = [super init])) { return nil; } self.def = def; + self.type = type; return self; } @@ -44,11 +46,10 @@ static string meta_views[] = { } +(DefView *)withDef:(qdb_def_t)def + type:(qfot_type_t *)type in:(void *)data target:(qdb_target_t)target { - qfot_type_t *type = [TypeEncodings getType:def.type_encoding - fromTarget:target]; string metaname = nil; if (type.meta == ty_alias) { type = type.alias.aux_type; @@ -64,18 +65,34 @@ static string meta_views[] = { return [NameView withName:"Invalid Meta"]; } ++(DefView *)withDef:(qdb_def_t)def + in:(void *)data + target:(qdb_target_t)target +{ + qfot_type_t *type = [TypeEncodings getType:def.type_encoding + fromTarget:target]; + return [[DefView withDef:def + type:type + in:data + target:target] retain]; +} + +-fetchData +{ + // most def views do not need to update themselves + return self; +} + -(int) rows { return 1; } --(View *) nameViewAtRow:(int) row -{ - return [NameView withName:qdb_get_string (target, def.name)]; -} - --(View *) dataViewAtRow:(int) row +-(View *) viewAtRow:(int) row forColumn:(TableViewColumn *)column { + if ([column name] == "name") { + return [NameView withName:qdb_get_string (target, def.name)]; + } return self; } diff --git a/ruamoko/qwaq/debugger/views/doubleview.r b/ruamoko/qwaq/debugger/views/doubleview.r index 02f129553..16d4653a1 100644 --- a/ruamoko/qwaq/debugger/views/doubleview.r +++ b/ruamoko/qwaq/debugger/views/doubleview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (double *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/entityview.r b/ruamoko/qwaq/debugger/views/entityview.r index 34fe591de..f1200a9c6 100644 --- a/ruamoko/qwaq/debugger/views/entityview.r +++ b/ruamoko/qwaq/debugger/views/entityview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (entity *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/fieldview.r b/ruamoko/qwaq/debugger/views/fieldview.r index 347957011..f09839bf2 100644 --- a/ruamoko/qwaq/debugger/views/fieldview.r +++ b/ruamoko/qwaq/debugger/views/fieldview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (unsigned *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/floatview.r b/ruamoko/qwaq/debugger/views/floatview.r index dcb86b9e8..00f666e69 100644 --- a/ruamoko/qwaq/debugger/views/floatview.r +++ b/ruamoko/qwaq/debugger/views/floatview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (float *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/funcview.r b/ruamoko/qwaq/debugger/views/funcview.r index 34d9f5f93..81025da3a 100644 --- a/ruamoko/qwaq/debugger/views/funcview.r +++ b/ruamoko/qwaq/debugger/views/funcview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (unsigned *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/intview.r b/ruamoko/qwaq/debugger/views/intview.r index 9e2aec16e..f8115bff3 100644 --- a/ruamoko/qwaq/debugger/views/intview.r +++ b/ruamoko/qwaq/debugger/views/intview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (int *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/nameview.r b/ruamoko/qwaq/debugger/views/nameview.r index cbb5bd98d..6393acfd2 100644 --- a/ruamoko/qwaq/debugger/views/nameview.r +++ b/ruamoko/qwaq/debugger/views/nameview.r @@ -5,7 +5,7 @@ -initWithName:(string)name { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:nil])) { return nil; } self.name = name; diff --git a/ruamoko/qwaq/debugger/views/pointerview.h b/ruamoko/qwaq/debugger/views/pointerview.h index 0921bba41..2e314a735 100644 --- a/ruamoko/qwaq/debugger/views/pointerview.h +++ b/ruamoko/qwaq/debugger/views/pointerview.h @@ -6,6 +6,12 @@ @interface PointerView : DefView { unsigned *data; + int invalid; + unsigned ptr; + qfot_type_t *ptr_type; + int ptr_size; + void *ptr_data; + DefView *ptr_view; } +(PointerView *)withDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type; @end diff --git a/ruamoko/qwaq/debugger/views/pointerview.r b/ruamoko/qwaq/debugger/views/pointerview.r index e2cad7033..69c44edac 100644 --- a/ruamoko/qwaq/debugger/views/pointerview.r +++ b/ruamoko/qwaq/debugger/views/pointerview.r @@ -1,11 +1,14 @@ #include +#include "ruamoko/qwaq/debugger/typeencodings.h" +#include "ruamoko/qwaq/debugger/views/nameview.h" #include "ruamoko/qwaq/debugger/views/pointerview.h" +#include "ruamoko/qwaq/ui/tableview.h" @implementation PointerView -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (unsigned *)(data + def.offset); @@ -17,12 +20,64 @@ return [[[self alloc] initWithDef:def in:data type:type] autorelease]; } +-(void)dealloc +{ + if (ptr_data) { + obj_free (ptr_data); + } + [ptr_view release]; +} + -draw { [super draw]; - string val = sprintf ("FIXME [%x]", data[0]); + string val = sprintf ("%s [0x%x]", type.encoding, data[0]); [self mvprintf:{0, 0}, "%*.*s", xlen, xlen, val]; return self; } +-fetchData +{ + if (!ptr_type) { + qdb_def_t def = { 0, 0, 0, (unsigned)type.fldptr.aux_type }; + ptr_type = type.fldptr.aux_type; + ptr_size = [TypeEncodings typeSize:ptr_type]; + ptr_data = obj_malloc (ptr_size); + ptr_view = [[DefView withDef:def + type:ptr_type + in:ptr_data + target:target] retain]; + } + invalid = 1; + if (!ptr_view || ptr != (unsigned) data[0]) { + invalid = qdb_get_data (target, data[0], ptr_size, ptr_data) < 0; + } + return self; +} + +-(int) rows +{ + if (invalid) { + return 2; + } + return 1 + [ptr_view rows]; +} + +-(View *) viewAtRow:(int) row forColumn:(TableViewColumn *)column +{ + if (row == 0) { + if ([column name] == "name") { + return [NameView withName:qdb_get_string (target, def.name)]; + } + return self; + } + if (invalid) { + if ([column name] == "name") { + return nil; + } + return [NameView withName:"Invalid pointer"]; + } + return [ptr_view viewAtRow:row - 1 forColumn:column]; +} + @end diff --git a/ruamoko/qwaq/debugger/views/quatview.r b/ruamoko/qwaq/debugger/views/quatview.r index d2b37a82a..202968415 100644 --- a/ruamoko/qwaq/debugger/views/quatview.r +++ b/ruamoko/qwaq/debugger/views/quatview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (quaternion *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/stringview.r b/ruamoko/qwaq/debugger/views/stringview.r index 81c6dc90e..d1c4808d3 100644 --- a/ruamoko/qwaq/debugger/views/stringview.r +++ b/ruamoko/qwaq/debugger/views/stringview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (int *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/uintview.r b/ruamoko/qwaq/debugger/views/uintview.r index cf800f898..8a0f17e03 100644 --- a/ruamoko/qwaq/debugger/views/uintview.r +++ b/ruamoko/qwaq/debugger/views/uintview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (unsigned *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/vectorview.r b/ruamoko/qwaq/debugger/views/vectorview.r index d351bed66..f7e510742 100644 --- a/ruamoko/qwaq/debugger/views/vectorview.r +++ b/ruamoko/qwaq/debugger/views/vectorview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (vector *)(data + def.offset); diff --git a/ruamoko/qwaq/debugger/views/voidview.r b/ruamoko/qwaq/debugger/views/voidview.r index 234607102..665d28064 100644 --- a/ruamoko/qwaq/debugger/views/voidview.r +++ b/ruamoko/qwaq/debugger/views/voidview.r @@ -5,7 +5,7 @@ -initWithDef:(qdb_def_t)def in:(void *)data type:(qfot_type_t *)type { - if (!(self = [super initWithDef:def])) { + if (!(self = [super initWithDef:def type:type])) { return nil; } self.data = (unsigned *) (data + def.offset);