Commit d6ed35e9 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Support versioned symbols.

parent 0c5569f7
...@@ -166,13 +166,15 @@ returns = ( ...@@ -166,13 +166,15 @@ returns = (
# 'backend' means all methods tagged "B" # 'backend' means all methods tagged "B"
# 'both' means all methods tagged "B" or "C" # 'both' means all methods tagged "B" or "C"
sp_variables = collections.OrderedDict() varprotos = {}
def varproto(s):
if not s in varprotos:
fh.write(s + ";\n")
varprotos[s] = True
class vardef(object): class vardef(object):
def __init__(self, nam, typ, rd, wr, wu, vlo, vhi): def __init__(self, nam, typ, rd, wr, wu, vlo, vhi):
if nam in sp_variables:
return
sp_variables[nam] = self
self.nam = nam self.nam = nam
self.typ = typ self.typ = typ
self.rd = rd self.rd = rd
...@@ -181,6 +183,8 @@ class vardef(object): ...@@ -181,6 +183,8 @@ class vardef(object):
self.vlo = vlo self.vlo = vlo
self.vhi = vhi self.vhi = vhi
self.emit()
def emit(self): def emit(self):
fh.write("\n") fh.write("\n")
fo.write("\n") fo.write("\n")
...@@ -190,11 +194,11 @@ class vardef(object): ...@@ -190,11 +194,11 @@ class vardef(object):
# fo.write("\t{ \"%s\", %s,\n" % (nm, self.typ)) # fo.write("\t{ \"%s\", %s,\n" % (nm, self.typ))
fo.write("\tsym = VCC_MkSym(tl, \"%s\", " % self.nam) fo.write("\tsym = VCC_MkSym(tl, \"%s\", " % self.nam)
if (self.typ == "HEADER"): if (self.typ == "HEADER"):
fo.write(" SYM_NONE);\n") fo.write(" SYM_NONE, %d, %d);\n" % (self.vlo, self.vhi))
fo.write("\tAN(sym);\n"); fo.write("\tAN(sym);\n");
fo.write("\tsym->wildcard = vcc_Var_Wildcard;\n") fo.write("\tsym->wildcard = vcc_Var_Wildcard;\n")
else: else:
fo.write(" SYM_VAR);\n") fo.write(" SYM_VAR, %d, %d);\n" % (self.vlo, self.vhi))
fo.write("\tAN(sym);\n") fo.write("\tAN(sym);\n")
fo.write("\tsym->type = %s;\n" % self.typ) fo.write("\tsym->type = %s;\n" % self.typ)
fo.write("\tsym->eval = vcc_Eval_Var;\n") fo.write("\tsym->eval = vcc_Eval_Var;\n")
...@@ -205,7 +209,7 @@ class vardef(object): ...@@ -205,7 +209,7 @@ class vardef(object):
fo.write('";\n') fo.write('";\n')
elif len(self.rd): elif len(self.rd):
fo.write('\tsym->rname = "VRT_r_%s(ctx)";\n' % cnam) fo.write('\tsym->rname = "VRT_r_%s(ctx)";\n' % cnam)
fh.write("VCL_" + self.typ + " VRT_r_%s(VRT_CTX);\n" % cnam) varproto("VCL_" + self.typ + " VRT_r_%s(VRT_CTX)" % cnam)
fo.write("\tsym->r_methods =\n") fo.write("\tsym->r_methods =\n")
restrict(fo, self.rd) restrict(fo, self.rd)
fo.write(";\n") fo.write(";\n")
...@@ -216,17 +220,18 @@ class vardef(object): ...@@ -216,17 +220,18 @@ class vardef(object):
fo.write('";\n') fo.write('";\n')
elif len(self.wr): elif len(self.wr):
fo.write('\tsym->lname = "VRT_l_%s(ctx, ";\n' % cnam) fo.write('\tsym->lname = "VRT_l_%s(ctx, ";\n' % cnam)
fh.write("void VRT_l_%s(VRT_CTX, " % cnam) s = "void VRT_l_%s(VRT_CTX, " % cnam
if self.typ != "STRING" and self.typ != "BODY": if self.typ != "STRING" and self.typ != "BODY":
fh.write("VCL_" + self.typ + ");\n") s += "VCL_" + self.typ + ")"
else: else:
fh.write(ctyp + ", ...);\n") s += ctyp + ", ...)"
varproto(s);
fo.write("\tsym->w_methods =\n") fo.write("\tsym->w_methods =\n")
restrict(fo, self.wr) restrict(fo, self.wr)
fo.write(";\n") fo.write(";\n")
if len(self.uns): if len(self.uns):
fh.write("void VRT_u_%s(VRT_CTX);\n" % cnam) varproto("void VRT_u_%s(VRT_CTX)" % cnam)
fo.write('\tsym->uname = "VRT_u_%s(ctx)";\n' % cnam) fo.write('\tsym->uname = "VRT_u_%s(ctx)";\n' % cnam)
fo.write('\tsym->u_methods =\n') fo.write('\tsym->u_methods =\n')
restrict(fo, self.uns) restrict(fo, self.uns)
...@@ -297,8 +302,6 @@ def parse_var_doc(fn): ...@@ -297,8 +302,6 @@ def parse_var_doc(fn):
m += 1 m += 1
parse_var(l[n-2:m-1]) parse_var(l[n-2:m-1])
parse_var_doc(join(buildroot, "doc/sphinx/reference/vcl_var.rst"))
stv_variables = ( stv_variables = (
('free_space', 'BYTES', "0.", 'storage.<name>.free_space', """ ('free_space', 'BYTES', "0.", 'storage.<name>.free_space', """
Free space available in the named stevedore. Only available for Free space available in the named stevedore. Only available for
...@@ -722,11 +725,7 @@ vcc_Var_Init(struct vcc *tl) ...@@ -722,11 +725,7 @@ vcc_Var_Init(struct vcc *tl)
""") """)
parse_var_doc(join(buildroot, "doc/sphinx/reference/vcl_var.rst"))
for i in sp_variables.values():
i.emit()
# fo.write("\t{ NULL }\n};\n\n")
fo.write("}\n") fo.write("}\n")
for i in stv_variables: for i in stv_variables:
......
...@@ -364,7 +364,7 @@ vcc_act_synthetic(struct vcc *tl, struct token *t, struct symbol *sym) ...@@ -364,7 +364,7 @@ vcc_act_synthetic(struct vcc *tl, struct token *t, struct symbol *sym)
#define ACT(name, func, mask) \ #define ACT(name, func, mask) \
do { \ do { \
const char pp[] = #name; \ const char pp[] = #name; \
sym = VCC_MkSym(tl, pp, SYM_ACTION); \ sym = VCC_MkSym(tl, pp, SYM_ACTION, VCL_LOW, VCL_HIGH); \
AN(sym); \ AN(sym); \
sym->action = func; \ sym->action = func; \
sym->action_mask = (mask); \ sym->action_mask = (mask); \
......
...@@ -739,7 +739,8 @@ VCC_New(void) ...@@ -739,7 +739,8 @@ VCC_New(void)
assert(tl->fh != NULL); assert(tl->fh != NULL);
for (i = 1; i < VCL_MET_MAX; i++) { for (i = 1; i < VCL_MET_MAX; i++) {
sym = VCC_MkSym(tl, method_tab[i].name, SYM_SUB); sym = VCC_MkSym(tl, method_tab[i].name,
SYM_SUB, VCL_LOW, VCL_HIGH);
p = vcc_NewProc(tl, sym); p = vcc_NewProc(tl, sym);
p->method = &method_tab[i]; p->method = &method_tab[i];
VSB_printf(p->cname, "VGC_function_%s", p->method->name); VSB_printf(p->cname, "VGC_function_%s", p->method->name);
...@@ -822,7 +823,7 @@ vcc_predef_vcl(struct vcc *vcc, const char *name) ...@@ -822,7 +823,7 @@ vcc_predef_vcl(struct vcc *vcc, const char *name)
{ {
struct symbol *sym; struct symbol *sym;
sym = VCC_MkSym(vcc, name, SYM_VCL); sym = VCC_MkSym(vcc, name, SYM_VCL, VCL_LOW, VCL_HIGH);
AN(sym); AN(sym);
sym->type = VCL; sym->type = VCL;
sym->r_methods = VCL_MET_RECV; sym->r_methods = VCL_MET_RECV;
......
...@@ -338,7 +338,8 @@ void vcc_stevedore(struct vcc *vcc, const char *stv_name); ...@@ -338,7 +338,8 @@ void vcc_stevedore(struct vcc *vcc, const char *stv_name);
/* vcc_symb.c */ /* vcc_symb.c */
void VCC_PrintCName(struct vsb *vsb, const char *b, const char *e); void VCC_PrintCName(struct vsb *vsb, const char *b, const char *e);
struct symbol *VCC_MkSym(struct vcc *tl, const char *b, vcc_kind_t); struct symbol *VCC_MkSym(struct vcc *tl, const char *b, vcc_kind_t,
unsigned, unsigned);
extern const char XREF_NONE[]; extern const char XREF_NONE[];
extern const char XREF_DEF[]; extern const char XREF_DEF[];
extern const char XREF_REF[]; extern const char XREF_REF[];
......
...@@ -1280,25 +1280,25 @@ vcc_Expr_Init(struct vcc *tl) ...@@ -1280,25 +1280,25 @@ vcc_Expr_Init(struct vcc *tl)
{ {
struct symbol *sym; struct symbol *sym;
sym = VCC_MkSym(tl, "regsub", SYM_FUNC); sym = VCC_MkSym(tl, "regsub", SYM_FUNC, VCL_LOW, VCL_HIGH);
AN(sym); AN(sym);
sym->type = STRING; sym->type = STRING;
sym->eval = vcc_Eval_Regsub; sym->eval = vcc_Eval_Regsub;
sym->eval_priv = NULL; sym->eval_priv = NULL;
sym = VCC_MkSym(tl, "regsuball", SYM_FUNC); sym = VCC_MkSym(tl, "regsuball", SYM_FUNC, VCL_LOW, VCL_HIGH);
AN(sym); AN(sym);
sym->type = STRING; sym->type = STRING;
sym->eval = vcc_Eval_Regsub; sym->eval = vcc_Eval_Regsub;
sym->eval_priv = sym; sym->eval_priv = sym;
sym = VCC_MkSym(tl, "true", SYM_FUNC); sym = VCC_MkSym(tl, "true", SYM_FUNC, VCL_LOW, VCL_HIGH);
AN(sym); AN(sym);
sym->type = BOOL; sym->type = BOOL;
sym->eval = vcc_Eval_BoolConst; sym->eval = vcc_Eval_BoolConst;
sym->eval_priv = sym; sym->eval_priv = sym;
sym = VCC_MkSym(tl, "false", SYM_FUNC); sym = VCC_MkSym(tl, "false", SYM_FUNC, VCL_LOW, VCL_HIGH);
AN(sym); AN(sym);
sym->type = BOOL; sym->type = BOOL;
sym->eval = vcc_Eval_BoolConst; sym->eval = vcc_Eval_BoolConst;
......
...@@ -430,5 +430,5 @@ vcc_Parse_Init(struct vcc *tl) ...@@ -430,5 +430,5 @@ vcc_Parse_Init(struct vcc *tl)
struct toplev *tp; struct toplev *tp;
for (tp = toplev; tp->name != NULL; tp++) for (tp = toplev; tp->name != NULL; tp++)
AN(VCC_MkSym(tl, tp->name, SYM_NONE)); AN(VCC_MkSym(tl, tp->name, SYM_NONE, VCL_LOW, VCL_HIGH));
} }
...@@ -84,7 +84,7 @@ vcc_stevedore(struct vcc *vcc, const char *stv_name) ...@@ -84,7 +84,7 @@ vcc_stevedore(struct vcc *vcc, const char *stv_name)
CHECK_OBJ_NOTNULL(vcc, VCC_MAGIC); CHECK_OBJ_NOTNULL(vcc, VCC_MAGIC);
bprintf(buf, "storage.%s", stv_name); bprintf(buf, "storage.%s", stv_name);
sym = VCC_MkSym(vcc, buf, SYM_VAR); sym = VCC_MkSym(vcc, buf, SYM_VAR, VCL_LOW, VCL_40);
AN(sym); AN(sym);
sym->type = STEVEDORE; sym->type = STEVEDORE;
sym->eval = vcc_Eval_Var; sym->eval = vcc_Eval_Var;
...@@ -94,7 +94,7 @@ vcc_stevedore(struct vcc *vcc, const char *stv_name) ...@@ -94,7 +94,7 @@ vcc_stevedore(struct vcc *vcc, const char *stv_name)
for (sv = stvars; sv->name != NULL; sv++) { for (sv = stvars; sv->name != NULL; sv++) {
bprintf(buf, "storage.%s.%s", stv_name, sv->name); bprintf(buf, "storage.%s.%s", stv_name, sv->name);
sym = VCC_MkSym(vcc, buf, SYM_VAR); sym = VCC_MkSym(vcc, buf, SYM_VAR, VCL_LOW, VCL_40);
AN(sym); AN(sym);
sym->type = sv->type; sym->type = sv->type;
sym->eval = vcc_Eval_Var; sym->eval = vcc_Eval_Var;
......
...@@ -100,13 +100,15 @@ vcc_new_symbol(struct vcc *tl, const char *b, const char *e) ...@@ -100,13 +100,15 @@ vcc_new_symbol(struct vcc *tl, const char *b, const char *e)
static struct symbol * static struct symbol *
VCC_Symbol(struct vcc *tl, struct symbol *parent, VCC_Symbol(struct vcc *tl, struct symbol *parent,
const char *b, const char *e, vcc_kind_t kind, int create) const char *b, const char *e, vcc_kind_t kind,
int create, unsigned vlo, unsigned vhi)
{ {
const char *q; const char *q;
struct symbol *sym, *sym2 = NULL; struct symbol *sym, *sym2 = NULL;
size_t l; size_t l;
int i; int i;
assert(vlo <= vhi);
if (tl->symbols == NULL) if (tl->symbols == NULL)
tl->symbols = vcc_new_symbol(tl, "<root>", NULL); tl->symbols = vcc_new_symbol(tl, "<root>", NULL);
if (parent == NULL) if (parent == NULL)
...@@ -128,6 +130,8 @@ VCC_Symbol(struct vcc *tl, struct symbol *parent, ...@@ -128,6 +130,8 @@ VCC_Symbol(struct vcc *tl, struct symbol *parent,
assert(l > 0); assert(l > 0);
VTAILQ_FOREACH(sym, &parent->children, list) { VTAILQ_FOREACH(sym, &parent->children, list) {
if (sym->lorev > vhi || sym->hirev < vlo)
continue;
i = strncasecmp(sym->name, b, l); i = strncasecmp(sym->name, b, l);
if (i < 0) if (i < 0)
continue; continue;
...@@ -159,17 +163,21 @@ VCC_Symbol(struct vcc *tl, struct symbol *parent, ...@@ -159,17 +163,21 @@ VCC_Symbol(struct vcc *tl, struct symbol *parent,
if (i > 0 || (i == 0 && l < sym->nlen)) if (i > 0 || (i == 0 && l < sym->nlen))
break; break;
} }
sym2->lorev = vlo;
sym2->hirev = vhi;
if (sym == NULL) if (sym == NULL)
VTAILQ_INSERT_TAIL(&parent->children, sym2, list); VTAILQ_INSERT_TAIL(&parent->children, sym2, list);
else else
VTAILQ_INSERT_BEFORE(sym, sym2, list); VTAILQ_INSERT_BEFORE(sym, sym2, list);
return (VCC_Symbol(tl, parent, b, e, kind, -1)); return (VCC_Symbol(tl, parent, b, e, kind, -1, vlo, vhi));
} }
if (sym == NULL && create < 1) if (sym == NULL && create < 1)
return (sym); return (sym);
if (sym == NULL) { if (sym == NULL) {
sym = vcc_new_symbol(tl, b, q); sym = vcc_new_symbol(tl, b, q);
sym->parent = parent; sym->parent = parent;
sym->lorev = vlo;
sym->hirev = vhi;
if (sym2 != NULL) if (sym2 != NULL)
VTAILQ_INSERT_BEFORE(sym2, sym, list); VTAILQ_INSERT_BEFORE(sym2, sym, list);
else else
...@@ -180,7 +188,7 @@ VCC_Symbol(struct vcc *tl, struct symbol *parent, ...@@ -180,7 +188,7 @@ VCC_Symbol(struct vcc *tl, struct symbol *parent,
if (q == e) if (q == e)
return (sym); return (sym);
assert(*q == '.'); assert(*q == '.');
return (VCC_Symbol(tl, sym, ++q, e, kind, create)); return (VCC_Symbol(tl, sym, ++q, e, kind, create, vlo, vhi));
} }
const char XREF_NONE[] = "xref_none"; const char XREF_NONE[] = "xref_none";
...@@ -206,7 +214,7 @@ VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x) ...@@ -206,7 +214,7 @@ VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x)
} }
sym = VCC_Symbol(tl, NULL, tl->t->b, tl->t->e, kind, sym = VCC_Symbol(tl, NULL, tl->t->b, tl->t->e, kind,
e == SYMTAB_CREATE ? 1 : 0); e == SYMTAB_CREATE ? 1 : 0, tl->syntax, tl->syntax);
if (sym == NULL && e == SYMTAB_NOERR) if (sym == NULL && e == SYMTAB_NOERR)
return (sym); return (sym);
if (sym == NULL) { if (sym == NULL) {
...@@ -267,11 +275,12 @@ VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x) ...@@ -267,11 +275,12 @@ VCC_SymbolGet(struct vcc *tl, vcc_kind_t kind, const char *e, const char *x)
} }
struct symbol * struct symbol *
VCC_MkSym(struct vcc *tl, const char *b, vcc_kind_t kind) VCC_MkSym(struct vcc *tl, const char *b, vcc_kind_t kind,
unsigned vlo, unsigned vhi)
{ {
struct symbol *sym; struct symbol *sym;
sym = VCC_Symbol(tl, NULL, b, NULL, kind, 1); sym = VCC_Symbol(tl, NULL, b, NULL, kind, 1, vlo, vhi);
sym->noref = 1; sym->noref = 1;
return (sym); return (sym);
} }
......
...@@ -94,7 +94,7 @@ vcc_ParseImport(struct vcc *tl) ...@@ -94,7 +94,7 @@ vcc_ParseImport(struct vcc *tl)
} }
bprintf(fn, "%.*s", PF(mod)); bprintf(fn, "%.*s", PF(mod));
msym = VCC_MkSym(tl, fn, SYM_VMOD); msym = VCC_MkSym(tl, fn, SYM_VMOD, VCL_LOW, VCL_HIGH);
ERRCHK(tl); ERRCHK(tl);
AN(msym); AN(msym);
msym->def_b = t1; msym->def_b = t1;
...@@ -223,7 +223,7 @@ vcc_ParseImport(struct vcc *tl) ...@@ -223,7 +223,7 @@ vcc_ParseImport(struct vcc *tl)
p = *spec; p = *spec;
if (!strcmp(p, "$OBJ")) { if (!strcmp(p, "$OBJ")) {
p += strlen(p) + 1; p += strlen(p) + 1;
sym = VCC_MkSym(tl, p, SYM_OBJECT); sym = VCC_MkSym(tl, p, SYM_OBJECT, VCL_LOW, VCL_HIGH);
XXXAN(sym); XXXAN(sym);
sym->extra = p; sym->extra = p;
sym->vmod = msym->name; sym->vmod = msym->name;
...@@ -242,7 +242,7 @@ vcc_ParseImport(struct vcc *tl) ...@@ -242,7 +242,7 @@ vcc_ParseImport(struct vcc *tl)
p, PF(mod)); p, PF(mod));
} else if (!strcmp(p, "$FUNC")) { } else if (!strcmp(p, "$FUNC")) {
p += strlen(p) + 1; p += strlen(p) + 1;
sym = VCC_MkSym(tl, p, SYM_FUNC); sym = VCC_MkSym(tl, p, SYM_FUNC, VCL_LOW, VCL_HIGH);
ERRCHK(tl); ERRCHK(tl);
AN(sym); AN(sym);
sym->action = vcc_Act_Call; sym->action = vcc_Act_Call;
...@@ -331,7 +331,7 @@ vcc_Act_New(struct vcc *tl, struct token *t, struct symbol *sym) ...@@ -331,7 +331,7 @@ vcc_Act_New(struct vcc *tl, struct token *t, struct symbol *sym)
while (*p != '\0') { while (*p != '\0') {
p += strlen(s_obj); p += strlen(s_obj);
bprintf(buf2, "%s%s", sy1->name, p); bprintf(buf2, "%s%s", sy1->name, p);
sy3 = VCC_MkSym(tl, buf2, SYM_FUNC); sy3 = VCC_MkSym(tl, buf2, SYM_FUNC, VCL_LOW, VCL_HIGH);
AN(sy3); AN(sy3);
sy3->action = vcc_Act_Call; sy3->action = vcc_Act_Call;
sy3->eval = vcc_Eval_SymFunc; sy3->eval = vcc_Eval_SymFunc;
......
...@@ -338,8 +338,9 @@ vcc_xreftable(struct vcc *tl, const struct symbol *sym) ...@@ -338,8 +338,9 @@ vcc_xreftable(struct vcc *tl, const struct symbol *sym)
CHECK_OBJ_NOTNULL(sym, SYMBOL_MAGIC); CHECK_OBJ_NOTNULL(sym, SYMBOL_MAGIC);
CHECK_OBJ_NOTNULL(sym->kind, KIND_MAGIC); CHECK_OBJ_NOTNULL(sym->kind, KIND_MAGIC);
CHECK_OBJ_NOTNULL(sym->type, TYPE_MAGIC); CHECK_OBJ_NOTNULL(sym->type, TYPE_MAGIC);
Fc(tl, 0, " * %-7s ", sym->kind->name); Fc(tl, 0, " * %-8s ", sym->kind->name);
Fc(tl, 0, " %-9s ", sym->type->name); Fc(tl, 0, " %-9s ", sym->type->name);
Fc(tl, 0, " %2u %2u ", sym->lorev, sym->hirev);
vcc_pnam(tl, sym); vcc_pnam(tl, sym);
if (sym->wildcard != NULL) if (sym->wildcard != NULL)
Fc(tl, 0, "*"); Fc(tl, 0, "*");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment