shithub: sl

Download patch

ref: c2ad1dcfbbb721224c5c90a17baa5e88d87af867
parent: 21446b0c5aa586e198df778762f61b322f308f96
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Apr 29 21:05:11 EDT 2025

another round of renaming

--- a/src/builtins.c
+++ b/src/builtins.c
@@ -193,7 +193,7 @@
 	sl_gc_handle(&lst);
 	const char *k = nil;
 	sl_sym *v;
-	while(Tnext(slg.symbols, &k, (void**)&v)){
+	while(Tnext(slvm.symbols, &k, (void**)&v)){
 		if(v->binding != sl_unbound && (v->flags & FLAG_KEYWORD) == 0)
 			lst = mk_cons(tagptr(v, TAG_SYM), lst);
 	}
--- a/src/cvalues.c
+++ b/src/cvalues.c
@@ -24,12 +24,12 @@
 void
 add_finalizer(sl_cv *cv)
 {
-	if(slg.nfinalizers == slg.maxfinalizers){
-		slg.maxfinalizers *= 2;
-		slg.finalizers = MEM_REALLOC(slg.finalizers, slg.maxfinalizers*sizeof(slg.finalizers));
-		assert(slg.finalizers != nil);
+	if(slvm.nfinalizers == slvm.maxfinalizers){
+		slvm.maxfinalizers *= 2;
+		slvm.finalizers = MEM_REALLOC(slvm.finalizers, slvm.maxfinalizers*sizeof(slvm.finalizers));
+		assert(slvm.finalizers != nil);
 	}
-	slg.finalizers[slg.nfinalizers++] = cv;
+	slvm.finalizers[slvm.nfinalizers++] = cv;
 }
 
 void
@@ -48,8 +48,8 @@
 void
 sweep_finalizers(void)
 {
-	sl_cv **lst = slg.finalizers;
-	usize n = 0, ndel = 0, l = slg.nfinalizers;
+	sl_cv **lst = slvm.finalizers;
+	usize n = 0, ndel = 0, l = slvm.nfinalizers;
 	sl_cv *tmp;
 #define SWAP_sf(a, b) (tmp = a, a = b, b = tmp, 1)
 	if(l == 0)
@@ -66,8 +66,8 @@
 		}
 	}while((n < l-ndel) && SWAP_sf(lst[n], lst[n+ndel]));
 
-	slg.nfinalizers -= ndel;
-	slg.malloc_pressure = 0;
+	slvm.nfinalizers -= ndel;
+	slvm.malloc_pressure = 0;
 }
 
 // compute the size of the metadata object for a cvalue
@@ -110,13 +110,13 @@
 		if(!nofinalize && type->vtable != nil && type->vtable->finalize != nil)
 			add_finalizer(pcv);
 	}else{
-		if(slg.malloc_pressure > ALLOC_LIMIT_TRIGGER)
+		if(slvm.malloc_pressure > ALLOC_LIMIT_TRIGGER)
 			sl_gc(false);
 		pcv = alloc_words(CVALUE_NWORDS);
 		pcv->type = type;
 		pcv->data = MEM_ALLOC(sz);
 		cv_autorelease(pcv);
-		slg.malloc_pressure += sz;
+		slvm.malloc_pressure += sz;
 	}
 	if(str)
 		((char*)pcv->data)[--sz] = '\0';
@@ -910,7 +910,7 @@
 	sl_v sym = mk_sym(name, false);
 	sl_sym *s = ptr(sym);
 	s->binding = tagptr(cv, TAG_CVALUE);
-	ptrhash_put(&slg.reverse_dlsym_lookup, cv, (void*)sym);
+	ptrhash_put(&slvm.reverse_dlsym_lookup, cv, (void*)sym);
 
 	return s->binding;
 }
@@ -1444,8 +1444,8 @@
 void
 cvalues_init(void)
 {
-	htable_new(&slg.types, 256);
-	htable_new(&slg.reverse_dlsym_lookup, 256);
+	htable_new(&slvm.types, 256);
+	htable_new(&slvm.reverse_dlsym_lookup, 256);
 
 	ctor_cv_intern(rune, NONNUMERIC, u32int);
 	sl_sym *sym = ptr(sl_runesym);
--- a/src/opcodes.c
+++ b/src/opcodes.c
@@ -1,6 +1,6 @@
 #include "sl.h"
 
-const Builtin builtins[N_OPCODES] = {
+const sl_builtin builtins[N_OPCODES] = {
 	[OP_BUILTINP] = {"builtin?", 1},
 	[OP_FIXNUMP] = {"fixnum?", 1},
 	[OP_COMPARE] = {"compare", 2},
--- a/src/opcodes.h
+++ b/src/opcodes.h
@@ -90,4 +90,4 @@
 	N_OPCODES
 }sl_op;
 
-extern const Builtin builtins[N_OPCODES];
+extern const sl_builtin builtins[N_OPCODES];
--- a/src/print.c
+++ b/src/print.c
@@ -885,7 +885,7 @@
 	sl_v label;
 
 	if(cv_class(cv) == sl_builtintype){
-		label = (sl_v)ptrhash_get(&slg.reverse_dlsym_lookup, cv);
+		label = (sl_v)ptrhash_get(&slvm.reverse_dlsym_lookup, cv);
 		assert(label != (sl_v)HT_NOTFOUND);
 		if(sl.print_princ){
 			outs(f, sym_name(label));
@@ -934,7 +934,7 @@
 	sl_print_child(f, v);
 
 	if(sl.print_level >= 0 || sl.print_length >= 0)
-		memset(sl.consflags, 0, 4*bitvector_nwords(slg.heapsize/sizeof(sl_cons)));
+		memset(sl.consflags, 0, 4*bitvector_nwords(slvm.heapsize/sizeof(sl_cons)));
 
 	if((iscons(v) || isvec(v) || isfn(v) || iscvalue(v)) && !isstr(v))
 		htable_reset(&sl.printconses, 32);
--- a/src/sl.c
+++ b/src/sl.c
@@ -38,8 +38,8 @@
 sl_type *sl_utf8type, *sl_runetype;
 sl_type *sl_strtype;
 
-sl_thread(Sl *slp);
-Slg slg = {0};
+sl_thread(sl_proc *slp);
+sl_vm slvm_ = {0};
 
 typedef struct {
 	const char *name;
@@ -67,8 +67,8 @@
 _Noreturn void
 sl_exit(const char *status)
 {
-	if(!slg.exiting){
-		slg.exiting = true;
+	if(!slvm.exiting){
+		slvm.exiting = true;
 		sl_applyn(
 			1,
 			sym_value(mk_sym("__finish", false)),
@@ -83,7 +83,7 @@
 	sl_exctx _ctx; int l__tr, l__ca; \
 	_ctx.osp = sl.sp - sl.stack; _ctx.frame = sl.curr_frame; \
 	_ctx.rdst = sl.readstate; _ctx.prev = sl.exctx; \
-	_ctx.ngchnd = slg.ngchandles; sl.exctx = &_ctx; \
+	_ctx.ngchnd = slvm.ngchandles; sl.exctx = &_ctx; \
 	if(!sl_setjmp(_ctx.buf)) \
 		for(l__tr = 1; l__tr; l__tr = 0, (void)(sl.exctx = sl.exctx->prev))
 
@@ -106,7 +106,7 @@
 	_ctx->frame = sl.curr_frame;
 	_ctx->rdst = sl.readstate;
 	_ctx->prev = sl.exctx;
-	_ctx->ngchnd = slg.ngchandles;
+	_ctx->ngchnd = slvm.ngchandles;
 }
 
 void
@@ -144,7 +144,7 @@
 	}
 	if(sl.throwing_frame == 0)
 		sl.throwing_frame = sl.curr_frame;
-	slg.ngchandles = sl.exctx->ngchnd;
+	slvm.ngchandles = sl.exctx->ngchnd;
 	sl_exctx *thisctx = sl.exctx;
 	if(sl.exctx->prev)   // don't throw past toplevel
 		sl.exctx = sl.exctx->prev;
@@ -247,9 +247,9 @@
 	int len = strlen(str);
 	sl_sym *v;
 	const char *k;
-	if(!Tgetkv(slg.symbols, str, len, &k, (void**)&v)){
+	if(!Tgetkv(slvm.symbols, str, len, &k, (void**)&v)){
 		v = alloc_sym(str, len, copy);
-		slg.symbols = Tsetl(slg.symbols, v->name, len, v);
+		slvm.symbols = Tsetl(slvm.symbols, v->name, len, v);
 	}
 	if(v->binding == sl_lambda)
 		return sl_lambda;
@@ -260,7 +260,7 @@
 mk_csym_(const char *str, int len)
 {
 	sl_sym *v = alloc_sym(str, len, false);
-	slg.symbols = Tsetl(slg.symbols, str, len, v);
+	slvm.symbols = Tsetl(slvm.symbols, str, len, v);
 	return tagptr(v, TAG_SYM);
 }
 
@@ -269,7 +269,7 @@
 	argcount(nargs, 0);
 	USED(args);
 	sl_gensym *gs = alloc_words(sizeof(sl_gensym)/sizeof(sl_v));
-	gs->id = slg.gensym_ctr++;
+	gs->id = slvm.gensym_ctr++;
 	gs->binding = sl_unbound;
 	gs->type = nil;
 	return tagptr(gs, TAG_SYM);
@@ -314,8 +314,8 @@
 {
 	if(ismanaged(v)){
 		sl_gensym *gs = ptr(v);
-		slg.gsnameno = 1-slg.gsnameno;
-		char *n = uint2str(slg.gsname[slg.gsnameno]+1, sizeof(slg.gsname[0])-1, gs->id, 10);
+		slvm.gsnameno = 1-slvm.gsnameno;
+		char *n = uint2str(slvm.gsname[slvm.gsnameno]+1, sizeof(slvm.gsname[0])-1, gs->id, 10);
 		*(--n) = 'g';
 		return n;
 	}
@@ -329,10 +329,10 @@
 {
 	sl_cons *c;
 
-	if(sl_unlikely(slg.curheap > slg.lim))
+	if(sl_unlikely(slvm.curheap > slvm.lim))
 		sl_gc(false);
-	c = (sl_cons*)slg.curheap;
-	slg.curheap += sizeof(sl_cons);
+	c = (sl_cons*)slvm.curheap;
+	slvm.curheap += sizeof(sl_cons);
 	return tagptr(c, TAG_CONS);
 }
 
@@ -345,13 +345,13 @@
 	assert(n > 0);
 	if(n & 1)
 		n++;
-	if(sl_unlikely((sl_v*)slg.curheap > (sl_v*)slg.lim+2-n)){
+	if(sl_unlikely((sl_v*)slvm.curheap > (sl_v*)slvm.lim+2-n)){
 		sl_gc(false);
-		while(sl_unlikely((sl_v*)slg.curheap > (sl_v*)slg.lim+2-n))
+		while(sl_unlikely((sl_v*)slvm.curheap > (sl_v*)slvm.lim+2-n))
 			sl_gc(true);
 	}
-	first = (sl_v*)slg.curheap;
-	slg.curheap += n*sizeof(sl_v);
+	first = (sl_v*)slvm.curheap;
+	slvm.curheap += n*sizeof(sl_v);
 	return first;
 }
 
@@ -387,21 +387,21 @@
 void
 sl_gc_handle(sl_v *pv)
 {
-	if(sl_unlikely(slg.ngchandles == slg.maxgchandles)){
-		sl_v **gh = MEM_REALLOC(slg.gchandles, slg.maxgchandles*2*sizeof(sl_v*));
+	if(sl_unlikely(slvm.ngchandles == slvm.maxgchandles)){
+		sl_v **gh = MEM_REALLOC(slvm.gchandles, slvm.maxgchandles*2*sizeof(sl_v*));
 		if(gh == nil)
 			cthrow(lerrorf(sl_errmem, "out of gc handles"), pv);
-		slg.maxgchandles *= 2;
-		slg.gchandles = gh;
+		slvm.maxgchandles *= 2;
+		slvm.gchandles = gh;
 	}
-	slg.gchandles[slg.ngchandles++] = pv;
+	slvm.gchandles[slvm.ngchandles++] = pv;
 }
 
 void
 sl_free_gc_handles(int n)
 {
-	assert(slg.ngchandles >= n);
-	slg.ngchandles -= n;
+	assert(slvm.ngchandles >= n);
+	slvm.ngchandles -= n;
 }
 
 sl_v
@@ -423,8 +423,8 @@
 				return first;
 			}
 			d = cdr_(v);
-			*pcdr = nc = tagptr((sl_cons*)slg.curheap, TAG_CONS);
-			slg.curheap += sizeof(sl_cons);
+			*pcdr = nc = tagptr((sl_cons*)slvm.curheap, TAG_CONS);
+			slvm.curheap += sizeof(sl_cons);
 			forward(v, nc);
 			car_(nc) = ismanaged(a) ? sl_relocate(a) : a;
 			pcdr = &cdr_(nc);
@@ -440,7 +440,7 @@
 		return forwardloc(v);
 
 	if(t == TAG_CVALUE){
-		if(sl_unlikely(slg.exiting)){
+		if(sl_unlikely(slvm.exiting)){
 			sweep_cv(ptr(v));
 			return sl_nil;
 		}
@@ -503,7 +503,7 @@
 {
 	const char *k = nil;
 	sl_sym *v;
-	while(Tnext(slg.symbols, &k, (void**)&v)){
+	while(Tnext(slvm.symbols, &k, (void**)&v)){
 		if(v->binding != sl_unbound)
 			v->binding = sl_relocate(v->binding);
 	}
@@ -512,9 +512,9 @@
 void
 sl_gc(bool mustgrow)
 {
-	slg.gccalls++;
-	slg.lim = slg.curheap = slg.tospace;
-	slg.lim += slg.heapsize * (slg.grew ? 2 : 1) - sizeof(sl_cons);
+	slvm.gccalls++;
+	slvm.lim = slvm.curheap = slvm.tospace;
+	slvm.lim += slvm.heapsize * (slvm.grew ? 2 : 1) - sizeof(sl_cons);
 
 	usize top, f;
 	if(sl.throwing_frame > sl.curr_frame){
@@ -534,8 +534,8 @@
 		top = f - 3;
 		f = sl.stack[top];
 	}
-	for(int i = 0; i < slg.ngchandles; i++)
-		*slg.gchandles[i] = sl_relocate(*slg.gchandles[i]);
+	for(int i = 0; i < slvm.ngchandles; i++)
+		*slvm.gchandles[i] = sl_relocate(*slvm.gchandles[i]);
 	trace_globals();
 	relocate_typetable();
 	sl_readstate *rs = sl.readstate;
@@ -561,22 +561,22 @@
 
 	sweep_finalizers();
 
-	void *temp = slg.tospace;
-	slg.tospace = slg.fromspace;
-	slg.fromspace = temp;
+	void *temp = slvm.tospace;
+	slvm.tospace = slvm.fromspace;
+	slvm.fromspace = temp;
 
 	// FIXME(sigrid): add some extra to the "used"?
-	sl_segused(slg.fromspace, slg.heapsize, slg.curheap-slg.fromspace);
+	sl_segused(slvm.fromspace, slvm.heapsize, slvm.curheap-slvm.fromspace);
 
 	// if we're using > 80% of the space, resize tospace so we have
 	// more space to fill next time. if we grew tospace last time,
 	// grow the other half of the heap this time to catch up.
-	if(slg.grew || mustgrow || ((intptr)(slg.lim-slg.curheap) < (intptr)slg.heapsize/5)){
-		sl_segfree(slg.tospace, slg.heapsize);
-		slg.tospace = sl_segalloc(slg.heapsize*2);
-		if(sl_unlikely(slg.tospace == nil)){
-			slg.tospace = sl_segalloc(slg.heapsize);
-			if(slg.tospace == nil){
+	if(slvm.grew || mustgrow || ((intptr)(slvm.lim-slvm.curheap) < (intptr)slvm.heapsize/5)){
+		sl_segfree(slvm.tospace, slvm.heapsize);
+		slvm.tospace = sl_segalloc(slvm.heapsize*2);
+		if(sl_unlikely(slvm.tospace == nil)){
+			slvm.tospace = sl_segalloc(slvm.heapsize);
+			if(slvm.tospace == nil){
 				// FIXME(sigrid): lost it entirely. give up?
 				// alternatively, wait and try indefinitely?
 				sysfatal("lost tospace");
@@ -583,16 +583,16 @@
 			}
 			sl_raise(sl_erroom);
 		}
-		if(slg.grew){
-			slg.heapsize *= 2;
-			temp = bitvector_resize(sl.consflags, 0, slg.heapsize/sizeof(sl_cons), 1);
+		if(slvm.grew){
+			slvm.heapsize *= 2;
+			temp = bitvector_resize(sl.consflags, 0, slvm.heapsize/sizeof(sl_cons), 1);
 			if(sl_unlikely(temp == nil))
 				sl_raise(sl_erroom);
 			sl.consflags = (u32int*)temp;
 		}
-		slg.grew = !slg.grew;
+		slvm.grew = !slvm.grew;
 	}
-	if(sl_unlikely((sl_v*)slg.curheap > (sl_v*)slg.lim-2)){
+	if(sl_unlikely((sl_v*)slvm.curheap > (sl_v*)slvm.lim-2)){
 		// all data was live; gc again and grow heap.
 		// but also always leave at least 4 words available, so a closure
 		// can be allocated without an extra check.
@@ -1065,7 +1065,7 @@
 	if(isbuiltin(v))
 		return mk_sym(builtins[uintval(v)].name, false);
 	if(iscbuiltin(v)){
-		v = (sl_v)ptrhash_get(&slg.reverse_dlsym_lookup, ptr(v));
+		v = (sl_v)ptrhash_get(&slvm.reverse_dlsym_lookup, ptr(v));
 		if(v == (sl_v)HT_NOTFOUND)
 			return sl_nil;
 		return v;
@@ -1321,15 +1321,15 @@
 	USED(args);
 	argcount(nargs, 0);
 	ios *io = toio(sym_value(sl_iooutsym));
-	ios_printf(io, "heap total     %10"PRIuPTR" bytes\n", slg.heapsize);
-	ios_printf(io, "heap free      %10"PRIuPTR" bytes\n", (uintptr)(slg.lim-slg.curheap));
-	ios_printf(io, "heap used      %10"PRIuPTR" bytes\n", (uintptr)(slg.curheap-slg.fromspace));
+	ios_printf(io, "heap total     %10"PRIuPTR" bytes\n", slvm.heapsize);
+	ios_printf(io, "heap free      %10"PRIuPTR" bytes\n", (uintptr)(slvm.lim-slvm.curheap));
+	ios_printf(io, "heap used      %10"PRIuPTR" bytes\n", (uintptr)(slvm.curheap-slvm.fromspace));
 	ios_printf(io, "stack          %10"PRIu64" bytes\n", (u64int)sl.nstack*sizeof(sl_v));
-	ios_printf(io, "finalizers     %10"PRIu32"\n", (u32int)slg.nfinalizers);
-	ios_printf(io, "max finalizers %10"PRIu32"\n", (u32int)slg.maxfinalizers);
-	ios_printf(io, "gc handles     %10"PRIu32"\n", (u32int)slg.ngchandles);
-	ios_printf(io, "max gc handles %10"PRIu32"\n", (u32int)slg.maxgchandles);
-	ios_printf(io, "gc calls       %10"PRIu64"\n", (u64int)slg.gccalls);
+	ios_printf(io, "finalizers     %10"PRIu32"\n", (u32int)slvm.nfinalizers);
+	ios_printf(io, "max finalizers %10"PRIu32"\n", (u32int)slvm.maxfinalizers);
+	ios_printf(io, "gc handles     %10"PRIu32"\n", (u32int)slvm.ngchandles);
+	ios_printf(io, "max gc handles %10"PRIu32"\n", (u32int)slvm.maxgchandles);
+	ios_printf(io, "gc calls       %10"PRIu64"\n", (u64int)slvm.gccalls);
 	ios_printf(io, "opcodes        %10d\n", N_OPCODES);
 	return sl_void;
 }
@@ -1351,25 +1351,25 @@
 		return -1;
 	sl.scr_width = 100;
 
-	slg.heapsize = heapsize*sizeof(sl_v);
+	slvm.heapsize = heapsize*sizeof(sl_v);
 
-	if((slg.fromspace = sl_segalloc(slg.heapsize)) == nil){
+	if((slvm.fromspace = sl_segalloc(slvm.heapsize)) == nil){
 failed:
 		MEM_FREE(sl.consflags);
-		MEM_FREE(slg.finalizers);
-		MEM_FREE(slg.gchandles);
+		MEM_FREE(slvm.finalizers);
+		MEM_FREE(slvm.gchandles);
 		MEM_FREE(sl.stack);
-		sl_segfree(slg.fromspace, slg.heapsize);
-		sl_segfree(slg.tospace, slg.heapsize);
+		sl_segfree(slvm.fromspace, slvm.heapsize);
+		sl_segfree(slvm.tospace, slvm.heapsize);
 		htable_free(&sl.printconses);
 		MEM_FREE(slp);
 		return -1;
 	}
 
-	if((slg.tospace = sl_segalloc(slg.heapsize)) == nil)
+	if((slvm.tospace = sl_segalloc(slvm.heapsize)) == nil)
 		goto failed;
-	slg.curheap = slg.fromspace;
-	slg.lim = slg.curheap+slg.heapsize-sizeof(sl_cons);
+	slvm.curheap = slvm.fromspace;
+	slvm.lim = slvm.curheap+slvm.heapsize-sizeof(sl_cons);
 
 	sl.nstack = STACK_SIZE0;
 	if((sl.stack = MEM_ALLOC(sl.nstack*sizeof(sl_v))) == nil)
@@ -1377,14 +1377,14 @@
 	sl.sp = sl.stack;
 	sl.stackend = sl.stack + sl.nstack - 4;
 
-	slg.maxfinalizers = 512;
-	if((slg.finalizers = MEM_ALLOC(slg.maxfinalizers * sizeof(*slg.finalizers))) == nil)
+	slvm.maxfinalizers = 512;
+	if((slvm.finalizers = MEM_ALLOC(slvm.maxfinalizers * sizeof(*slvm.finalizers))) == nil)
 		goto failed;
-	slg.maxgchandles = 16;
-	if((slg.gchandles = MEM_ALLOC(slg.maxgchandles * sizeof(sl_v*))) == nil)
+	slvm.maxgchandles = 16;
+	if((slvm.gchandles = MEM_ALLOC(slvm.maxgchandles * sizeof(sl_v*))) == nil)
 		goto failed;
 
-	if((sl.consflags = bitvector_new(slg.heapsize/sizeof(sl_cons), 1)) == nil)
+	if((sl.consflags = bitvector_new(slvm.heapsize/sizeof(sl_cons), 1)) == nil)
 		goto failed;
 	if((htable_new(&sl.printconses, 32)) == nil)
 		goto failed;
--- a/src/sl.h
+++ b/src/sl.h
@@ -8,8 +8,25 @@
 #include "htable_h.h"
 HTPROT(ptrhash)
 
+typedef struct sl_exctx sl_exctx;
+typedef struct sl_builtin sl_builtin;
+typedef struct sl_cons sl_cons;
+typedef struct sl_cv sl_cv;
+typedef struct sl_cvtable sl_cvtable;
+typedef struct sl_fn sl_fn;
+typedef struct sl_gensym sl_gensym;
+typedef struct sl_readstate sl_readstate;
+typedef struct sl_sym sl_sym;
 typedef struct sl_type sl_type;
 
+typedef struct sl_proc sl_proc;
+typedef struct sl_vm sl_vm;
+
+typedef uintptr sl_v;
+
+typedef void (*cvinitfunc_t)(sl_type *, sl_v, void *);
+typedef sl_v (*builtin_t)(sl_v *, int);
+
 enum {
 	TAG_FIXNUM,
 	TAG_SPECIAL,
@@ -45,8 +62,6 @@
 	T_F32, T_F64,
 }sl_numtype;
 
-typedef uintptr sl_v;
-
 #if defined(BITS64)
 typedef s64int sl_fx;
 #define FIXNUM_BITS (64-TAG_BITS)
@@ -63,14 +78,14 @@
 #define PRIdFIXNUM PRId32
 #endif
 
-typedef struct {
+struct sl_cons {
 	sl_v car;
 	sl_v cdr;
-}sl_aligned(8) sl_cons;
+}sl_aligned(8);
 
 // NOTE: sl_sym MUST have the same fields as sl_gensym first
 // there are places where gensyms are treated as normal symbols
-typedef struct {
+struct sl_sym {
 	u64int hash;
 	sl_type *type;
 	sl_v binding;   // global value binding
@@ -79,23 +94,19 @@
 	u8int flags;
 	u8int _dummy;
 	const char *name;
-}sl_aligned(8) sl_sym;
+}sl_aligned(8);
 
-typedef struct {
+struct sl_gensym {
 	u64int id;
 	sl_type *type;
 	sl_v binding;
-}sl_aligned(8) sl_gensym;
+}sl_aligned(8);
 
-typedef struct Builtin Builtin;
-
-struct Builtin {
+struct sl_builtin {
 	const char *name;
 	int nargs;
 };
 
-typedef sl_v (*builtin_t)(sl_v*, int);
-
 #define fits_bits(x, b) (((x)>>(b-1)) == 0 || (~((x)>>(b-1))) == 0)
 #define fits_fixnum(x) fits_bits(x, FIXNUM_BITS)
 
@@ -139,7 +150,7 @@
 
 // allocate n consecutive conses
 #define cons_reserve(n) tagptr(alloc_words((n)*2), TAG_CONS)
-#define cons_index(c) (((sl_cons*)ptr(c))-((sl_cons*)slg.fromspace))
+#define cons_index(c) (((sl_cons*)ptr(c))-((sl_cons*)slvm.fromspace))
 #define ismarked(c) bitvector_get(sl.consflags, cons_index(c))
 #define mark_cons(c) bitvector_set(sl.consflags, cons_index(c))
 #define unmark_cons(c) bitvector_reset(sl.consflags, cons_index(c))
@@ -187,7 +198,7 @@
 #define sym_value(s) (((sl_sym*)ptr(s))->binding)
 #define sym_name_(s) (((sl_sym*)ptr(s))->name)
 #define sym_to_numtype(s) (((sl_sym*)ptr(s))->numtype)
-#define ismanaged(v) ((((u8int*)ptr(v)) >= slg.fromspace) && (((u8int*)ptr(v)) < slg.fromspace+slg.heapsize))
+#define ismanaged(v) ((((u8int*)ptr(v)) >= slvm.fromspace) && (((u8int*)ptr(v)) < slvm.fromspace+slvm.heapsize))
 #define isgensym(v)  (issym(v) && ismanaged(v))
 #define iscbuiltin(v) (iscvalue(v) && cv_class(ptr(v)) == sl_builtintype)
 #define isfnbuiltin(v) ((v) < (N_BUILTINS<<TAG_BITS))
@@ -269,22 +280,22 @@
 char *uint2str(char *dest, usize len, u64int num, int base);
 
 /* error handling */
-typedef struct _sl_readstate {
+struct sl_readstate {
 	sl_htable backrefs;
 	sl_htable gensyms;
 	sl_v source;
 	ios_loc errloc;
-	struct _sl_readstate *prev;
-}sl_readstate;
+	struct sl_readstate *prev;
+};
 
-typedef struct _ectx_t {
+struct sl_exctx {
 	sl_readstate *rdst;
-	struct _ectx_t *prev;
+	struct sl_exctx *prev;
 	sl_jmp_buf buf;
 	usize osp;
 	usize frame;
 	int ngchnd;
-}sl_exctx;
+};
 
 void free_readstate(sl_readstate *rs);
 
@@ -323,15 +334,13 @@
 			bthrow(arity_error(nargs, c)); \
 	}while(0)
 
-typedef struct {
+struct sl_cvtable {
 	void (*print)(sl_v self, ios *f);
 	void (*relocate)(sl_v oldv, sl_v newv);
 	void (*finalize)(sl_v self);
 	void (*print_traverse)(sl_v self);
-}sl_cvtable;
+};
 
-typedef void (*cvinitfunc_t)(sl_type*, sl_v, void*);
-
 struct sl_type {
 	sl_v type;
 	sl_cvtable *vtable;
@@ -343,7 +352,7 @@
 	sl_numtype numtype;
 };
 
-typedef struct {
+struct sl_cv {
 	sl_type *type;
 	union {
 		void *data;
@@ -351,15 +360,15 @@
 	};
 	usize len; // length of *data in bytes
 	u8int _space[]; // variable size
-}sl_aligned(8) sl_cv;
+}sl_aligned(8);
 
-typedef struct {
+struct sl_fn {
 	sl_v vals;
 	sl_v bcode;
 	sl_v env;
 	sl_v name;
 	usize maxstack;
-}sl_aligned(8) sl_fn;
+}sl_aligned(8);
 
 #define cv_class(cv) ((sl_type*)(((uintptr)((sl_cv*)cv)->type)&~(uintptr)3))
 #define cv_len(cv) (((sl_cv*)(cv))->len)
@@ -392,10 +401,7 @@
 	sl_eof = special(4),
 };
 
-typedef struct Sl Sl;
-typedef struct Slg Slg;
-
-struct Sl {
+struct sl_proc {
 	sl_v *sp;
 	usize curr_frame;
 
@@ -422,7 +428,7 @@
 	uintptr cpc;
 };
 
-struct Slg {
+struct sl_vm {
 	u8int *curheap;
 	u8int *lim;
 	usize malloc_pressure;
@@ -448,10 +454,11 @@
 	uintptr heapsize; // bytes
 };
 
-extern sl_thread(Sl *slp);
+extern sl_thread(sl_proc *slp);
 #define sl (*slp)
 
-extern Slg slg;
+extern sl_vm slvm_;
+#define slvm (slvm_)
 
 extern sl_v sl_builtinssym, sl_quote, sl_lambda, sl_comma, sl_commaat;
 extern sl_v sl_commadot, sl_trycatch, sl_backquote;
--- a/src/types.c
+++ b/src/types.c
@@ -12,7 +12,7 @@
 		if(ft != nil)
 			return ft;
 	}
-	void **bp = equalhash_bp(&slg.types, (void*)t);
+	void **bp = equalhash_bp(&slvm.types, (void*)t);
 	if(*bp != HT_NOTFOUND){
 		assert(*bp != nil);
 		return *bp;
@@ -73,7 +73,7 @@
 void
 relocate_typetable(void)
 {
-	sl_htable *h = &slg.types;
+	sl_htable *h = &slvm.types;
 	for(int i = 0; i < h->size; i += 2){
 		if(h->table[i] != HT_NOTFOUND){
 			void *nv = (void*)sl_relocate((sl_v)h->table[i]);
--- a/src/vm.h
+++ b/src/vm.h
@@ -297,10 +297,10 @@
 }
 
 OP(OP_CONS) {
-	if(sl_unlikely((sl_v*)slg.curheap > (sl_v*)slg.lim))
+	if(sl_unlikely((sl_v*)slvm.curheap > (sl_v*)slvm.lim))
 		sl_gc(false);
-	sl_cons *c = (sl_cons*)slg.curheap;
-	slg.curheap += sizeof(sl_cons);
+	sl_cons *c = (sl_cons*)slvm.curheap;
+	slvm.curheap += sizeof(sl_cons);
 	c->car = sl.sp[-2];
 	c->cdr = sl.sp[-1];
 	sl.sp[-2] = tagptr(c, TAG_CONS);
--- a/tools/gen.sl
+++ b/tools/gen.sl
@@ -449,10 +449,10 @@
     ops)
   (io-close docs-ops)
   (io-write c-header "\tN_OPCODES\n}sl_op;\n\n")
-  (io-write c-header "extern const Builtin builtins[N_OPCODES];\n")
+  (io-write c-header "extern const sl_builtin builtins[N_OPCODES];\n")
 
   (io-write c-code "#include \"sl.h\"\n\n")
-  (io-write c-code "const Builtin builtins[N_OPCODES] = {\n")
+  (io-write c-code "const sl_builtin builtins[N_OPCODES] = {\n")
   (for-each
     (λ (c la) (begin (io-write c-code (str "\t[" c))
                      (io-write c-code «] = {"»)