[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