#ifdef XATOM | #ifdef XATOM | ||||
XATOM("true", ktrue) | XATOM("true", ktrue) | ||||
XATOM("false", kfalse) | XATOM("false", kfalse) | ||||
XATOM("stop", kstop) | |||||
#endif | #endif | ||||
#ifdef XFUNCTION | #ifdef XFUNCTION |
struct l2_vm_stack_frame fstack[1024]; | struct l2_vm_stack_frame fstack[1024]; | ||||
l2_word fsptr; | l2_word fsptr; | ||||
l2_word knone, ktrue, kfalse; | |||||
l2_word knone, ktrue, kfalse, kstop; | |||||
l2_word gc_start; | l2_word gc_start; | ||||
}; | }; | ||||
}; | }; | ||||
static l2_word loop_callback(struct l2_vm *vm, l2_word retval, l2_word cont) { | static l2_word loop_callback(struct l2_vm *vm, l2_word retval, l2_word cont) { | ||||
if (l2_vm_val_is_true(vm, &vm->values[retval])) { | |||||
struct l2_vm_value *val = &vm->values[retval]; | |||||
if (l2_value_get_type(val) == L2_VAL_TYPE_ATOM && val->atom == vm->values[vm->kstop].atom) { | |||||
return vm->knone; | |||||
} else { | |||||
return cont; | return cont; | ||||
} | } | ||||
return retval; | |||||
} | } | ||||
static void loop_marker( | static void loop_marker( |