40 lines
855 B
C
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));
|
|
}
|