diff options
| author | Keith Packard <keithp@keithp.com> | 2016-11-14 18:45:12 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2017-02-20 11:16:50 -0800 | 
| commit | ddb4b8d90478ae324aa207a7541352c1ac9451ee (patch) | |
| tree | 9f069fea8113178eedf9e4714bfea98538f818e5 /src/lisp/ao_lisp_string.c | |
| parent | affcf6ffc08313151541993ee543bfe390165e81 (diff) | |
altos/lisp: Change GC to do moves in batches of 32
This should make it quite a bit faster than doing one at a time.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_string.c')
| -rw-r--r-- | src/lisp/ao_lisp_string.c | 33 | 
1 files changed, 19 insertions, 14 deletions
| diff --git a/src/lisp/ao_lisp_string.c b/src/lisp/ao_lisp_string.c index 9ee1a7dd..207d4f3b 100644 --- a/src/lisp/ao_lisp_string.c +++ b/src/lisp/ao_lisp_string.c @@ -38,23 +38,17 @@ const struct ao_lisp_type ao_lisp_string_type = {  	.mark = string_mark,  	.size = string_size,  	.move = string_move, +	.name = "string",  };  char * -ao_lisp_string_new(int len) { -	char	*a = ao_lisp_alloc(len + 1); -	if (!a) -		return NULL; -	a[len] = '\0'; -	return a; -} - -char *  ao_lisp_string_copy(char *a)  {  	int	alen = strlen(a); +	ao_lisp_string_stash(0, a);  	char	*r = ao_lisp_alloc(alen + 1); +	a = ao_lisp_string_fetch(0);  	if (!r)  		return NULL;  	strcpy(r, a); @@ -66,7 +60,12 @@ ao_lisp_string_cat(char *a, char *b)  {  	int	alen = strlen(a);  	int	blen = strlen(b); + +	ao_lisp_string_stash(0, a); +	ao_lisp_string_stash(1, b);  	char	*r = ao_lisp_alloc(alen + blen + 1); +	a = ao_lisp_string_fetch(0); +	b = ao_lisp_string_fetch(1);  	if (!r)  		return NULL;  	strcpy(r, a); @@ -78,7 +77,9 @@ ao_poly  ao_lisp_string_pack(struct ao_lisp_cons *cons)  {  	int	len = ao_lisp_cons_length(cons); +	ao_lisp_cons_stash(0, cons);  	char	*r = ao_lisp_alloc(len + 1); +	cons = ao_lisp_cons_fetch(0);  	char	*s = r;  	while (cons) { @@ -96,11 +97,17 @@ ao_lisp_string_unpack(char *a)  {  	struct ao_lisp_cons	*cons = NULL, *tail = NULL;  	int			c; +	int			i; -	ao_lisp_root_add(&ao_lisp_cons_type, &cons); -	ao_lisp_root_add(&ao_lisp_cons_type, &tail); -	while ((c = *a++)) { +	for (i = 0; (c = a[i]); i++) { +		ao_lisp_cons_stash(0, cons); +		ao_lisp_cons_stash(1, tail); +		ao_lisp_string_stash(0, a);  		struct ao_lisp_cons	*n = ao_lisp_cons_cons(ao_lisp_int_poly(c), NULL); +		cons = ao_lisp_cons_fetch(0); +		tail = ao_lisp_cons_fetch(1); +		a = ao_lisp_string_fetch(0); +  		if (!n) {  			cons = NULL;  			break; @@ -111,8 +118,6 @@ ao_lisp_string_unpack(char *a)  			cons = n;  		tail = n;  	} -	ao_lisp_root_clear(&cons); -	ao_lisp_root_clear(&tail);  	return ao_lisp_cons_poly(cons);  } | 
