143 lines
3.2 KiB
R
143 lines
3.2 KiB
R
|
#include <string.h>
|
||
|
#include <types.h>
|
||
|
#include "debugger/localsview.h"
|
||
|
#include "debugger/typeencodings.h"
|
||
|
|
||
|
@implementation LocalsView
|
||
|
|
||
|
-initWithRect:(Rect)rect target:(qdb_target_t) target
|
||
|
{
|
||
|
if (!(self = [super initWithRect:rect])) {
|
||
|
return nil;
|
||
|
}
|
||
|
options = ofCanFocus;
|
||
|
growMode = gfGrowHi;
|
||
|
|
||
|
self.target = target;
|
||
|
|
||
|
qdb_def_t encodings_def = qdb_find_global (target, ".type_encodings");
|
||
|
qdb_get_data (target, encodings_def.offset, sizeof(target_encodings),
|
||
|
&target_encodings);
|
||
|
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
-setFunction:(unsigned) fnum
|
||
|
{
|
||
|
if (current_fnum == fnum) {
|
||
|
return self;
|
||
|
}
|
||
|
current_fnum =fnum;
|
||
|
|
||
|
if (defs) {
|
||
|
obj_free (defs);
|
||
|
defs = nil;
|
||
|
}
|
||
|
if (data) {
|
||
|
obj_free (data);
|
||
|
data = nil;
|
||
|
}
|
||
|
func = qdb_get_function (target, fnum);
|
||
|
aux_func = qdb_get_auxfunction (target, fnum);
|
||
|
if (aux_func) {
|
||
|
defs = qdb_get_local_defs (target, fnum);
|
||
|
}
|
||
|
if (func) {
|
||
|
data = obj_malloc (func.local_size);
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
-draw
|
||
|
{
|
||
|
[super draw];
|
||
|
|
||
|
if (!data) {
|
||
|
return self;
|
||
|
}
|
||
|
qdb_get_data (target, func.local_data, func.local_size, data);
|
||
|
[self clear];
|
||
|
if (!defs) {
|
||
|
[self mvprintf:{0,0}, "%d", func.local_size];
|
||
|
for (int y = 1; y < ylen; y++) {
|
||
|
unsigned ind = (y - 1) * 4;
|
||
|
if (ind < func.local_size) {
|
||
|
[self mvprintf:{0, y}, "%02x", ind];
|
||
|
for (int x = 0; x < 4 && ind < func.local_size; x++, ind++) {
|
||
|
[self mvprintf:{x * 9 + 3, y}, "%08x",
|
||
|
data[ind]];
|
||
|
}
|
||
|
} else {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
for (int y = 0; y < ylen; y++) {
|
||
|
if (y >= aux_func.num_locals) {
|
||
|
break;
|
||
|
}
|
||
|
qdb_def_t *def = defs + y;
|
||
|
unsigned te = def.type_encoding + (int) target_encodings.types;
|
||
|
qfot_type_t *type;
|
||
|
type = [TypeEncodings getType:te fromTarget:target];
|
||
|
[self mvprintf:{0, y}, "%s",
|
||
|
qdb_get_string (target, def.name)];
|
||
|
@param value = nil;
|
||
|
string valstr = "--";
|
||
|
unsigned offset = func.local_data + def.offset;
|
||
|
printf ("%d %d %s %d\n", def.type_size, offset,
|
||
|
qdb_get_string (target, def.name),
|
||
|
def.type_encoding);
|
||
|
qdb_get_data (target, offset, def.type_size >> 16, &value);
|
||
|
switch (def.type_size & 0xffff) {
|
||
|
case ev_void:
|
||
|
case ev_invalid:
|
||
|
case ev_type_count:
|
||
|
break;
|
||
|
case ev_string:
|
||
|
valstr = qdb_get_string (target, value.integer_val);
|
||
|
break;
|
||
|
case ev_float:
|
||
|
valstr = sprintf ("%.9g", value.float_val);
|
||
|
break;
|
||
|
case ev_vector:
|
||
|
valstr = sprintf ("%.9v", value.vector_val);
|
||
|
break;
|
||
|
case ev_entity:
|
||
|
valstr = sprintf ("%e", value.entity_val);
|
||
|
break;
|
||
|
case ev_field:
|
||
|
valstr = sprintf ("[%x]", value.field_val);
|
||
|
break;
|
||
|
case ev_func:
|
||
|
valstr = sprintf ("[%x]", value.func_val);
|
||
|
break;
|
||
|
case ev_pointer:
|
||
|
valstr = sprintf ("[%x]", value.pointer_val);
|
||
|
break;
|
||
|
case ev_quat:
|
||
|
valstr = sprintf ("[%q]", value.quaternion_val);
|
||
|
break;
|
||
|
case ev_integer:
|
||
|
valstr = sprintf ("%d", value.integer_val);
|
||
|
break;
|
||
|
case ev_uinteger:
|
||
|
valstr = sprintf ("%d", value.integer_val);
|
||
|
break;
|
||
|
case ev_short:
|
||
|
valstr = sprintf ("%d", value.integer_val);
|
||
|
break;
|
||
|
case ev_double:
|
||
|
valstr = sprintf ("%.17g", value.double_val);
|
||
|
break;
|
||
|
}
|
||
|
int x = xlen - strlen (valstr);
|
||
|
[self mvaddstr:{x, y}, valstr];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
@end
|