summaryrefslogtreecommitdiff
path: root/graphics/asymptote/callable.h
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/callable.h')
-rw-r--r--graphics/asymptote/callable.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/graphics/asymptote/callable.h b/graphics/asymptote/callable.h
new file mode 100644
index 0000000000..851ccb4623
--- /dev/null
+++ b/graphics/asymptote/callable.h
@@ -0,0 +1,91 @@
+/*****
+ * callable.h
+ * Tom Prince 2005/06/19
+ *
+ * Runtime representation of functions.
+ *****/
+
+#ifndef CALLABLE_H
+#define CALLABLE_H
+
+#include "common.h"
+#include "item.h"
+#include "inst.h"
+
+namespace vm {
+
+class stack;
+typedef void (*bltin)(stack *s);
+
+struct callable : public gc
+{
+ virtual void call(stack *) = 0;
+ virtual ~callable();
+ virtual bool compare(callable*) { return false; }
+
+ // For debugging:
+ virtual void print(ostream& out) = 0;
+};
+
+class nullfunc : public callable
+{
+private:
+ nullfunc() {}
+ static nullfunc func;
+public:
+ virtual void call (stack*);
+ virtual bool compare(callable*);
+ static callable* instance() { return &func; }
+
+ void print(ostream& out);
+};
+
+// How a function reference to a non-builtin function is stored.
+struct func : public callable {
+ lambda *body;
+ frame *closure;
+ func () : body(), closure() {}
+ virtual void call (stack*);
+ virtual bool compare(callable*);
+
+ void print(ostream& out);
+};
+
+class bfunc : public callable
+{
+public:
+ bfunc(bltin b) : func(b) {}
+ virtual void call (stack *s) { func(s); }
+ virtual bool compare(callable*);
+
+ void print(ostream& out);
+private:
+ bltin func;
+};
+
+class thunk : public callable
+{
+public:
+ thunk(callable *f, item i) : func(f), arg(i) {}
+ virtual void call (stack*);
+
+ void print(ostream& out);
+private:
+ callable *func;
+ item arg;
+};
+
+inline ostream& operator<< (ostream& out, callable &c) {
+ c.print(out);
+ return out;
+}
+
+} // namespace vm
+
+GC_DECLARE_PTRFREE(vm::nullfunc);
+
+// I believe this is safe, as pointers to C++ functions do not point to
+// the heap.
+GC_DECLARE_PTRFREE(vm::bfunc);
+
+#endif // CALLABLE_H