summaryrefslogtreecommitdiffstats
path: root/frame_layout.h
diff options
context:
space:
mode:
Diffstat (limited to 'frame_layout.h')
-rw-r--r--frame_layout.h86
1 files changed, 0 insertions, 86 deletions
diff --git a/frame_layout.h b/frame_layout.h
deleted file mode 100644
index 18a0a652..00000000
--- a/frame_layout.h
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifndef FRAME_LAYOUT_H
-#include "newstack.h"
-#include "bytecode.h"
-
-struct closure {
- struct bytecode* bc;
- stack_ptr env;
-};
-
-union frame_entry {
- struct closure closure;
- jv localvar;
-};
-
-struct frame {
- struct bytecode* bc;
- stack_ptr env;
- stack_ptr retdata;
- uint16_t* retaddr;
- /* bc->nclosures closures followed by bc->nlocals local variables */
- union frame_entry entries[0];
-};
-
-static int frame_size(struct bytecode* bc) {
- return sizeof(struct frame) + sizeof(union frame_entry) * (bc->nclosures + bc->nlocals);
-}
-
-static struct closure* frame_closure_arg(struct frame* fr, int closure) {
- assert(closure >= 0);
- assert(closure < fr->bc->nclosures);
- return &fr->entries[closure].closure;
-}
-
-static jv* frame_local_var(struct frame* fr, int var) {
- assert(var >= 0);
- assert(var < fr->bc->nlocals);
- return &fr->entries[fr->bc->nclosures + var].localvar;
-}
-
-static struct frame* frame_current(struct stack* stk, stack_ptr idx) {
- struct frame* fp = stack_block(stk, idx);
-
- stack_ptr next = *stack_block_next(stk, idx);
- if (next) {
- struct frame* fpnext = stack_block(stk, next);
- struct bytecode* bc = fpnext->bc;
- assert(fp->retaddr >= bc->code && fp->retaddr < bc->code + bc->codelen);
- } else {
- assert(fp->retaddr == 0);
- }
- return fp;
-}
-
-static stack_ptr frame_get_level(struct stack* stk, stack_ptr fr, int level) {
- for (int i=0; i<level; i++) {
- struct frame* fp = stack_block(stk, fr);
- fr = fp->env;
- }
- return fr;
-}
-
-static stack_ptr frame_push(struct stack* stk, stack_ptr curr, struct closure cl, uint16_t* retaddr, stack_ptr datastk) {
- stack_ptr fpidx = stack_push_block(stk, curr, frame_size(cl.bc));
- struct frame* fp = stack_block(stk, fpidx);
- fp->bc = cl.bc;
- fp->env = cl.env;
- fp->retdata = datastk;
- fp->retaddr = retaddr;
- for (int i=0; i<cl.bc->nlocals; i++) {
- *frame_local_var(fp, i) = jv_invalid();
- }
- return fpidx;
-}
-
-static stack_ptr frame_pop(struct stack* stk, stack_ptr curr) {
- struct frame* fp = frame_current(stk, curr);
- if (stack_pop_will_free(stk, curr)) {
- int nlocals = fp->bc->nlocals;
- for (int i=0; i<nlocals; i++) {
- jv_free(*frame_local_var(fp, i));
- }
- }
- return stack_pop_block(stk, curr, frame_size(fp->bc));
-}
-
-#endif