@@ -12,9 +12,11 @@ struct Entry_ {
12
12
13
13
struct Binding_ {
14
14
Binding * parent ;
15
+ long reference_count ;
15
16
Entry * first ;
16
17
};
17
18
19
+ static Binding * use_binding (Binding * );
18
20
static Entry * create_entry (Entry * , char * , Object * );
19
21
static Object * free_entry (Entry * );
20
22
static Entry * * vacancy (Binding * );
@@ -23,23 +25,36 @@ static int key_matches(char *, char *);
23
25
24
26
Binding * create_binding (Binding * parent ) {
25
27
Binding * binding = (Binding * )malloc (sizeof (Binding ));
26
- binding -> parent = parent ;
28
+ binding -> parent = use_binding (parent );
29
+ binding -> reference_count = 0L ;
27
30
binding -> first = NULL ;
28
31
return binding ;
29
32
}
30
33
31
34
Binding * free_binding (Binding * binding ) {
35
+ if (binding -> reference_count > 1L ) {
36
+ binding -> reference_count -- ;
37
+ return binding -> parent ;
38
+ }
32
39
Binding * parent = binding -> parent ;
33
40
Entry * entry = binding -> first ;
34
41
while (entry != NULL ) {
35
42
Entry * next = entry -> next ;
36
43
destroy (free_entry (entry ));
37
44
entry = next ;
38
45
}
46
+ free_binding (binding -> parent );
39
47
free (binding );
40
48
return parent ;
41
49
}
42
50
51
+ static Binding * use_binding (Binding * binding ) {
52
+ if (binding != NULL ) {
53
+ binding -> reference_count ++ ;
54
+ }
55
+ return binding ;
56
+ }
57
+
43
58
void add (Binding * binding , char * key , Object * object ) {
44
59
Entry * * slot = vacancy (binding );
45
60
* slot = create_entry (NULL , key , object );
0 commit comments