summaryrefslogtreecommitdiff
path: root/graphics/asymptote/builtin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/builtin.cc')
-rw-r--r--graphics/asymptote/builtin.cc53
1 files changed, 29 insertions, 24 deletions
diff --git a/graphics/asymptote/builtin.cc b/graphics/asymptote/builtin.cc
index bb706f99a8..2bf68d9b1a 100644
--- a/graphics/asymptote/builtin.cc
+++ b/graphics/asymptote/builtin.cc
@@ -81,7 +81,7 @@ void gen_rungsl_venv(venv &ve);
void addType(tenv &te, symbol name, ty *t)
{
- te.enter(name, new tyEntry(t,0,0,position()));
+ te.enter(name, new tyEntry(t,0,0,nullPos));
}
// The base environments for built-in types and functions
@@ -127,7 +127,7 @@ function *functionFromFormals(ty *result,
return fun;
}
-void addFunc(venv &ve, access *a, ty *result, symbol id,
+varEntry *addFunc(venv &ve, access *a, ty *result, symbol id,
formal f1=noformal, formal f2=noformal, formal f3=noformal,
formal f4=noformal, formal f5=noformal, formal f6=noformal,
formal f7=noformal, formal f8=noformal, formal f9=noformal,
@@ -140,13 +140,14 @@ void addFunc(venv &ve, access *a, ty *result, symbol id,
// NOTE: If the function is a field, we should encode the defining record in
// the entry
- varEntry *ent = new varEntry(fun, a, 0, position());
+ varEntry *ent = new varEntry(fun, a, 0, nullPos);
ve.enter(id, ent);
+ return ent;
}
// Add a function with one or more default arguments.
-void addFunc(venv &ve, bltin f, ty *result, symbol name,
+varEntry *addFunc(venv &ve, bltin f, ty *result, symbol name,
formal f1, formal f2, formal f3, formal f4, formal f5, formal f6,
formal f7, formal f8, formal f9, formal fA, formal fB, formal fC,
formal fD, formal fE, formal fF, formal fG, formal fH, formal fI)
@@ -171,8 +172,8 @@ void addFunc(venv &ve, bltin f, ty *result, symbol name,
#endif
access *a = new bltinAccess(f);
- addFunc(ve,a,result,name,f1,f2,f3,f4,f5,f6,f7,f8,f9,
- fA,fB,fC,fD,fE,fF,fG,fH,fI);
+ return addFunc(ve,a,result,name,f1,f2,f3,f4,f5,f6,f7,f8,f9,
+ fA,fB,fC,fD,fE,fF,fG,fH,fI);
}
void addOpenFunc(venv &ve, bltin f, ty *result, symbol name)
@@ -182,7 +183,7 @@ void addOpenFunc(venv &ve, bltin f, ty *result, symbol name)
REGISTER_BLTIN(f, name);
access *a= new bltinAccess(f);
- varEntry *ent = new varEntry(fun, a, 0, position());
+ varEntry *ent = new varEntry(fun, a, 0, nullPos);
ve.enter(name, ent);
}
@@ -210,7 +211,7 @@ void addRestFunc(venv &ve, bltin f, ty *result, symbol name, formal frest,
if (frest.t) fun->addRest(frest);
- varEntry *ent = new varEntry(fun, a, 0, position());
+ varEntry *ent = new varEntry(fun, a, 0, nullPos);
ve.enter(name, ent);
}
@@ -301,7 +302,7 @@ template<class T>
void addVariable(venv &ve, T *ref, ty *t, symbol name,
record *module=settings::getSettingsModule()) {
access *a = new refAccess<T>(ref);
- varEntry *ent = new varEntry(t, a, PUBLIC, module, 0, position());
+ varEntry *ent = new varEntry(t, a, PUBLIC, module, 0, nullPos);
ve.enter(name, ent);
}
@@ -312,7 +313,7 @@ void addVariable(venv &ve, T value, ty *t, symbol name,
item* ref=new item;
*ref=value;
access *a = new itemRefAccess(ref);
- varEntry *ent = new varEntry(t, a, perm, module, 0, position());
+ varEntry *ent = new varEntry(t, a, perm, module, 0, nullPos);
ve.enter(name, ent);
}
@@ -659,22 +660,26 @@ void addArrayOps(venv &ve, types::array *t)
}
}
-void addRecordOps(venv &ve, record *r)
+void addRecordOps(record* r)
{
- addFunc(ve, run::boolMemEq, primBoolean(), SYM(alias), formal(r, SYM(a)),
- formal(r, SYM(b)));
- addFunc(ve, run::boolMemEq, primBoolean(), SYM_EQ, formal(r, SYM(a)),
- formal(r, SYM(b)));
- addFunc(ve, run::boolMemNeq, primBoolean(), SYM_NEQ, formal(r, SYM(a)),
- formal(r, SYM(b)));
+ assert(r);
+ trans::venv &ve = r->e.ve;
+ auto addOp= [&ve](vm::bltin f, ty* result, symbol name, auto&&... formals) {
+ varEntry* fVar=
+ addFunc(ve, f, result, name, std::forward<formal>(formals)...);
+ ve.registerAutoUnravel(name, fVar, AutounravelPriority::OFFER);
+ };
+ // alias
+ addOp(run::boolMemEq, primBoolean(), SYM(alias), formal(r, SYM(a)),
+ formal(r, SYM(b)));
+ // operator==
+ addOp(run::boolMemEq, primBoolean(), SYM_EQ, formal(r, SYM(a)),
+ formal(r, SYM(b)));
+ // operator!=
+ addOp(run::boolMemNeq, primBoolean(), SYM_NEQ, formal(r, SYM(a)),
+ formal(r, SYM(b)));
}
-void addFunctionOps(venv &ve, function *f)
-{
- // No function ops.
-}
-
-
void addOperators(venv &ve)
{
addSimpleOperator(ve,binaryOp<string,plus>,primString(),SYM_PLUS);
@@ -755,7 +760,7 @@ dummyRecord *createDummyRecord(venv &ve, symbol name)
dummyRecord *r=new dummyRecord(name);
vm::vmFrame *f = make_dummyframe(name);
addConstant(ve, f, r, name);
- addRecordOps(ve, r);
+ addRecordOps(r);
return r;
}