]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/run.cpp
Put brackets around ipv6 addresses in `inet6 present`
[factor.git] / vm / run.cpp
old mode 100755 (executable)
new mode 100644 (file)
index b6e3324..7d9ead8
@@ -1,73 +1,27 @@
 #include "master.hpp"
 
-namespace factor
-{
+namespace factor {
 
-void factor_vm::primitive_getenv()
-{
-       fixnum e = untag_fixnum(dpeek());
-       drepl(special_objects[e]);
-}
-
-void factor_vm::primitive_setenv()
-{
-       fixnum e = untag_fixnum(dpop());
-       cell value = dpop();
-       special_objects[e] = value;
-}
-
-void factor_vm::primitive_exit()
-{
-       exit(to_fixnum(dpop()));
-}
-
-void factor_vm::primitive_micros()
-{
-       box_unsigned_8(current_micros());
-}
+void factor_vm::primitive_exit() { exit((int)to_fixnum(ctx->pop())); }
 
-void factor_vm::primitive_sleep()
-{
-       sleep_micros(to_cell(dpop()));
+void exit(int status) {
+  close_console();
+  ::exit(status);
 }
 
-void factor_vm::primitive_set_slot()
-{
-       fixnum slot = untag_fixnum(dpop());
-       object *obj = untag<object>(dpop());
-       cell value = dpop();
-
-       cell *slot_ptr = &obj->slots()[slot];
-       *slot_ptr = value;
-       write_barrier(slot_ptr);
-}
-
-void factor_vm::primitive_load_locals()
-{
-       fixnum count = untag_fixnum(dpop());
-       memcpy((cell *)(rs + sizeof(cell)),(cell *)(ds - sizeof(cell) * (count - 1)),sizeof(cell) * count);
-       ds -= sizeof(cell) * count;
-       rs += sizeof(cell) * 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));
 }
 
-cell factor_vm::clone_object(cell obj_)
-{
-       gc_root<object> obj(obj_,this);
-
-       if(immediate_p(obj.value()))
-               return obj.value();
-       else
-       {
-               cell size = object_size(obj.value());
-               object *new_obj = allot_object(header(obj.type()),size);
-               memcpy(new_obj,obj.untagged(),size);
-               return tag_dynamic(new_obj);
-       }
-}
-
-void factor_vm::primitive_clone()
-{
-       drepl(clone_object(dpeek()));
-}
+void factor_vm::primitive_sleep() { sleep_nanos(to_unsigned_8(ctx->pop())); }
 
 }