Commit 787a505a authored by Dridi Boukelmoune's avatar Dridi Boukelmoune

Add VMOD object methods to the symbol table

Although at this point we are still using the per-instance symbols from
the table.

For example with the following:

    new fb1 = directors.fallback();
    new fb2 = directors.fallback();

We will get the following entries in the symbol table:

    object    directors.fallback  41 41 directors.fallback
    method    VOID                40 41 directors.fallback.add_backend
    method    BACKEND             40 41 directors.fallback.backend
    method    VOID                40 41 directors.fallback.remove_backend
    instance  INSTANCE            41 41 fb1
    func      VOID                40 41 fb1.add_backend
    func      BACKEND             40 41 fb1.backend
    func      VOID                40 41 fb1.remove_backend
    instance  INSTANCE            41 41 fb2
    func      VOID                40 41 fb2.add_backend
    func      BACKEND             40 41 fb2.backend
    func      VOID                40 41 fb2.remove_backend

As long as the func symbols exist, and the instance symbols have the
generic type INSTANCE, the expression parser will not try to evaluate
the method symbols.

But the type-based symbols aren't ready to be evaluated yet so we can
have peaceful cohabitation for now. This makes this part of the code
even more complicated but it will eventually straighten up once the
SYM_FUNC symbols are gone.
parent b437976d
......@@ -244,7 +244,7 @@ vcc_VmodSymbols(struct vcc *tl, struct symbol *msym)
if (msym->kind == SYM_VMOD) {
CAST_OBJ_NOTNULL(vj, msym->eval_priv, VJSN_MAGIC);
vv = VTAILQ_FIRST(&vj->value->children);
} else if (msym->kind == SYM_INSTANCE) {
} else if (msym->kind == SYM_INSTANCE || msym->kind == SYM_OBJECT) {
CAST_OBJ_NOTNULL(vv, msym->eval_priv, VJSN_VAL_MAGIC);
} else {
WRONG("symbol kind");
......@@ -281,7 +281,8 @@ vcc_VmodSymbols(struct vcc *tl, struct symbol *msym)
*/
VSB_clear(buf);
VSB_printf(buf, "%s.%s", msym->name, vv2->value);
VCC_SymName(buf, msym);
VSB_printf(buf, ".%s", vv2->value);
AZ(VSB_finish(buf));
fsym = VCC_MkSym(tl, VSB_data(buf), SYM_MAIN, kind,
VCL_LOW, VCL_HIGH);
......@@ -289,14 +290,19 @@ vcc_VmodSymbols(struct vcc *tl, struct symbol *msym)
if (kind == SYM_FUNC) {
func_sym(fsym, msym->vmod_name, VTAILQ_NEXT(vv2, list));
/* XXX: until we use SYM_METHOD, string check. */
if (!strcmp(vv1->value, "$METHOD"))
/* XXX: until we use SYM_METHOD only, string check. */
if (!strcmp(vv1->value, "$METHOD")) {
fsym->extra = msym->rname;
/* XXX: cohabitation temporary hack */
if (msym->kind == SYM_OBJECT)
fsym->kind = SYM_METHOD;
}
} else {
assert(kind == SYM_OBJECT);
fsym->eval_priv = vv2;
fsym->vmod_name = msym->vmod_name;
vcc_VmodObject(tl, fsym);
vcc_VmodSymbols(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