summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/callable.h
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-05-16 00:19:13 +0000
committerKarl Berry <karl@freefriends.org>2009-05-16 00:19:13 +0000
commitbab45528d65eaafe68a705dbb2a57075c7b7cbd8 (patch)
tree10b4ae2b5195c8dede153ab89359ec00f55f325f /Build/source/utils/asymptote/callable.h
parent8643d90372e9c31e0f461c15c596b60a545bd7d3 (diff)
asymptote 1.72 sources (not integrated into build yet)
git-svn-id: svn://tug.org/texlive/trunk@13110 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/callable.h')
-rw-r--r--Build/source/utils/asymptote/callable.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/callable.h b/Build/source/utils/asymptote/callable.h
new file mode 100644
index 00000000000..4274218f8fd
--- /dev/null
+++ b/Build/source/utils/asymptote/callable.h
@@ -0,0 +1,74 @@
+/*****
+ * callable.h
+ * Tom Prince 2005/06/19
+ *
+ * Runtime representation of functions.
+ *****/
+
+#ifndef CALLABLE_H
+#define CALLABLE_H
+
+#include "common.h"
+#include "item.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; }
+};
+
+class nullfunc : public callable
+{
+private:
+ nullfunc() {}
+ static nullfunc func;
+public:
+ virtual void call (stack*);
+ virtual bool compare(callable*);
+ static callable* instance() { return &func; }
+};
+
+// 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*);
+};
+
+class bfunc : public callable
+{
+public:
+ bfunc(bltin b) : func(b) {}
+ virtual void call (stack *s) { func(s); }
+ virtual bool compare(callable*);
+private:
+ bltin func;
+};
+
+class thunk : public callable
+{
+public:
+ thunk(callable *f, item i) : func(f), arg(i) {}
+ virtual void call (stack*);
+private:
+ callable *func;
+ item arg;
+};
+
+} // 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