add gc to function param
This commit is contained in:
parent
4ed169adc4
commit
26a0fe0a1b
1
dat.h
1
dat.h
@ -79,6 +79,7 @@ typedef struct
|
|||||||
};
|
};
|
||||||
}GC;
|
}GC;
|
||||||
|
|
||||||
|
extern GC *gc;
|
||||||
extern Object Nil;
|
extern Object Nil;
|
||||||
extern Object True;
|
extern Object True;
|
||||||
extern Object False;
|
extern Object False;
|
||||||
|
|||||||
12
eval.c
12
eval.c
@ -40,9 +40,9 @@ enter(Object *env, Object *vars, Object *args)
|
|||||||
error("Cna't apply function argment dose not match");
|
error("Cna't apply function argment dose not match");
|
||||||
Object *id = vars->car;
|
Object *id = vars->car;
|
||||||
Object *val = args->car;
|
Object *val = args->car;
|
||||||
map = newacons(id, val, map);
|
map = newacons(gc, id, val, map);
|
||||||
}
|
}
|
||||||
return newenv(&Nil, map, env);
|
return newenv(gc, &Nil, map, env);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
@ -56,7 +56,7 @@ fnlambda(Object *env, Object *l)
|
|||||||
}
|
}
|
||||||
Object *params = l->car;
|
Object *params = l->car;
|
||||||
Object *body = l->cdr;
|
Object *body = l->cdr;
|
||||||
return newfn(env, params, body);
|
return newfn(gc, env, params, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
@ -79,7 +79,7 @@ fndefine(Object *env, Object *list)
|
|||||||
Object *obj = find(env, list->car);
|
Object *obj = find(env, list->car);
|
||||||
if(obj)
|
if(obj)
|
||||||
return obj->cdr = val;
|
return obj->cdr = val;
|
||||||
return env->vars = newacons(list->car, val, env->vars);
|
return env->vars = newacons(gc, list->car, val, env->vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
@ -91,7 +91,7 @@ fnplus(Object *env, Object *list)
|
|||||||
error("+ take only number");
|
error("+ take only number");
|
||||||
sum += p->car->num;
|
sum += p->car->num;
|
||||||
}
|
}
|
||||||
return newint(sum);
|
return newint(gc, sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Object*
|
static Object*
|
||||||
@ -103,7 +103,7 @@ evallist(Object *env, Object *list)
|
|||||||
error("type is not list");
|
error("type is not list");
|
||||||
Object *car = eval(env, list->car);
|
Object *car = eval(env, list->car);
|
||||||
Object *cdr = evallist(env, list->cdr);
|
Object *cdr = evallist(env, list->cdr);
|
||||||
return newcons(car, cdr);
|
return newcons(gc, car, cdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Object*
|
static Object*
|
||||||
|
|||||||
25
fn.h
25
fn.h
@ -7,21 +7,20 @@ Object* eval(Object *env, Object *expr);
|
|||||||
|
|
||||||
/* new */
|
/* new */
|
||||||
|
|
||||||
Object* newint(long);
|
Object* newint(GC *,long);
|
||||||
Object* newcons(Object*,Object*);
|
Object* newcons(GC *,Object*,Object*);
|
||||||
Object* newenv(Object*name, Object *vars, Object *up);
|
Object* newenv(GC *,Object*name, Object *vars, Object *up);
|
||||||
Object* newacons(Object*, Object*, Object*);
|
Object* newacons(GC *,Object*, Object*, Object*);
|
||||||
Object* newsymbol(char*, int);
|
Object* newsymbol(GC *,char*, int);
|
||||||
Object* newstr(int);
|
Object* newstr(GC *,int);
|
||||||
Object* newfn(Object *env, Object *params, Object *body);
|
Object* newfn(GC *,Object *env, Object *params, Object *body);
|
||||||
|
|
||||||
/* gc.c */
|
/* gc.c */
|
||||||
void gcstatus(void);
|
Object* newobj(GC *,enum OType);
|
||||||
Object* newobj(enum OType);
|
void* gcalloc(GC *,int);
|
||||||
void* gcalloc(int);
|
void* gcralloc(GC *, void*, int);
|
||||||
void* gcralloc(void*, int);
|
GC* newgc(void *top, int cap);
|
||||||
void gcinit(void *top, int cap);
|
void gcrun(GC *);
|
||||||
void gcrun(void);
|
|
||||||
|
|
||||||
/* str.c */
|
/* str.c */
|
||||||
void strputc(Object*, int);
|
void strputc(Object*, int);
|
||||||
|
|||||||
140
gc.c
140
gc.c
@ -12,52 +12,58 @@ enum
|
|||||||
OFFSET = sizeof(int),
|
OFFSET = sizeof(int),
|
||||||
};
|
};
|
||||||
|
|
||||||
GC gc = {0};
|
int running = 0;
|
||||||
|
|
||||||
void
|
void
|
||||||
gcfree(void *src)
|
gccompact(int cap, GC *gc)
|
||||||
|
{
|
||||||
|
GC *ngc = newgc((void*)gc->top, gc->cap * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gcfree(GC *gc, void *src)
|
||||||
{
|
{
|
||||||
int *p = (int*)src - 1;
|
int *p = (int*)src - 1;
|
||||||
int sz = *p;
|
int sz = *p;
|
||||||
memset(p, 0, sz);
|
memset(p, 0, sz);
|
||||||
gc.using -= sz;
|
gc->using -= sz;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
freeobj(Object *p)
|
freeobj(GC *gc, Object *p)
|
||||||
{
|
{
|
||||||
gc.using -= sizeof(Object);
|
gc->using -= sizeof(Object);
|
||||||
p->next = 0;
|
p->next = 0;
|
||||||
switch(p->type){
|
switch(p->type){
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
case OSTRING:
|
case OSTRING:
|
||||||
case OIDENT:
|
case OIDENT:
|
||||||
gcfree(p->beg);
|
gcfree(gc, p->beg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memset(p, 0, sizeof(Object));
|
memset(p, 0, sizeof(Object));
|
||||||
if(gc.freed == 0)
|
if(gc->freed == 0)
|
||||||
gc.freed = p;
|
gc->freed = p;
|
||||||
else{
|
else{
|
||||||
p->next = gc.freed;
|
p->next = gc->freed;
|
||||||
gc.freed = p;
|
gc->freed = p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void*
|
void*
|
||||||
gcalloc(int sz)
|
gcalloc(GC *gc, int sz)
|
||||||
{
|
{
|
||||||
sz += OFFSET;
|
sz += OFFSET;
|
||||||
if(sz % OFFSET) sz = sz + OFFSET - (sz % OFFSET);
|
if(sz % OFFSET) sz = sz + OFFSET - (sz % OFFSET);
|
||||||
for(u64 i = gc.sb; i < gc.se;){
|
for(u64 i = gc->sb; i < gc->se;){
|
||||||
u64 j = i;
|
u64 j = i;
|
||||||
for(;j - i < sz; j += OFFSET){
|
for(;j - i < sz; j += OFFSET){
|
||||||
if(*(int*)(j) != 0)
|
if(*(int*)(j) != 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(j - i == sz){
|
if(j - i == sz){
|
||||||
gc.using += sz;
|
gc->using += sz;
|
||||||
*(int*)i = sz;
|
*(int*)i = sz;
|
||||||
i += OFFSET;
|
i += OFFSET;
|
||||||
return (void*)i;
|
return (void*)i;
|
||||||
@ -68,44 +74,44 @@ gcalloc(int sz)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void*
|
void*
|
||||||
gcralloc(void *src, int sz)
|
gcralloc(GC *gc, void *src, int sz)
|
||||||
{
|
{
|
||||||
void *dst = gcalloc(sz);
|
void *dst = gcalloc(gc, sz);
|
||||||
int osz = ((int*)src)[-1];
|
int osz = ((int*)src)[-1];
|
||||||
memcpy(dst, src, osz);
|
memcpy(dst, src, osz);
|
||||||
gcfree(src);
|
gcfree(gc, src);
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
mark(Object *obj)
|
mark(GC *gc, Object *obj)
|
||||||
{
|
{
|
||||||
if(obj == 0 || obj->flag&USING)
|
if(obj == 0 || obj->flag&USING)
|
||||||
return;
|
return;
|
||||||
obj->flag = USING;
|
obj->flag = USING;
|
||||||
switch(obj->type){
|
switch(obj->type){
|
||||||
case OCELL:
|
case OCELL:
|
||||||
mark(obj->car);
|
mark(gc, obj->car);
|
||||||
mark(obj->cdr);
|
mark(gc, obj->cdr);
|
||||||
break;
|
break;
|
||||||
case OENV:
|
case OENV:
|
||||||
mark(obj->name);
|
mark(gc, obj->name);
|
||||||
mark(obj->vars);
|
mark(gc, obj->vars);
|
||||||
mark(obj->up);
|
mark(gc, obj->up);
|
||||||
break;
|
break;
|
||||||
case OFUNC:
|
case OFUNC:
|
||||||
mark(obj->params);
|
mark(gc, obj->params);
|
||||||
mark(obj->body);
|
mark(gc, obj->body);
|
||||||
mark(obj->env);
|
mark(gc, obj->env);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gcsweep(void)
|
gcsweep(GC *gc)
|
||||||
{
|
{
|
||||||
Object *last = 0;
|
Object *last = 0;
|
||||||
for(Object *p = gc.objs; p;){
|
for(Object *p = gc->objs; p;){
|
||||||
if(p->flag&USING){
|
if(p->flag&USING){
|
||||||
p->flag = 0;
|
p->flag = 0;
|
||||||
last = p;
|
last = p;
|
||||||
@ -113,87 +119,93 @@ gcsweep(void)
|
|||||||
}else{
|
}else{
|
||||||
Object *tmp = p;
|
Object *tmp = p;
|
||||||
if(last == 0){
|
if(last == 0){
|
||||||
gc.objs = p->next;
|
gc->objs = p->next;
|
||||||
}else{
|
}else{
|
||||||
last->next = p->next;
|
last->next = p->next;
|
||||||
}
|
}
|
||||||
p = p->next;
|
p = p->next;
|
||||||
freeobj(tmp);
|
freeobj(gc, tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
isobj(u64 p)
|
isobj(GC *gc, u64 p)
|
||||||
{
|
{
|
||||||
if(gc.ob <= p && p < gc.oe){
|
if(gc->ob <= p && p < gc->oe){
|
||||||
p -= gc.ob;
|
p -= gc->ob;
|
||||||
return (p % sizeof(Object)) == 0;
|
return (p % sizeof(Object)) == 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gcmark(void)
|
gcmark(GC *gc)
|
||||||
{
|
{
|
||||||
void *_ = 0;
|
void *_ = 0;
|
||||||
u64 bot = (u64)&_;
|
u64 bot = (u64)&_;
|
||||||
for(; bot < gc.top; bot += sizeof(bot)){
|
for(; bot < gc->top; bot += sizeof(bot)){
|
||||||
u64 val = (u64)*(void**)bot;
|
u64 val = (u64)*(void**)bot;
|
||||||
if(isobj(val))
|
if(isobj(gc, val))
|
||||||
mark((Object*)val);
|
mark(gc, (Object*)val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gcrun(void)
|
gcrun(GC *gc)
|
||||||
{
|
{
|
||||||
printf("before=> cap:%d using:%d remain:%d\n", gc.cap, gc.using, gc.cap-gc.using);
|
running = 1;
|
||||||
|
printf("before=> cap:%d using:%d remain:%d\n", gc->cap, gc->using, gc->cap-gc->using);
|
||||||
jmp_buf reg;
|
jmp_buf reg;
|
||||||
setjmp(reg);
|
setjmp(reg);
|
||||||
gcmark();
|
gcmark(gc);
|
||||||
gcsweep();
|
gcsweep(gc);
|
||||||
printf("after=> cap:%d using:%d remain:%d\n", gc.cap, gc.using, gc.cap-gc.using);
|
printf("after=> cap:%d using:%d remain:%d\n", gc->cap, gc->using, gc->cap-gc->using);
|
||||||
|
running = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
newobj(enum OType type)
|
newobj(GC *gc, enum OType type)
|
||||||
{
|
{
|
||||||
if(gc.op + sizeof(Object) >= gc.oe){
|
if(gc->op + sizeof(Object) >= gc->oe){
|
||||||
panic("Not impl yet newobj raise");
|
panic("Not impl yet newobj raise");
|
||||||
}
|
}
|
||||||
gcrun();
|
gcrun(gc);
|
||||||
gc.using += sizeof(Object);
|
gc->using += sizeof(Object);
|
||||||
Object *r = 0;
|
Object *r = 0;
|
||||||
if(gc.freed){
|
if(gc->freed){
|
||||||
r = gc.freed;
|
r = gc->freed;
|
||||||
gc.freed = gc.freed->next;
|
gc->freed = gc->freed->next;
|
||||||
}else{
|
}else{
|
||||||
r = (Object*)gc.op;
|
r = (Object*)gc->op;
|
||||||
gc.op += sizeof(Object);
|
gc->op += sizeof(Object);
|
||||||
}
|
}
|
||||||
r->type = type;
|
r->type = type;
|
||||||
if(gc.objs == 0)
|
if(gc->objs == 0)
|
||||||
gc.objs = r;
|
gc->objs = r;
|
||||||
else{
|
else{
|
||||||
r->next = gc.objs;
|
r->next = gc->objs;
|
||||||
gc.objs = r;
|
gc->objs = r;
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
GC*
|
||||||
gcinit(void *top, int cap)
|
newgc(void *top, int cap)
|
||||||
{
|
{
|
||||||
gc.top = (u64)top;
|
GC *gc = calloc(1, sizeof(GC));
|
||||||
if((gc.memory = malloc(cap)) == 0)
|
if(gc == 0)
|
||||||
|
panic("can't alloc %d byte\n", sizeof(GC));
|
||||||
|
gc->top = (u64)top;
|
||||||
|
if((gc->memory = malloc(cap)) == 0)
|
||||||
panic("can't alloc %d byte\n", cap);
|
panic("can't alloc %d byte\n", cap);
|
||||||
gc.cap = cap;
|
gc->cap = cap;
|
||||||
gc.using = 0;
|
gc->using = 0;
|
||||||
|
|
||||||
gc.op = gc.ob = (u64)gc.memory;
|
gc->op = gc->ob = (u64)gc->memory;
|
||||||
gc.oe = gc.op + (float)cap * 0.64;
|
gc->oe = gc->op + (float)cap * 0.64;
|
||||||
|
|
||||||
gc.sb = (u64)gc.memory + (float)cap * 0.64;
|
gc->sb = (u64)gc->memory + (float)cap * 0.64;
|
||||||
gc.se = (u64)gc.memory + cap;
|
gc->se = (u64)gc->memory + cap;
|
||||||
|
return gc;
|
||||||
}
|
}
|
||||||
|
|||||||
7
main.c
7
main.c
@ -4,6 +4,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
jmp_buf err;
|
jmp_buf err;
|
||||||
|
GC *gc;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SExprint(Object *obj)
|
SExprint(Object *obj)
|
||||||
@ -58,10 +59,10 @@ printexpr(Object *obj)
|
|||||||
static void
|
static void
|
||||||
loop(void)
|
loop(void)
|
||||||
{
|
{
|
||||||
Object *root = newenv(&Nil, &Nil, &Nil);
|
Object *root = newenv(gc, &Nil, &Nil, &Nil);
|
||||||
if(setjmp(err) == 1){
|
if(setjmp(err) == 1){
|
||||||
skipline();
|
skipline();
|
||||||
gcrun();
|
gcrun(gc);
|
||||||
}
|
}
|
||||||
while(1){
|
while(1){
|
||||||
Object *res = nextexpr();
|
Object *res = nextexpr();
|
||||||
@ -73,6 +74,6 @@ loop(void)
|
|||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
gcinit(&argc, 4000);
|
gc = newgc(&argc, 4000);
|
||||||
loop();
|
loop();
|
||||||
}
|
}
|
||||||
|
|||||||
34
obj.c
34
obj.c
@ -4,26 +4,26 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
newint(long val)
|
newint(GC *gc, long val)
|
||||||
{
|
{
|
||||||
Object *obj = newobj(OINT);
|
Object *obj = newobj(gc, OINT);
|
||||||
obj->num = val;
|
obj->num = val;
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
newcons(Object *car, Object *cdr)
|
newcons(GC *gc, Object *car, Object *cdr)
|
||||||
{
|
{
|
||||||
Object *obj = newobj(OCELL);
|
Object *obj = newobj(gc, OCELL);
|
||||||
obj->car = car;
|
obj->car = car;
|
||||||
obj->cdr = cdr;
|
obj->cdr = cdr;
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
newenv(Object* name, Object *vars, Object *up)
|
newenv(GC *gc, Object* name, Object *vars, Object *up)
|
||||||
{
|
{
|
||||||
Object *obj = newobj(OENV);
|
Object *obj = newobj(gc, OENV);
|
||||||
obj->name = name;
|
obj->name = name;
|
||||||
obj->up = up;
|
obj->up = up;
|
||||||
obj->vars = vars;
|
obj->vars = vars;
|
||||||
@ -31,16 +31,16 @@ newenv(Object* name, Object *vars, Object *up)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
newacons(Object *x, Object *y, Object *z)
|
newacons(GC *gc, Object *x, Object *y, Object *z)
|
||||||
{
|
{
|
||||||
Object *cons = newcons(x, y);
|
Object *cons = newcons(gc, x, y);
|
||||||
return newcons(cons, z);
|
return newcons(gc, cons, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
newfn(Object *env, Object *params, Object *body)
|
newfn(GC *gc, Object *env, Object *params, Object *body)
|
||||||
{
|
{
|
||||||
Object *fn = newobj(OFUNC);
|
Object *fn = newobj(gc, OFUNC);
|
||||||
fn->params = params;
|
fn->params = params;
|
||||||
fn->body = body;
|
fn->body = body;
|
||||||
fn->env = env;
|
fn->env = env;
|
||||||
@ -48,7 +48,7 @@ newfn(Object *env, Object *params, Object *body)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
newsymbol(char *str, int len)
|
newsymbol(GC *gc, char *str, int len)
|
||||||
{
|
{
|
||||||
static Object *syms[] = {
|
static Object *syms[] = {
|
||||||
&Nil, &True, &False, &Minus, &Plus,
|
&Nil, &True, &False, &Minus, &Plus,
|
||||||
@ -59,18 +59,18 @@ newsymbol(char *str, int len)
|
|||||||
if(strlen(c->sym)==len && memcmp(c->sym, str, len) == 0)
|
if(strlen(c->sym)==len && memcmp(c->sym, str, len) == 0)
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
Object *obj = newobj(OIDENT);
|
Object *obj = newobj(gc, OIDENT);
|
||||||
obj->beg = gcalloc(len + 1);
|
obj->beg = gcalloc(gc, len + 1);
|
||||||
obj->end = obj->ptr = obj->beg + len;
|
obj->end = obj->ptr = obj->beg + len;
|
||||||
memcpy(obj->beg, str, len+1);
|
memcpy(obj->beg, str, len+1);
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object*
|
Object*
|
||||||
newstr(int len)
|
newstr(GC *gc, int len)
|
||||||
{
|
{
|
||||||
Object *obj = newobj(OSTRING);
|
Object *obj = newobj(gc, OSTRING);
|
||||||
obj->ptr = obj->beg = gcalloc(len + 1);
|
obj->ptr = obj->beg = gcalloc(gc, len + 1);
|
||||||
obj->end = obj->beg + len;
|
obj->end = obj->beg + len;
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|||||||
18
parser.c
18
parser.c
@ -62,7 +62,7 @@ symbol(char c)
|
|||||||
buf[len++] = get();
|
buf[len++] = get();
|
||||||
}
|
}
|
||||||
buf[len] = 0;
|
buf[len] = 0;
|
||||||
return newsymbol(buf, len);
|
return newsymbol(gc, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static long
|
static long
|
||||||
@ -79,14 +79,14 @@ quote(void)
|
|||||||
{
|
{
|
||||||
Object *car = &Quote;
|
Object *car = &Quote;
|
||||||
Object *ccdr = list();
|
Object *ccdr = list();
|
||||||
Object *cdr = newcons(ccdr, &Nil);
|
Object *cdr = newcons(gc, ccdr, &Nil);
|
||||||
return newcons(car, cdr);
|
return newcons(gc, car, cdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Object*
|
static Object*
|
||||||
string(void)
|
string(void)
|
||||||
{
|
{
|
||||||
Object *str = newstr(16);
|
Object *str = newstr(gc, 16);
|
||||||
while(lookup() != '\"'){
|
while(lookup() != '\"'){
|
||||||
strputc(str, get());
|
strputc(str, get());
|
||||||
}
|
}
|
||||||
@ -98,11 +98,11 @@ static Object*
|
|||||||
atom(char c)
|
atom(char c)
|
||||||
{
|
{
|
||||||
if(isdigit(c))
|
if(isdigit(c))
|
||||||
return newint(number());
|
return newint(gc, number());
|
||||||
get();
|
get();
|
||||||
if(c == '-'){
|
if(c == '-'){
|
||||||
if(isdigit(lookup()))
|
if(isdigit(lookup()))
|
||||||
return newint(-number());
|
return newint(gc, -number());
|
||||||
else
|
else
|
||||||
return symbol('-');
|
return symbol('-');
|
||||||
}
|
}
|
||||||
@ -126,20 +126,20 @@ lparlist(void)
|
|||||||
get();
|
get();
|
||||||
car = quote();
|
car = quote();
|
||||||
cdr = lparlist();
|
cdr = lparlist();
|
||||||
return newcons(car, cdr);
|
return newcons(gc, car, cdr);
|
||||||
case '.':
|
case '.':
|
||||||
get();
|
get();
|
||||||
return list();
|
return list();
|
||||||
case '(':
|
case '(':
|
||||||
car = list();
|
car = list();
|
||||||
cdr = lparlist();
|
cdr = lparlist();
|
||||||
return newcons(car, cdr);
|
return newcons(gc, car, cdr);
|
||||||
case ')':
|
case ')':
|
||||||
return &Nil;
|
return &Nil;
|
||||||
}
|
}
|
||||||
car = atom(c);
|
car = atom(c);
|
||||||
cdr = lparlist();
|
cdr = lparlist();
|
||||||
return newcons(car ,cdr);
|
return newcons(gc, car ,cdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Object*
|
static Object*
|
||||||
|
|||||||
2
str.c
2
str.c
@ -6,7 +6,7 @@ void
|
|||||||
strraise(Object *s, int ns)
|
strraise(Object *s, int ns)
|
||||||
{
|
{
|
||||||
int pos = s->ptr - s->beg;
|
int pos = s->ptr - s->beg;
|
||||||
char *ptr = gcralloc(s->beg, ns + 1);
|
char *ptr = gcralloc(gc, s->beg, ns + 1);
|
||||||
s->beg = ptr;
|
s->beg = ptr;
|
||||||
s->ptr = s->beg + pos;
|
s->ptr = s->beg + pos;
|
||||||
s->end = s->beg + ns;
|
s->end = s->beg + ns;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user