summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/varinit.h
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/varinit.h')
-rw-r--r--Build/source/utils/asymptote/varinit.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/varinit.h b/Build/source/utils/asymptote/varinit.h
new file mode 100644
index 00000000000..55c47665945
--- /dev/null
+++ b/Build/source/utils/asymptote/varinit.h
@@ -0,0 +1,87 @@
+/*****
+ * varinit.h
+ * Andy Hammerlindl 2005/07/01
+ *
+ * Variable initializers are syntax that finish code such as
+ * Int var = ...
+ * As such, they are translated to yield a certain type, the type of the
+ * variable. Expressions are a special case that can be translated without an
+ * associated variable or its type.
+ *****/
+
+#ifndef VARINIT_H
+#define VARINIT_H
+
+#include "types.h"
+#include "symbol.h"
+#include "absyn.h"
+
+namespace absyntax {
+
+using trans::coenv;
+using trans::access;
+using sym::symbol;
+using types::array;
+
+class varinit : public absyn {
+public:
+ varinit(position pos)
+ : absyn(pos) {}
+
+ // This determines what instruction are needed to put the associated
+ // value onto the stack, then adds those instructions to the current
+ // lambda in e.
+ // In some expressions and initializers, the target type needs to be
+ // known in order to translate properly. For most expressions, this is
+ // kept to a minimum.
+ // For expression, this also allows an implicit cast, hence the name.
+ virtual void transToType(coenv &e, types::ty *target) = 0;
+};
+
+// A default initializer. For example:
+// int a;
+// is in some sense equivalent to
+// int a=0;
+// where the definit for Int is a function that returns 0.
+class definit : public varinit {
+public:
+ definit(position pos)
+ : varinit(pos) {}
+
+ void prettyprint(ostream &out, Int indent);
+
+ void transToType(coenv &e, types::ty *target);
+};
+
+class arrayinit : public varinit {
+ mem::list<varinit *> inits;
+
+ varinit *rest;
+public:
+ arrayinit(position pos)
+ : varinit(pos), rest(0) {}
+
+ virtual ~arrayinit()
+ {}
+
+ void prettyprint(ostream &out, Int indent);
+
+ // Encodes the instructions to make an array from size elements on the stack.
+ static void transMaker(coenv &e, Int size, bool rest);
+
+ void transToType(coenv &e, types::ty *target);
+
+ void add(varinit *init) {
+ inits.push_back(init);
+ }
+
+ void addRest(varinit *init) {
+ rest=init;
+ }
+
+ friend class joinExp;
+};
+
+} // namespace absyntax
+
+#endif