case AST_OP_GT: EMIT(BC_OP_LE, BC_OP_NOT); break;
case AST_OP_LE: EMIT(BC_OP_LE); break;
case AST_OP_GE: EMIT(BC_OP_LT, BC_OP_NOT); break;
+ case AST_OP_AND: EMIT(BC_OP_AND); break;
+ case AST_OP_OR: EMIT(BC_OP_OR); break;
case AST_OP_INDEX: EMIT(BC_OP_INDEX); break;
case AST_OP_DIVBY: EMIT(BC_OP_MOD, BC_LD_IMM); EARG(0); EMIT(BC_OP_EQ); break;
default:
}
pl->block_ptrs = new_block_ptrs;
pl->used_counts = new_used_counts;
+ pl->block_ptr_capacity = new_capacity;
+ pl->next_block_id = pl->num_blocks;
}
pl->block_ptrs[pl->num_blocks] = new_block;
+ pl->used_counts[pl->num_blocks] = 0;
pl->num_blocks ++;
}
BC_OP_DEREF, // dereference pointer
BC_OP_LT, // less than
BC_OP_LE, // less than or equal to
+ BC_OP_AND, // logical and
+ BC_OP_OR, // logical or
BC_OP_INDEX, // index [] or ::
BC_ALLOC_VARS, // create space in rstack for local variables
BC_CLOSURE, // create closure from top elements of stack
npop_stack(vm, 2);
push_stack_immediate(vm, &res);
break;
+ case BC_OP_AND:
+ v = peek_stack(vm, 1);
+ w = peek_stack(vm, 0);
+ res = HVBOOL(!(sbV_c_falsy(v) || sbV_c_falsy(w)));
+ npop_stack(vm, 2);
+ push_stack_immediate(vm, &res);
+ break;
+ case BC_OP_OR:
+ v = peek_stack(vm, 1);
+ w = peek_stack(vm, 0);
+ res = HVBOOL(!(sbV_c_falsy(v) && sbV_c_falsy(w)));
+ npop_stack(vm, 2);
+ push_stack_immediate(vm, &res);
+ break;
case BC_OP_ADD:
v = peek_stack(vm, 1);
w = peek_stack(vm, 0);