Skip to content

Commit

Permalink
Add GC descriptors for builtin etc
Browse files Browse the repository at this point in the history
This adds GC descriptors for most of the C code we have checked in, like
builtins and RTS. Mallocs have been turned into
GC_MALLOC_EXPLICITLY_TYPED with a corresponding GC descriptor stored in
the method table of the associated class. The GC descriptor is in turn
based on a GC bitmap, which is of varying length and thus not suitable
for placing directly in the method table. There are instead separate
global variables, one per class. We initialize these structures a bit
differently, so where there are static initializations the bitmap is
currently initialized to 0, which is usually wrong as it indicates that
the GC should not scan the object. For classes initialized with a method
table, as the current code generated by actonc, we currently set it to
0xFF, as to indicate all bits should be scanned.

The goal right now is just to add in the GC descriptors and start using
them for allocations without breaking anything. We will start fiddling
with the bits later on to speed things up.
  • Loading branch information
plajjan committed Apr 11, 2023
1 parent 78ba866 commit 444f048
Show file tree
Hide file tree
Showing 59 changed files with 1,758 additions and 741 deletions.
1,314 changes: 896 additions & 418 deletions builtin/__builtin__.c

Large diffs are not rendered by default.

619 changes: 460 additions & 159 deletions builtin/__builtin__.h

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions builtin/atom.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
*/

struct B_atomG_class B_atomG_methods = {
0,
"B_atom",
UNASSIGNED,
($SuperG_class)&B_valueG_methods
Expand Down
1 change: 1 addition & 0 deletions builtin/bool.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ struct B_bool {
struct B_boolG_class *$class;
long val;
};
extern GC_word B_boolD_gcbm[GC_BITMAP_SIZE(struct B_bool)];

B_bool toB_bool(long b);
long fromB_bool(B_bool b);
Expand Down
15 changes: 5 additions & 10 deletions builtin/builtin_functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,7 @@ B_IteratorD_enumerate B_IteratorD_enumerate$_deserialize(B_IteratorD_enumerate r
return NULL;
}

struct B_IteratorD_enumerateG_class B_IteratorD_enumerateG_methods = {"B_IteratorD_enumerate",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_enumerate_init,
B_IteratorD_enumerate_serialize, B_IteratorD_enumerate$_deserialize,
struct B_IteratorD_enumerateG_class B_IteratorD_enumerateG_methods = {0,"B_IteratorD_enumerate",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_enumerate_init, B_IteratorD_enumerate_serialize, B_IteratorD_enumerate$_deserialize,
B_IteratorD_enumerate_bool,B_IteratorD_enumerate_str,B_IteratorD_enumerate_str, B_IteratorD_enumerate_next};


Expand Down Expand Up @@ -143,8 +142,7 @@ B_IteratorD_filter B_IteratorD_filter$_deserialize(B_IteratorD_filter res, $Seri
return w;
}

struct B_IteratorD_filterG_class B_IteratorD_filterG_methods = {"B_IteratorD_filter",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_filter_init,
B_IteratorD_filter_serialize, B_IteratorD_filter$_deserialize,
struct B_IteratorD_filterG_class B_IteratorD_filterG_methods = {0,"B_IteratorD_filter",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_filter_init, B_IteratorD_filter_serialize, B_IteratorD_filter$_deserialize,
B_IteratorD_filter_bool,B_IteratorD_filter_str,B_IteratorD_filter_str, B_IteratorD_filter_next};

B_IteratorD_filter B_IteratorD_filterG_new(B_Iterator it, $pure f) {
Expand Down Expand Up @@ -192,8 +190,7 @@ B_IteratorD_map B_IteratorD_map$_deserialize(B_IteratorD_map res, $Serial$state
return NULL;
}

struct B_IteratorD_mapG_class B_IteratorD_mapG_methods = {"B_IteratorD_map",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_map_init,
B_IteratorD_map_serialize, B_IteratorD_map$_deserialize,
struct B_IteratorD_mapG_class B_IteratorD_mapG_methods = {0,"B_IteratorD_map",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_map_init, B_IteratorD_map_serialize, B_IteratorD_map$_deserialize,
B_IteratorD_map_bool,B_IteratorD_map_str,B_IteratorD_map_str, B_IteratorD_map_next};

B_IteratorD_map B_IteratorD_mapG_new(B_Iterator it, $pure f) {
Expand Down Expand Up @@ -293,8 +290,7 @@ B_IteratorD_zip B_IteratorD_zip$_deserialize(B_IteratorD_zip res, $Serial$state
return NULL;
}

struct B_IteratorD_zipG_class B_IteratorD_zipG_methods = {" B_IteratorD_zip",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_zip_init,
B_IteratorD_zip_serialize, B_IteratorD_zip$_deserialize,
struct B_IteratorD_zipG_class B_IteratorD_zipG_methods = {0," B_IteratorD_zip",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_zip_init, B_IteratorD_zip_serialize, B_IteratorD_zip$_deserialize,
B_IteratorD_zip_bool,B_IteratorD_zip_str,B_IteratorD_zip_str, B_IteratorD_zip_next};

B_IteratorD_zip B_IteratorD_zipG_new(B_Iterator iter1, B_Iterator iter2) {
Expand Down Expand Up @@ -325,8 +321,7 @@ B_bool B_EqOptD___ne__(B_EqOpt wit, $WORD a, $WORD b) {
return (!a && !b) ? B_False : B_True;
}

struct B_EqOptG_class B_EqOptG_methods = {"B_EqOpt", UNASSIGNED, NULL, B_EqOptD___init__, B_EqOptD___eq__, B_EqOptD___ne__};

struct B_EqOptG_class B_EqOptG_methods = {0,"B_EqOpt", UNASSIGNED, NULL, B_EqOptD___init__, B_EqOptD___eq__, B_EqOptD___ne__};

B_EqOpt B_EqOptG_new(B_Eq W_Eq$A) {
return $NEW(B_EqOpt, W_Eq$A);
Expand Down
20 changes: 15 additions & 5 deletions builtin/builtin_functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ struct B_IteratorD_enumerate;
typedef struct B_IteratorD_enumerate *B_IteratorD_enumerate;

struct B_IteratorD_enumerateG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass;
void (*__init__)(B_IteratorD_enumerate, B_Iterator,B_int);
Expand All @@ -25,6 +26,7 @@ struct B_IteratorD_enumerate {
B_Iterator it;
int nxt;
};
extern GC_word B_IteratorD_enumerateD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_enumerate)];

extern struct B_IteratorD_enumerateG_class B_IteratorD_enumerateG_methods;
B_IteratorD_enumerate B_IteratorD_enumerateG_new(B_Iterator,B_int);
Expand All @@ -38,7 +40,8 @@ struct B_IteratorD_filter;
typedef struct B_IteratorD_filter *B_IteratorD_filter;

struct B_IteratorD_filterG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass;
void (*__init__)(B_IteratorD_filter, B_Iterator, $pure);
Expand All @@ -55,6 +58,7 @@ struct B_IteratorD_filter {
B_Iterator it;
$pure f;
};
extern GC_word B_IteratorD_filterD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_filter)];

extern struct B_IteratorD_filterG_class B_IteratorD_filterG_methods;
B_IteratorD_filter B_IteratorD_filterG_new(B_Iterator, $pure);
Expand All @@ -67,7 +71,8 @@ struct B_IteratorD_map;
typedef struct B_IteratorD_map *B_IteratorD_map;

struct B_IteratorD_mapG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass;
void (*__init__)(B_IteratorD_map, B_Iterator, $pure);
Expand All @@ -84,6 +89,7 @@ struct B_IteratorD_map {
B_Iterator it;
$pure f;
};
extern GC_word B_IteratorD_mapD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_map)];

extern struct B_IteratorD_mapG_class B_IteratorD_mapG_methods;
B_IteratorD_map B_IteratorD_mapG_new(B_Iterator, $pure);
Expand All @@ -94,7 +100,8 @@ struct B_IteratorD_zip;
typedef struct B_IteratorD_zip *B_IteratorD_zip;

struct B_IteratorD_zipG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass;
void (*__init__)(B_IteratorD_zip, B_Iterator, B_Iterator);
Expand All @@ -111,6 +118,7 @@ struct B_IteratorD_zip {
B_Iterator it1;
B_Iterator it2;
};
extern GC_word B_IteratorD_zipD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_zip)];

extern struct B_IteratorD_zipG_class B_IteratorD_zipG_methods;
B_IteratorD_zip B_IteratorD_zipG_new(B_Iterator, B_Iterator);
Expand All @@ -124,7 +132,8 @@ struct B_EqOpt;
typedef struct B_EqOpt *B_EqOpt;

struct B_EqOptG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass;
void (*__init__)(B_EqOpt, B_Eq);
Expand All @@ -136,6 +145,7 @@ struct B_EqOpt {
struct B_EqOptG_class *$class;
B_Eq W_Eq$A;
};
extern GC_word B_EqOptD_gcbm[GC_BITMAP_SIZE(struct B_EqOpt)];

B_EqOpt B_EqOptG_new(B_Eq);

Expand Down
7 changes: 3 additions & 4 deletions builtin/class_hierarchy.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ B_NoneType B_objectD___init__ (B_object self) {
*/
B_str B_valueD___str__(B_value self) {
char *s;
asprintf(&s,"<%s object at %p>",self->$class->$GCINFO,self);
asprintf(&s,"<%s object at %p>",self->$class->$name,self);
return to$str(s);
}

B_str B_objectD___str__(B_object self) {
char *s;
asprintf(&s,"<%s object at %p>",self->$class->$GCINFO,self);
asprintf(&s,"<%s object at %p>",self->$class->$name,self);
return to$str(s);
}

Expand All @@ -55,8 +55,7 @@ B_bool B_objectD___bool__(B_object self) {
return B_True;
}

struct $SerializableG_class $SerializableG_methods = {"$Serializable",UNASSIGNED,NULL, $SerializableD___init__,NULL,NULL};

struct $SerializableG_class $SerializableG_methods = {0,"$Serializable",UNASSIGNED,NULL, $SerializableD___init__,NULL,NULL};
//struct B_valueG_class B_valueG_methods = {"B_value",UNASSIGNED,($SuperG_class)&$SerializableG_methods,B_valueD___init__,NULL,NULL, B_valueD___bool__,B_valueD___str__,B_valueD___str__};

//struct B_objectG_class B_objectG_methods = {"B_object",UNASSIGNED,($SuperG_class)&B_valueG_methods,B_objectD___init__,NULL,NULL,B_objectD___bool__,B_objectD___str__,B_objectD___str__};
12 changes: 9 additions & 3 deletions builtin/class_hierarchy.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,25 @@


struct $SuperG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass;
};

struct $Super {
$SuperG_class $class;
};
extern GC_word $SuperD_gcbm[GC_BITMAP_SIZE(struct $Super)];

/*
typedef struct $InitializableG_class *$InitializableG_class;
typedef struct $Initializable *$Initializable;
struct $InitializableG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass; // = NULL
B_NoneType (*__init__)($Initializable);
Expand All @@ -28,6 +31,7 @@ struct $InitializableG_class {
struct $Initializable {
struct $InitializableG_class *$class;
};
extern GC_word $InitializableD_gcbm[GC_BITMAP_SIZE(struct $Initializable)];
extern struct $InitializableG_class $InitializableG_methods;
$Initializable $InitializableG_new();
Expand All @@ -36,7 +40,8 @@ extern struct $InitializableG_class $InitializableG_methods;
// Serializable //////////////////////////////////////////////////////

struct $SerializableG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass; // = InitializableG_methods
B_NoneType (*__init__)($Serializable);
Expand All @@ -47,6 +52,7 @@ struct $SerializableG_class {
struct $Serializable {
struct $SerializableG_class *$class;
};
extern GC_word $SerializableD_gcbm[GC_BITMAP_SIZE(struct $Serializable)];

extern struct $SerializableG_class $SerializableG_methods;
$Serializable $SerializableG_new();
Expand Down
5 changes: 5 additions & 0 deletions builtin/complex.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ struct B_EqD_complex B_EqD_complex_instance;
struct B_HashableD_complex B_HashableD_complex_instance;
struct B_NumberD_complexG_class B_NumberD_complexG_methods = {
0,
"B_NumberD_complex",
UNASSIGNED,
($SuperG_class)&B_NumberG_methods,
Expand Down Expand Up @@ -213,6 +214,7 @@ struct B_NumberD_complex B_NumberD_complex_instance = {&B_NumberD_complexG_metho
B_NumberD_complex B_NumberD_complexG_witness = &B_NumberD_complex_instance;
struct B_DivD_complexG_class B_DivD_complexG_methods = {
0,
"B_DivD_complex",
UNASSIGNED,
($SuperG_class)&B_DivG_methods,
Expand All @@ -230,6 +232,7 @@ struct B_DivD_complex B_DivD_complex_instance = {&B_DivD_complexG_methods};
B_DivD_complex B_DivD_complexG_witness = &B_DivD_complex_instance;
struct B_MinusD_NumberD_complexG_class B_MinusD_NumberD_complexG_methods = {
0,
"B_MinusD_NumberD_complex",
UNASSIGNED,
($SuperG_class)&B_MinusG_methods,
Expand All @@ -246,6 +249,7 @@ struct B_MinusD_NumberD_complex B_MinusD_NumberD_complex_instance = {&B_MinusD_N
B_MinusD_NumberD_complex B_MinusD_NumberD_complexG_witness = &B_MinusD_NumberD_complex_instance;
struct B_EqD_complexG_class B_EqD_complexG_methods = {
0,
"B_EqD_complex",
UNASSIGNED,
($SuperG_class)&B_EqG_methods,
Expand All @@ -262,6 +266,7 @@ struct B_EqD_complex B_EqD_complex_instance = {&B_EqD_complexG_methods};
B_EqD_complex B_EqD_complexG_witness = &B_EqD_complex_instance;
struct B_HashableD_complexG_class B_HashableD_complexG_methods = {
0,
"B_HashableD_complex",
UNASSIGNED,
($SuperG_class)&B_HashableG_methods,
Expand Down
1 change: 1 addition & 0 deletions builtin/complx.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ struct B_complex {
struct B_complexG_class *$class;
complex double val;
};
extern GC_word B_complexD_gcbm[GC_BITMAP_SIZE(struct B_complex)];

B_complex toB_complex(complex double c);

11 changes: 5 additions & 6 deletions builtin/dict.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,8 +394,7 @@ B_IteratorD_dict B_IteratorD_dict__deserialize(B_IteratorD_dict res, $Serial$sta
}


struct B_IteratorD_dictG_class B_IteratorD_dictG_methods = {"B_IteratorD_dict",UNASSIGNED,($SuperG_class)&B_IteratorG_methods, B_IteratorD_dictD_init,
B_IteratorD_dictD_serialize, B_IteratorD_dict__deserialize, B_IteratorD_dictD_bool,B_IteratorD_dictD_str,B_IteratorD_dictD_str, B_IteratorD_dictD_next};
struct B_IteratorD_dictG_class B_IteratorD_dictG_methods = {0,"B_IteratorD_dict",UNASSIGNED,($SuperG_class)&B_IteratorG_methods, B_IteratorD_dictD_init, B_IteratorD_dictD_serialize, B_IteratorD_dict__deserialize, B_IteratorD_dictD_bool,B_IteratorD_dictD_str,B_IteratorD_dictD_str, B_IteratorD_dictD_next};


B_Iterator B_MappingD_dictD___iter__ (B_MappingD_dict wit, B_dict dict) {
Expand Down Expand Up @@ -500,8 +499,7 @@ B_IteratorD_dict_values B_IteratorD_dict_values_deserialize(B_IteratorD_dict_val
return res;
}

struct B_IteratorD_dict_valuesG_class B_IteratorD_dict_valuesG_methods = {"B_IteratorD_dict_values",UNASSIGNED,($SuperG_class)&B_IteratorG_methods, B_IteratorD_dict_values_init,
B_IteratorD_dict_values_serialize, B_IteratorD_dict_values_deserialize, B_IteratorD_dict_values_bool, B_IteratorD_dict_values_str,B_IteratorD_dict_values_str,
struct B_IteratorD_dict_valuesG_class B_IteratorD_dict_valuesG_methods = {0,"B_IteratorD_dict_values",UNASSIGNED,($SuperG_class)&B_IteratorG_methods, B_IteratorD_dict_values_init, B_IteratorD_dict_values_serialize, B_IteratorD_dict_values_deserialize, B_IteratorD_dict_values_bool, B_IteratorD_dict_values_str,B_IteratorD_dict_values_str,
B_IteratorD_dict_values_next};

// items iterator
Expand Down Expand Up @@ -556,8 +554,7 @@ B_IteratorD_dict_items B_IteratorD_dict_items_deserialize(B_IteratorD_dict_items



struct B_IteratorD_dict_itemsG_class B_IteratorD_dict_itemsG_methods = {"B_IteratorD_dict_items",UNASSIGNED,($SuperG_class)&B_IteratorG_methods, B_IteratorD_dict_items_init,
B_IteratorD_dict_items_serialize, B_IteratorD_dict_items_deserialize,B_IteratorD_dict_items_bool, B_IteratorD_dict_items_str, B_IteratorD_dict_items_str, B_IteratorD_dict_items_next};
struct B_IteratorD_dict_itemsG_class B_IteratorD_dict_itemsG_methods = {0,"B_IteratorD_dict_items",UNASSIGNED,($SuperG_class)&B_IteratorG_methods, B_IteratorD_dict_items_init, B_IteratorD_dict_items_serialize, B_IteratorD_dict_items_deserialize,B_IteratorD_dict_items_bool, B_IteratorD_dict_items_str, B_IteratorD_dict_items_str, B_IteratorD_dict_items_next};


B_Iterator B_MappingD_dictD_values (B_MappingD_dict wit, B_dict dict) {
Expand Down Expand Up @@ -704,6 +701,7 @@ struct B_MappingD_dictG_class B_MappingD_dictG_methods = {
};
struct B_IndexedD_MappingD_dictG_class B_IndexedD_MappingD_dictG_methods = {
0,
"B_IndexedD_MappingD_dict",
UNASSIGNED,
($SuperG_class)&B_IndexedG_methods,
Expand All @@ -720,6 +718,7 @@ struct B_IndexedD_MappingD_dictG_class B_IndexedD_MappingD_dictG_methods = {
struct B_OrdD_dictG_class B_OrdD_dictG_methods = {
0,
"B_OrdD_dict",
UNASSIGNED,
($SuperG_class)&B_OrdG_methods,
Expand Down
13 changes: 10 additions & 3 deletions builtin/dict.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ struct B_dict {
long numelements; // nr of elements in dictionary
$table table; // the hashtable
};
extern GC_word B_dictD_gcbm[GC_BITMAP_SIZE(struct B_dict)];

// Iterators over dicts ///////////////////////////////////////////////////////

Expand All @@ -13,7 +14,8 @@ struct B_dict {
typedef struct B_IteratorD_dict *B_IteratorD_dict;

struct B_IteratorD_dictG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass;
void (*__init__)(B_IteratorD_dict, B_dict);
Expand All @@ -30,6 +32,7 @@ struct B_IteratorD_dict {
B_dict src;
int nxt;
};
extern GC_word B_IteratorD_dictD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_dict)];

extern struct B_IteratorD_dictG_class B_IteratorD_dictG_methods;
B_IteratorD_dict B_IteratorD_dictG_new(B_dict);
Expand All @@ -39,7 +42,8 @@ B_IteratorD_dict B_IteratorD_dictG_new(B_dict);
typedef struct B_IteratorD_dict_values *B_IteratorD_dict_values;

struct B_IteratorD_dict_valuesG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass;
void (*__init__)(B_IteratorD_dict_values, B_dict);
Expand All @@ -56,6 +60,7 @@ struct B_IteratorD_dict_values {
B_dict src;
int nxt;
};
extern GC_word B_IteratorD_dict_valuesD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_dict_values)];

extern struct B_IteratorD_dict_valuesG_class B_IteratorD_dict_valuesG_methods;
B_IteratorD_dict_values B_IteratorD_dict_valuesG_new(B_dict);
Expand All @@ -65,7 +70,8 @@ B_IteratorD_dict_values B_IteratorD_dict_valuesG_new(B_dict);
typedef struct B_IteratorD_dict_items *B_IteratorD_dict_items;

struct B_IteratorD_dict_itemsG_class {
char *$GCINFO;
GC_descr $GCdescr;
char *$name;
int $class_id;
$SuperG_class $superclass;
void (*__init__)(B_IteratorD_dict_items, B_dict);
Expand All @@ -82,6 +88,7 @@ struct B_IteratorD_dict_items {
B_dict src;
int nxt;
};
extern GC_word B_IteratorD_dict_itemsD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_dict_items)];

extern struct B_IteratorD_dict_itemsG_class B_IteratorD_dict_itemsG_methods;
B_IteratorD_dict_items B_IteratorD_dict_itemsG_new(B_dict);
Expand Down
Loading

0 comments on commit 444f048

Please sign in to comment.