Commit b437976d authored by Dridi Boukelmoune's avatar Dridi Boukelmoune

Create types for VMOD objects

Now they appear as ${vmod}.${constructor} instead of VOID in the symbol
table. The effective type is based on the VMOD's name, regardless of
whether it was imported with an alias or not.
parent e673718d
......@@ -826,6 +826,7 @@ VCC_New(void)
VTAILQ_INIT(&tl->procs);
VTAILQ_INIT(&tl->sym_objects);
VTAILQ_INIT(&tl->sym_vmods);
VTAILQ_INIT(&tl->vmod_objects);
tl->nsources = 0;
......
......@@ -76,6 +76,7 @@ struct expr;
struct vcc;
struct vjsn_val;
struct symbol;
struct vmod_obj;
struct source {
VTAILQ_ENTRY(source) list;
......@@ -276,6 +277,7 @@ struct vcc {
VTAILQ_HEAD(, symbol) sym_objects;
VTAILQ_HEAD(, symbol) sym_vmods;
VTAILQ_HEAD(, vmod_obj) vmod_objects;
unsigned unique;
unsigned vmod_count;
......
......@@ -386,6 +386,7 @@ VCC_TypeSymbol(struct vcc *tl, vcc_kind_t kind, vcc_type_t type)
sym = VCC_SymbolGet(tl, SYM_TYPE, kind, SYMTAB_NOERR, XREF_NONE);
tl->t = t0;
VSB_destroy(&buf);
return (sym);
}
......
......@@ -49,6 +49,14 @@ struct vmod_open {
const char *err;
};
struct vmod_obj {
unsigned magic;
#define VMOD_OBJ_MAGIC 0x349885f8
char *name;
struct type type[1];
VTAILQ_ENTRY(vmod_obj) list;
};
static int
vcc_path_dlopen(void *priv, const char *fn)
{
......@@ -201,6 +209,29 @@ vcc_vmod_kind(const char *type)
return (SYM_NONE);
}
static void
vcc_VmodObject(struct vcc *tl, struct symbol *sym)
{
struct vmod_obj *obj;
struct vsb *buf;
buf = VSB_new_auto();
AN(buf);
VSB_printf(buf, "%s.%s", sym->vmod_name, sym->name);
AZ(VSB_finish(buf));
ALLOC_OBJ(obj, VMOD_OBJ_MAGIC);
AN(obj);
REPLACE(obj->name, VSB_data(buf));
INIT_OBJ(obj->type, TYPE_MAGIC);
obj->type->name = obj->name;
sym->type = obj->type;
VTAILQ_INSERT_TAIL(&tl->vmod_objects, obj, list);
VSB_destroy(&buf);
}
static void
vcc_VmodSymbols(struct vcc *tl, struct symbol *msym)
{
......@@ -265,6 +296,7 @@ vcc_VmodSymbols(struct vcc *tl, struct symbol *msym)
assert(kind == SYM_OBJECT);
fsym->eval_priv = vv2;
fsym->vmod_name = msym->vmod_name;
vcc_VmodObject(tl, fsym);
}
}
......
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