#include "master.hpp"
-namespace factor
-{
+namespace factor {
-void factor_vm::primitive_exit()
-{
- exit(to_fixnum(dpop()));
-}
+void factor_vm::primitive_exit() { exit((int)to_fixnum(ctx->pop())); }
-void factor_vm::primitive_system_micros()
-{
- box_unsigned_8(system_micros());
+void exit(int status) {
+ close_console();
+ ::exit(status);
}
-void factor_vm::primitive_nano_count()
-{
- box_unsigned_8(nano_count());
+void factor_vm::primitive_nano_count() {
+ uint64_t nanos = nano_count();
+ if (nanos < last_nano_count) {
+ std::cout << "Monotonic counter decreased from 0x";
+ std::cout << std::hex << last_nano_count;
+ std::cout << " to 0x" << nanos << "." << std::dec << "\n";
+ std::cout << "Please report this error.\n";
+ current_vm()->factorbug();
+ }
+ last_nano_count = nanos;
+ ctx->push(from_unsigned_8(nanos));
}
-void factor_vm::primitive_sleep()
-{
- sleep_nanos(to_unsigned_8(dpop()));
-}
+void factor_vm::primitive_sleep() { sleep_nanos(to_unsigned_8(ctx->pop())); }
}