2017-03-12 22:23:27 +00:00
|
|
|
#ifndef thread_h_INCLUDED
|
|
|
|
#define thread_h_INCLUDED
|
|
|
|
|
|
|
|
#include "datatypes.h"
|
|
|
|
|
|
|
|
/* Get the current stack frame */
|
|
|
|
#define gst_thread_stack(t) ((t)->data + (t)->count)
|
|
|
|
|
|
|
|
/* Create a new thread */
|
|
|
|
GstThread *gst_thread(Gst *vm, GstValue callee, uint32_t capacity);
|
|
|
|
|
|
|
|
/* Ensure that the thread has enough EXTRA capacity */
|
|
|
|
void gst_thread_ensure_extra(Gst *vm, GstThread *thread, uint32_t extra);
|
|
|
|
|
|
|
|
/* Push a value on the current stack frame*/
|
|
|
|
void gst_thread_push(Gst *vm, GstThread *thread, GstValue x);
|
|
|
|
|
|
|
|
/* Push n nils onto the stack */
|
|
|
|
void gst_thread_pushnil(Gst *vm, GstThread *thread, uint32_t n);
|
|
|
|
|
|
|
|
/* Package up extra args after and including n into tuple at n*/
|
|
|
|
void gst_thread_tuplepack(Gst *vm, GstThread *thread, uint32_t n);
|
|
|
|
|
2017-03-14 19:55:50 +00:00
|
|
|
/* Expand a callee on the stack frame to its delegate function. This means that
|
|
|
|
* objects and userdata that have a "call" attribut in their class will be
|
|
|
|
* replaced with their delegate function. Call this before pushing any
|
|
|
|
* arguments to the stack. Returns the new stack. */
|
|
|
|
GstValue *gst_thread_expand_callable(Gst *vm, GstThread *thread, GstValue callee);
|
|
|
|
|
2017-03-12 22:23:27 +00:00
|
|
|
/* Push a stack frame to a thread, with space for arity arguments. Returns the new
|
|
|
|
* stack. */
|
|
|
|
GstValue *gst_thread_beginframe(Gst *vm, GstThread *thread, GstValue callee, uint32_t arity);
|
|
|
|
|
|
|
|
/* After pushing arguments to a stack frame created with gst_thread_beginframe, call this
|
|
|
|
* to finalize the frame before starting a function call. */
|
|
|
|
void gst_thread_endframe(Gst *vm, GstThread *thread);
|
|
|
|
|
|
|
|
/* Pop a stack frame from the thread. Returns the new stack frame, or
|
|
|
|
* NULL if there are no more frames */
|
|
|
|
GstValue *gst_thread_popframe(Gst *vm, GstThread *thread);
|
|
|
|
|
|
|
|
/* Move the current stack frame over its parent stack frame, allowing
|
|
|
|
* for primitive tail calls. Return new stack. */
|
|
|
|
GstValue *gst_thread_tail(Gst *vm, GstThread *thread);
|
|
|
|
|
|
|
|
#endif // thread_h_INCLUDED
|
|
|
|
|