debbuging failure to read from builtin map
This commit is contained in:
@@ -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, ", ");
|
||||
}
|
||||
}
|
||||
@@ -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, ", ");
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user