static OBJ TrKernel_eval(VM, OBJ self, int argc, OBJ argv[]) { UNUSED(self); if (argc < 1) tr_raise(ArgumentError, "string argument required"); if (argc > 4) tr_raise(ArgumentError, "Too much arguments"); OBJ string = argv[0]; TrFrame *f = (argc > 1 && argv[1]) ? TR_CBINDING(argv[1])->frame : vm->frame; char *filename = (argc > 2 && argv[1]) ? TR_STR_PTR(argv[2]) : "<eval>"; size_t lineno = argc > 3 ? TR_FIX2INT(argv[3]) : 0; TrBlock *blk = TrBlock_compile(vm, TR_STR_PTR(string), filename, lineno); if (!blk) return TR_UNDEF; if (vm->debug) TrBlock_dump(vm, blk); return TrVM_run(vm, blk, f->self, f->class, kv_size(blk->locals), f->stack); }
static inline int TrArray_at2index(VM, OBJ self, OBJ at) { int i = TR_FIX2INT(at); if (i < 0) i = TR_ARRAY_SIZE(self) + i; return i; }