diff options
author | Karl Berry <karl@freefriends.org> | 2009-05-16 00:19:13 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-05-16 00:19:13 +0000 |
commit | bab45528d65eaafe68a705dbb2a57075c7b7cbd8 (patch) | |
tree | 10b4ae2b5195c8dede153ab89359ec00f55f325f /Build/source/utils/asymptote/callable.h | |
parent | 8643d90372e9c31e0f461c15c596b60a545bd7d3 (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.h | 74 |
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 |