Skip to content

Commit 444f048

Browse files
committed
Add GC descriptors for builtin etc
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.
1 parent 78ba866 commit 444f048

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1758
-741
lines changed

builtin/__builtin__.c

Lines changed: 896 additions & 418 deletions
Large diffs are not rendered by default.

builtin/__builtin__.h

Lines changed: 460 additions & 159 deletions
Large diffs are not rendered by default.

builtin/atom.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414

1515
struct B_atomG_class B_atomG_methods = {
16+
0,
1617
"B_atom",
1718
UNASSIGNED,
1819
($SuperG_class)&B_valueG_methods

builtin/bool.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ struct B_bool {
22
struct B_boolG_class *$class;
33
long val;
44
};
5+
extern GC_word B_boolD_gcbm[GC_BITMAP_SIZE(struct B_bool)];
56

67
B_bool toB_bool(long b);
78
long fromB_bool(B_bool b);

builtin/builtin_functions.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,7 @@ B_IteratorD_enumerate B_IteratorD_enumerate$_deserialize(B_IteratorD_enumerate r
9191
return NULL;
9292
}
9393

94-
struct B_IteratorD_enumerateG_class B_IteratorD_enumerateG_methods = {"B_IteratorD_enumerate",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_enumerate_init,
95-
B_IteratorD_enumerate_serialize, B_IteratorD_enumerate$_deserialize,
94+
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,
9695
B_IteratorD_enumerate_bool,B_IteratorD_enumerate_str,B_IteratorD_enumerate_str, B_IteratorD_enumerate_next};
9796

9897

@@ -143,8 +142,7 @@ B_IteratorD_filter B_IteratorD_filter$_deserialize(B_IteratorD_filter res, $Seri
143142
return w;
144143
}
145144

146-
struct B_IteratorD_filterG_class B_IteratorD_filterG_methods = {"B_IteratorD_filter",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_filter_init,
147-
B_IteratorD_filter_serialize, B_IteratorD_filter$_deserialize,
145+
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,
148146
B_IteratorD_filter_bool,B_IteratorD_filter_str,B_IteratorD_filter_str, B_IteratorD_filter_next};
149147

150148
B_IteratorD_filter B_IteratorD_filterG_new(B_Iterator it, $pure f) {
@@ -192,8 +190,7 @@ B_IteratorD_map B_IteratorD_map$_deserialize(B_IteratorD_map res, $Serial$state
192190
return NULL;
193191
}
194192

195-
struct B_IteratorD_mapG_class B_IteratorD_mapG_methods = {"B_IteratorD_map",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_map_init,
196-
B_IteratorD_map_serialize, B_IteratorD_map$_deserialize,
193+
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,
197194
B_IteratorD_map_bool,B_IteratorD_map_str,B_IteratorD_map_str, B_IteratorD_map_next};
198195

199196
B_IteratorD_map B_IteratorD_mapG_new(B_Iterator it, $pure f) {
@@ -293,8 +290,7 @@ B_IteratorD_zip B_IteratorD_zip$_deserialize(B_IteratorD_zip res, $Serial$state
293290
return NULL;
294291
}
295292

296-
struct B_IteratorD_zipG_class B_IteratorD_zipG_methods = {" B_IteratorD_zip",UNASSIGNED,($SuperG_class)&B_IteratorG_methods,B_IteratorD_zip_init,
297-
B_IteratorD_zip_serialize, B_IteratorD_zip$_deserialize,
293+
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,
298294
B_IteratorD_zip_bool,B_IteratorD_zip_str,B_IteratorD_zip_str, B_IteratorD_zip_next};
299295

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

328-
struct B_EqOptG_class B_EqOptG_methods = {"B_EqOpt", UNASSIGNED, NULL, B_EqOptD___init__, B_EqOptD___eq__, B_EqOptD___ne__};
329-
324+
struct B_EqOptG_class B_EqOptG_methods = {0,"B_EqOpt", UNASSIGNED, NULL, B_EqOptD___init__, B_EqOptD___eq__, B_EqOptD___ne__};
330325

331326
B_EqOpt B_EqOptG_new(B_Eq W_Eq$A) {
332327
return $NEW(B_EqOpt, W_Eq$A);

builtin/builtin_functions.h

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ struct B_IteratorD_enumerate;
88
typedef struct B_IteratorD_enumerate *B_IteratorD_enumerate;
99

1010
struct B_IteratorD_enumerateG_class {
11-
char *$GCINFO;
11+
GC_descr $GCdescr;
12+
char *$name;
1213
int $class_id;
1314
$SuperG_class $superclass;
1415
void (*__init__)(B_IteratorD_enumerate, B_Iterator,B_int);
@@ -25,6 +26,7 @@ struct B_IteratorD_enumerate {
2526
B_Iterator it;
2627
int nxt;
2728
};
29+
extern GC_word B_IteratorD_enumerateD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_enumerate)];
2830

2931
extern struct B_IteratorD_enumerateG_class B_IteratorD_enumerateG_methods;
3032
B_IteratorD_enumerate B_IteratorD_enumerateG_new(B_Iterator,B_int);
@@ -38,7 +40,8 @@ struct B_IteratorD_filter;
3840
typedef struct B_IteratorD_filter *B_IteratorD_filter;
3941

4042
struct B_IteratorD_filterG_class {
41-
char *$GCINFO;
43+
GC_descr $GCdescr;
44+
char *$name;
4245
int $class_id;
4346
$SuperG_class $superclass;
4447
void (*__init__)(B_IteratorD_filter, B_Iterator, $pure);
@@ -55,6 +58,7 @@ struct B_IteratorD_filter {
5558
B_Iterator it;
5659
$pure f;
5760
};
61+
extern GC_word B_IteratorD_filterD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_filter)];
5862

5963
extern struct B_IteratorD_filterG_class B_IteratorD_filterG_methods;
6064
B_IteratorD_filter B_IteratorD_filterG_new(B_Iterator, $pure);
@@ -67,7 +71,8 @@ struct B_IteratorD_map;
6771
typedef struct B_IteratorD_map *B_IteratorD_map;
6872

6973
struct B_IteratorD_mapG_class {
70-
char *$GCINFO;
74+
GC_descr $GCdescr;
75+
char *$name;
7176
int $class_id;
7277
$SuperG_class $superclass;
7378
void (*__init__)(B_IteratorD_map, B_Iterator, $pure);
@@ -84,6 +89,7 @@ struct B_IteratorD_map {
8489
B_Iterator it;
8590
$pure f;
8691
};
92+
extern GC_word B_IteratorD_mapD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_map)];
8793

8894
extern struct B_IteratorD_mapG_class B_IteratorD_mapG_methods;
8995
B_IteratorD_map B_IteratorD_mapG_new(B_Iterator, $pure);
@@ -94,7 +100,8 @@ struct B_IteratorD_zip;
94100
typedef struct B_IteratorD_zip *B_IteratorD_zip;
95101

96102
struct B_IteratorD_zipG_class {
97-
char *$GCINFO;
103+
GC_descr $GCdescr;
104+
char *$name;
98105
int $class_id;
99106
$SuperG_class $superclass;
100107
void (*__init__)(B_IteratorD_zip, B_Iterator, B_Iterator);
@@ -111,6 +118,7 @@ struct B_IteratorD_zip {
111118
B_Iterator it1;
112119
B_Iterator it2;
113120
};
121+
extern GC_word B_IteratorD_zipD_gcbm[GC_BITMAP_SIZE(struct B_IteratorD_zip)];
114122

115123
extern struct B_IteratorD_zipG_class B_IteratorD_zipG_methods;
116124
B_IteratorD_zip B_IteratorD_zipG_new(B_Iterator, B_Iterator);
@@ -124,7 +132,8 @@ struct B_EqOpt;
124132
typedef struct B_EqOpt *B_EqOpt;
125133

126134
struct B_EqOptG_class {
127-
char *$GCINFO;
135+
GC_descr $GCdescr;
136+
char *$name;
128137
int $class_id;
129138
$SuperG_class $superclass;
130139
void (*__init__)(B_EqOpt, B_Eq);
@@ -136,6 +145,7 @@ struct B_EqOpt {
136145
struct B_EqOptG_class *$class;
137146
B_Eq W_Eq$A;
138147
};
148+
extern GC_word B_EqOptD_gcbm[GC_BITMAP_SIZE(struct B_EqOpt)];
139149

140150
B_EqOpt B_EqOptG_new(B_Eq);
141151

builtin/class_hierarchy.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ B_NoneType B_objectD___init__ (B_object self) {
3838
*/
3939
B_str B_valueD___str__(B_value self) {
4040
char *s;
41-
asprintf(&s,"<%s object at %p>",self->$class->$GCINFO,self);
41+
asprintf(&s,"<%s object at %p>",self->$class->$name,self);
4242
return to$str(s);
4343
}
4444

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

@@ -55,8 +55,7 @@ B_bool B_objectD___bool__(B_object self) {
5555
return B_True;
5656
}
5757

58-
struct $SerializableG_class $SerializableG_methods = {"$Serializable",UNASSIGNED,NULL, $SerializableD___init__,NULL,NULL};
59-
58+
struct $SerializableG_class $SerializableG_methods = {0,"$Serializable",UNASSIGNED,NULL, $SerializableD___init__,NULL,NULL};
6059
//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__};
6160

6261
//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__};

builtin/class_hierarchy.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,25 @@
44

55

66
struct $SuperG_class {
7-
char *$GCINFO;
7+
GC_descr $GCdescr;
8+
char *$name;
89
int $class_id;
910
$SuperG_class $superclass;
1011
};
1112

1213
struct $Super {
1314
$SuperG_class $class;
1415
};
16+
extern GC_word $SuperD_gcbm[GC_BITMAP_SIZE(struct $Super)];
1517

1618
/*
1719
typedef struct $InitializableG_class *$InitializableG_class;
1820
1921
typedef struct $Initializable *$Initializable;
2022
2123
struct $InitializableG_class {
22-
char *$GCINFO;
24+
GC_descr $GCdescr;
25+
char *$name;
2326
int $class_id;
2427
$SuperG_class $superclass; // = NULL
2528
B_NoneType (*__init__)($Initializable);
@@ -28,6 +31,7 @@ struct $InitializableG_class {
2831
struct $Initializable {
2932
struct $InitializableG_class *$class;
3033
};
34+
extern GC_word $InitializableD_gcbm[GC_BITMAP_SIZE(struct $Initializable)];
3135
3236
extern struct $InitializableG_class $InitializableG_methods;
3337
$Initializable $InitializableG_new();
@@ -36,7 +40,8 @@ extern struct $InitializableG_class $InitializableG_methods;
3640
// Serializable //////////////////////////////////////////////////////
3741

3842
struct $SerializableG_class {
39-
char *$GCINFO;
43+
GC_descr $GCdescr;
44+
char *$name;
4045
int $class_id;
4146
$SuperG_class $superclass; // = InitializableG_methods
4247
B_NoneType (*__init__)($Serializable);
@@ -47,6 +52,7 @@ struct $SerializableG_class {
4752
struct $Serializable {
4853
struct $SerializableG_class *$class;
4954
};
55+
extern GC_word $SerializableD_gcbm[GC_BITMAP_SIZE(struct $Serializable)];
5056

5157
extern struct $SerializableG_class $SerializableG_methods;
5258
$Serializable $SerializableG_new();

builtin/complex.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ struct B_EqD_complex B_EqD_complex_instance;
185185
struct B_HashableD_complex B_HashableD_complex_instance;
186186
187187
struct B_NumberD_complexG_class B_NumberD_complexG_methods = {
188+
0,
188189
"B_NumberD_complex",
189190
UNASSIGNED,
190191
($SuperG_class)&B_NumberG_methods,
@@ -213,6 +214,7 @@ struct B_NumberD_complex B_NumberD_complex_instance = {&B_NumberD_complexG_metho
213214
B_NumberD_complex B_NumberD_complexG_witness = &B_NumberD_complex_instance;
214215
215216
struct B_DivD_complexG_class B_DivD_complexG_methods = {
217+
0,
216218
"B_DivD_complex",
217219
UNASSIGNED,
218220
($SuperG_class)&B_DivG_methods,
@@ -230,6 +232,7 @@ struct B_DivD_complex B_DivD_complex_instance = {&B_DivD_complexG_methods};
230232
B_DivD_complex B_DivD_complexG_witness = &B_DivD_complex_instance;
231233
232234
struct B_MinusD_NumberD_complexG_class B_MinusD_NumberD_complexG_methods = {
235+
0,
233236
"B_MinusD_NumberD_complex",
234237
UNASSIGNED,
235238
($SuperG_class)&B_MinusG_methods,
@@ -246,6 +249,7 @@ struct B_MinusD_NumberD_complex B_MinusD_NumberD_complex_instance = {&B_MinusD_N
246249
B_MinusD_NumberD_complex B_MinusD_NumberD_complexG_witness = &B_MinusD_NumberD_complex_instance;
247250
248251
struct B_EqD_complexG_class B_EqD_complexG_methods = {
252+
0,
249253
"B_EqD_complex",
250254
UNASSIGNED,
251255
($SuperG_class)&B_EqG_methods,
@@ -262,6 +266,7 @@ struct B_EqD_complex B_EqD_complex_instance = {&B_EqD_complexG_methods};
262266
B_EqD_complex B_EqD_complexG_witness = &B_EqD_complex_instance;
263267
264268
struct B_HashableD_complexG_class B_HashableD_complexG_methods = {
269+
0,
265270
"B_HashableD_complex",
266271
UNASSIGNED,
267272
($SuperG_class)&B_HashableG_methods,

builtin/complx.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ struct B_complex {
99
struct B_complexG_class *$class;
1010
complex double val;
1111
};
12+
extern GC_word B_complexD_gcbm[GC_BITMAP_SIZE(struct B_complex)];
1213

1314
B_complex toB_complex(complex double c);
1415

0 commit comments

Comments
 (0)