| #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( |