Mailing List Archive

[master] b437976db Create types for VMOD objects
commit b437976db3d8664ceab0ca235e32428e31f7f49d
Author: Dridi Boukelmoune <dridi.boukelmoune@gmail.com>
Date: Fri Nov 29 15:55:14 2019 +0100

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.

diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index caf735f53..d24ebf5e1 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -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;

diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 14f2975a6..1fda4241b 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -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;
diff --git a/lib/libvcc/vcc_symb.c b/lib/libvcc/vcc_symb.c
index 7630f4e14..ea2d78d4c 100644
--- a/lib/libvcc/vcc_symb.c
+++ b/lib/libvcc/vcc_symb.c
@@ -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);
}

diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index fbe422435..acef1511b 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -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);
}
}

_______________________________________________
varnish-commit mailing list
varnish-commit@varnish-cache.org
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-commit