debbuging failure to read from builtin map

This commit is contained in:
Francesco Cozzuto
2021-11-03 15:22:59 +01:00
parent d4e9eb23d3
commit 0157d28f67
16 changed files with 266 additions and 29 deletions
+15
View File
@@ -11,6 +11,7 @@ typedef struct {
static Object *select(Object *self, Object *key, Heap *heap, Error *err);
static _Bool insert(Object *self, Object *key, Object *val, Heap *heap, Error *err);
static int count(Object *self);
static void print(Object *obj, FILE *fp);
static const Type t_list = {
.base = (Object) { .type = &t_type, .flags = Object_STATIC },
@@ -19,6 +20,7 @@ static const Type t_list = {
.select = select,
.insert = insert,
.count = count,
.print = print,
};
static inline int calc_capacity(int mapper_size)
@@ -151,4 +153,17 @@ static int count(Object *self)
ListObject *list = (ListObject*) self;
return list->count;
}
static void print(Object *self, FILE *fp)
{
ListObject *list = (ListObject*) self;
for(int i = 0; i < list->count; i += 1)
{
Object_Print(list->vals[i], fp);
if(i+1 < list->count)
fprintf(fp, ", ");
}
}
+34
View File
@@ -13,6 +13,7 @@ typedef struct {
static Object *select(Object *self, Object *key, Heap *heap, Error *err);
static _Bool insert(Object *self, Object *key, Object *val, Heap *heap, Error *err);
static int count(Object *self);
static void print(Object *self, FILE *fp);
static const Type t_map = {
.base = (Object) { .type = &t_type, .flags = Object_STATIC },
@@ -21,6 +22,7 @@ static const Type t_map = {
.select = select,
.insert = insert,
.count = count,
.print = print,
};
static inline int calc_capacity(int mapper_size)
@@ -74,6 +76,10 @@ static Object *select(Object *self, Object *key, Heap *heap, Error *error)
assert(heap != NULL);
assert(error != NULL);
fprintf(stderr, "Selecting from:\n\t");
Object_Print(self, stderr);
fprintf(stderr, "\n");
MapObject *map = (MapObject*) self;
int mask = map->mapper_size - 1;
@@ -86,10 +92,15 @@ static Object *select(Object *self, Object *key, Heap *heap, Error *error)
int i = hash & mask;
#warning "TEMP"
fprintf(stderr, "-----------------\n");
while(1)
{
int k = map->mapper[i];
fprintf(stderr, "map->mapper[%d] = %d\n", i, k);
if(k == -1)
{
// Empty slot.
@@ -102,6 +113,10 @@ static Object *select(Object *self, Object *key, Heap *heap, Error *error)
// Is it the right one?
assert(k >= 0);
#warning "TEMP"
fprintf(stderr, "map->keys[%d] = ", k);
Object_Print(map->keys[k], stderr);
fprintf(stderr, " (of type %s)\n", Object_GetName(map->keys[k]));
if(Object_Compare(key, map->keys[k], error))
// Found it!
@@ -114,8 +129,12 @@ static Object *select(Object *self, Object *key, Heap *heap, Error *error)
// Not the one we wanted.
}
int old_i = i;
pert >>= 5;
i = (i * 5 + pert + 1) & mask;
fprintf(stderr, "%d -> %d\n", old_i, i);
}
UNREACHABLE;
@@ -258,4 +277,19 @@ static int count(Object *self)
MapObject *map = (MapObject*) self;
return map->count;
}
static void print(Object *self, FILE *fp)
{
MapObject *map = (MapObject*) self;
for(int i = 0; i < map->count; i += 1)
{
Object_Print(map->keys[i], fp);
fprintf(fp, ": ");
Object_Print(map->vals[i], fp);
if(i+1 < map->count)
fprintf(fp, ", ");
}
}
+6 -1
View File
@@ -94,7 +94,12 @@ static _Bool op_eql(Object *self, Object *other)
StringObject *s1 = (StringObject*) self;
StringObject *s2 = (StringObject*) other;
return s1->size == s2->size && !strncmp(s1->body, s2->body, s1->size);
_Bool match = s1->size == s2->size && !strncmp(s1->body, s2->body, s1->size);
#warning "TEMP"
fprintf(stderr, "%s == %s ? %s\n", s1->body, s2->body, match ? "yes" : "no");
return match;
}
static void print(Object *obj, FILE *fp)
+4 -9
View File
@@ -106,22 +106,17 @@ Object *Object_Call(Object *obj, Object **argv, unsigned int argc, Heap *heap, E
return type->call(obj, argv, argc, heap, err);
}
_Bool Object_Print(Object *obj, FILE *fp, Error *error)
void Object_Print(Object *obj, FILE *fp)
{
assert(error != NULL);
assert(obj != NULL);
const Type *type = Object_GetType(obj);
assert(type);
if(type->print == NULL)
{
Error_Report(error, 0, "Object %s doesn't implement %s", Object_GetName(obj), __func__);
return 0;
}
type->print(obj, fp);
return 1;
fprintf(fp, "<%s is unprintable>", Object_GetName(obj));
else
type->print(obj, fp);
}
Object *Object_Select(Object *coll, Object *key, Heap *heap, Error *err)
+1 -1
View File
@@ -74,7 +74,7 @@ unsigned int Object_GetDeepSize(const Object *obj, Error *err);
int Object_Hash (Object *obj, Error *err);
Object* Object_Copy (Object *obj, Heap *heap, Error *err);
Object* Object_Call (Object *obj, Object **argv, unsigned int argc, Heap *heap, Error *err);
_Bool Object_Print (Object *obj, FILE *fp, Error *error);
void Object_Print (Object *obj, FILE *fp);
Object* Object_Select(Object *coll, Object *key, Heap *heap, Error *err);
Object* Object_Delete(Object *coll, Object *key, Heap *heap, Error *err);
_Bool Object_Insert(Object *coll, Object *key, Object *val, Heap *heap, Error *err);