-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmem.c
77 lines (65 loc) · 1023 Bytes
/
mem.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdlib.h>
#include <stdio.h>
#include "lisp.h"
int _objects = 0;
Object *alloc(void)
{
++_objects;
Object *ob = calloc(1, sizeof(Object));
return ob;
}
Value make(enum Type type)
{
Value v = nil;
v.type = type;
if (isobject(v))
v.object = alloc();
return v;
}
Value pack(void *d, void (*delete)(void*))
{
Value v = make(TOther);
v.other->d = d;
v.other->delete = delete;
return v;
}
void mark(Value *v)
{
if (isobject(*v))
++v->object->refc;
}
void unmark(Value *v)
{
if (isobject(*v))
--v->object->refc;
}
void check(Value *v)
{
if (isobject(*v) && v->object->refc <= 0) {
if (isother(*v)) {
if (v->other->delete)
v->other->delete(v->other->d);
} else {
if (islist(*v)) {
int i;
for (i = 0; i < v->list->len; i++)
delete(&vector(Value, v->list, i));
}
free(v->object->v.d);
}
free(v->object);
v->type = TNil;
--_objects;
}
}
void delete(Value *v)
{
unmark(v);
check(v);
}
void set(Value *d, Value s)
{
mark(&s);
delete(d);
*d = s;
}