static void load_array(void) { struct number *inumber, *n; struct stack *stack; struct value *v; struct value copy; u_long idx; int reg; reg = readreg(); if (reg >= 0) { inumber = pop_number(); if (inumber == NULL) return; idx = get_ulong(inumber); if (BN_is_negative(inumber->number)) warnx("negative idx"); else if (idx == ULONG_MAX || idx > MAX_ARRAY_INDEX) warnx("idx too big"); else { stack = &bmachine.reg[reg]; v = frame_retrieve(stack, idx); if (v == NULL || v->type == BCODE_NONE) { n = new_number(); bn_check(BN_zero(n->number)); push_number(n); } else push(stack_dup_value(v, ©)); } free_number(inumber); } }
static void load_array(void) { int reg; struct number *inumber, *n; u_long index; struct stack *stack; struct value *v, copy; reg = readreg(); if (reg >= 0) { inumber = pop_number(); if (inumber == NULL) return; index = get_ulong(inumber); if (BN_cmp(inumber->number, &zero) < 0) warnx("negative index"); else if (index == BN_MASK2 || index > MAX_ARRAY_INDEX) warnx("index too big"); else { stack = &bmachine.reg[reg]; v = frame_retrieve(stack, index); if (v == NULL) { n = new_number(); bn_check(BN_zero(n->number)); push_number(n); } else push(stack_dup_value(v, ©)); } free_number(inumber); } }
void stack_dup(struct stack *stack) { struct value *value; struct value copy; value = stack_tos(stack); if (value == NULL) { warnx("stack empty"); return; } stack_push(stack, stack_dup_value(value, ©)); }
static struct array * array_dup(const struct array *a) { struct array *n; u_int i; if (a == NULL) return NULL; n = array_new(); array_grow(n, a->size); for (i = 0; i < a->size; i++) stack_dup_value(&a->data[i], &n->data[i]); return n; }
static void load(void) { int idx; struct value *v, copy; struct number *n; idx = readreg(); if (idx >= 0) { v = stack_tos(&bmachine.reg[idx]); if (v == NULL) { n = new_number(); bn_check(BN_zero(n->number)); push_number(n); } else push(stack_dup_value(v, ©)); } }
static void load_stack(void) { int index; struct stack *stack; struct value *value, copy; index = readreg(); if (index >= 0) { stack = &bmachine.reg[index]; value = NULL; if (stack_size(stack) > 0) { value = stack_pop(stack); } if (value != NULL) push(stack_dup_value(value, ©)); else warnx("stack register '%c' (0%o) is empty", index, index); } }