summaryrefslogtreecommitdiff
path: root/interpreter.c
blob: 5a3d66a2b1e0d559167ad24aa9596c6b17cf36f5 (plain)
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
78
79
80
81
82
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include "interpreter.h"
#include "util.h"


int namehash(const char *name,int mod){
	int h=0;
	for(int i=0;name[i];i++)h+=name[i];
	return h%mod;
}


#define VMAP_HASHSZ (61)

typedef struct Vllist{
	char *name;
	AST *value;
	struct Vllist *next;
} Vllist;

typedef struct Scope{
	Vllist *vmap[VMAP_HASHSZ];
	struct Scope *next;
} Scope;


typedef struct Symbolstore{
	int sz,len;
	char **syms;
} Symbolstore;


struct InterState{
	Scope *scope;
	Symbolstore ss;
};


Scope* scope_make(void){
	Scope *scope=malloc(1,Scope);
	memset(scope->vmap,0,VMAP_HASHSZ*sizeof(Vllist*));
	scope->next=NULL;
	return scope;
}


InterState* inter_make(void){
	InterState *is=malloc(1,InterState);
	is->scope=scope_make();
	is->ss.sz=16;
	is->ss.len=0;
	is->ss.syms=malloc(is->ss.sz,char*);
	return is;
}

static void scope_destroy(Scope *scope,bool recursive){
	do {
		for(int i=0;i<VMAP_HASHSZ;i++){
			while(scope->vmap[i]){
				Vllist *ll=scope->vmap[i];
				free(ll->name);
				ast_free(ll->value);
				scope->vmap[i]=ll->next;
				free(ll);
			}
		}
		Scope *next=scope->next;
		free(scope);
		scope=next;
	} while(recursive&&scope);
}

void inter_destroy(InterState *is){
	assert(is);
	scope_destroy(is->scope,true);
	for(int i=0;i<is->ss.len;i++)free(is->ss.syms[i]);
	free(is->ss.syms);
}