[master] 7327936 Rearrange symbol table slightly, in preparation for mode invasive renovations of it.

Poul-Henning Kamp phk at FreeBSD.org
Mon Jun 6 11:23:06 CEST 2016


commit 7327936e6f6c2cd08ee6b8e8e1d6473d7cd5abb8
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Jun 6 09:18:37 2016 +0000

    Rearrange symbol table slightly, in preparation for mode invasive
    renovations of it.

diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index 4a182cf..605aed3 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -575,7 +575,6 @@ vcc_NewVcc(const struct vcp *vcp)
 	ALLOC_OBJ(tl, VCC_MAGIC);
 	AN(tl);
 	tl->param = vcp;
-	VTAILQ_INIT(&tl->symbols);
 	VTAILQ_INIT(&tl->inifin);
 	VTAILQ_INIT(&tl->membits);
 	VTAILQ_INIT(&tl->tokens);
@@ -606,7 +605,6 @@ vcc_DestroyTokenList(struct vcc *tl, char *ret)
 {
 	struct membit *mb;
 	struct source *sp;
-	struct symbol *sym;
 	int i;
 
 	while (!VTAILQ_EMPTY(&tl->membits)) {
@@ -621,12 +619,6 @@ vcc_DestroyTokenList(struct vcc *tl, char *ret)
 		vcc_destroy_source(sp);
 	}
 
-	while (!VTAILQ_EMPTY(&tl->symbols)) {
-		sym = VTAILQ_FIRST(&tl->symbols);
-		VTAILQ_REMOVE(&tl->symbols, sym, list);
-		FREE_OBJ(sym);
-	}
-
 	VSB_destroy(&tl->fh);
 	VSB_destroy(&tl->fc);
 	for (i = 0; i < VCL_MET_MAX; i++)
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index e9e72cc..8ba41c0 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -113,6 +113,7 @@ struct symbol {
 	unsigned			magic;
 #define SYMBOL_MAGIC			0x3368c9fb
 	VTAILQ_ENTRY(symbol)		list;
+	VTAILQ_HEAD(,symbol)		children;
 
 	char				*name;
 	unsigned			nlen;
@@ -179,7 +180,7 @@ struct vcc {
 	/* Parameter/Template section */
 	const struct vcp	*param;
 
-	VTAILQ_HEAD(, symbol)	symbols;
+	struct symbol		*symbols;
 
 	struct inifinhead	inifin;
 	unsigned		ninifin;
diff --git a/lib/libvcc/vcc_symb.c b/lib/libvcc/vcc_symb.c
index 762e27b..38127a3 100644
--- a/lib/libvcc/vcc_symb.c
+++ b/lib/libvcc/vcc_symb.c
@@ -65,11 +65,36 @@ VCC_SymKind(struct vcc *tl, const struct symbol *s)
 }
 
 static struct symbol *
+vcc_new_symbol(struct vcc *tl, const char *b, const char *e)
+{
+	struct symbol *sym;
+
+	AN(b);
+	if (e == NULL)
+		e = strchr(b, '\0');
+	AN(e);
+	assert(e > b);
+	sym = TlAlloc(tl, sizeof *sym);
+	INIT_OBJ(sym, SYMBOL_MAGIC);
+	AN(sym);
+	sym->name = TlAlloc(tl, (e - b) + 1L);
+	AN(sym->name);
+	memcpy(sym->name, b, (e - b));
+	sym->name[e - b] = '\0';
+	sym->nlen = e - b;
+	VTAILQ_INIT(&sym->children);
+	return (sym);
+}
+
+static struct symbol *
 vcc_AddSymbol(struct vcc *tl, const char *nb, int l, enum symkind kind)
 {
 	struct symbol *sym;
 
-	VTAILQ_FOREACH(sym, &tl->symbols, list) {
+	if (tl->symbols == NULL)
+		tl->symbols = vcc_new_symbol(tl, "<root>", NULL);
+
+	VTAILQ_FOREACH(sym, &tl->symbols->children, list) {
 		if (sym->nlen != l)
 			continue;
 		if (memcmp(nb, sym->name, l))
@@ -81,14 +106,8 @@ vcc_AddSymbol(struct vcc *tl, const char *nb, int l, enum symkind kind)
 		ErrInternal(tl);
 		return (NULL);
 	}
-	ALLOC_OBJ(sym, SYMBOL_MAGIC);
-	AN(sym);
-	sym->name = malloc(l + 1L);
-	AN(sym->name);
-	memcpy(sym->name, nb, l);
-	sym->name[l] = '\0';
-	sym->nlen = l;
-	VTAILQ_INSERT_HEAD(&tl->symbols, sym, list);
+	sym = vcc_new_symbol(tl, nb, nb + l);
+	VTAILQ_INSERT_HEAD(&tl->symbols->children, sym, list);
 	sym->kind = kind;
 	return (sym);
 }
@@ -127,7 +146,7 @@ VCC_FindSymbol(struct vcc *tl, const struct token *t, enum symkind kind)
 	struct symbol *sym;
 
 	assert(t->tok == ID);
-	VTAILQ_FOREACH(sym, &tl->symbols, list) {
+	VTAILQ_FOREACH(sym, &tl->symbols->children, list) {
 		if (sym->kind == SYM_WILDCARD &&
 		   (t->e - t->b > sym->nlen) &&
 		   !memcmp(sym->name, t->b, sym->nlen)) {
@@ -147,7 +166,7 @@ VCC_WalkSymbols(struct vcc *tl, symwalk_f *func, enum symkind kind)
 {
 	struct symbol *sym;
 
-	VTAILQ_FOREACH(sym, &tl->symbols, list) {
+	VTAILQ_FOREACH(sym, &tl->symbols->children, list) {
 		if (kind == SYM_NONE || kind == sym->kind)
 			func(tl, sym);
 		ERRCHK(tl);



More information about the varnish-commit mailing list