thesis-lisp/vm/vmstack.c
2021-04-07 22:24:33 +03:00

40 lines
855 B
C

#include "vmstate.h"
#include <errno.h>
int vm_pop(struct vm_state *vm, uint64_t *w) {
return stack_pop(&vm->data_stack, w);
}
int vm_pop_integer(struct vm_state *vm, int64_t *v) {
int res;
uint64_t w;
if ((res = stack_pop(&vm->data_stack, &w)) != 0) {
return res;
}
if (w & FLAG_REF) {
return -EINVAL;
}
if (w & (1ULL << 62)) {
w |= 1ULL << 63;
}
*v = w;
return 0;
}
int vm_push_integer(struct vm_state *vm, int64_t v) {
return stack_push(&vm->data_stack, v & ~FLAG_REF);
}
int vm_push_bool(struct vm_state *vm, int v) {
if (v) {
return stack_push(&vm->data_stack, 1);
} else {
return stack_push(&vm->data_stack, FLAG_REF);
}
}
int vm_push_ref(struct vm_state *vm, struct vm_value *obj) {
return stack_push(&vm->data_stack, encode_ref(obj));
}