]> 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 51a970d..7d9ead8
 #include "master.hpp"
 
-namespace factor
-{
+namespace factor {
 
+void factor_vm::primitive_exit() { exit((int)to_fixnum(ctx->pop())); }
 
-inline void factorvm::primitive_getenv()
-{
-       fixnum e = untag_fixnum(dpeek());
-       drepl(userenv[e]);
+void exit(int status) {
+  close_console();
+  ::exit(status);
 }
 
-PRIMITIVE(getenv)
-{
-       PRIMITIVE_GETVM()->primitive_getenv();
+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));
 }
 
-inline void factorvm::primitive_setenv()
-{
-       fixnum e = untag_fixnum(dpop());
-       cell value = dpop();
-       userenv[e] = value;
-}
-
-PRIMITIVE(setenv)
-{
-       PRIMITIVE_GETVM()->primitive_setenv();
-}
-
-inline void factorvm::primitive_exit()
-{
-       exit(to_fixnum(dpop()));
-}
-
-PRIMITIVE(exit)
-{
-       PRIMITIVE_GETVM()->primitive_exit();
-}
-
-inline void factorvm::primitive_micros()
-{
-       box_unsigned_8(current_micros());
-}
-
-PRIMITIVE(micros)
-{
-       PRIMITIVE_GETVM()->primitive_micros();
-}
-
-inline void factorvm::primitive_sleep()
-{
-       sleep_micros(to_cell(dpop()));
-}
-
-PRIMITIVE(sleep)
-{
-       PRIMITIVE_GETVM()->primitive_sleep();
-}
-
-inline void factorvm::primitive_set_slot()
-{
-       fixnum slot = untag_fixnum(dpop());
-       object *obj = untag<object>(dpop());
-       cell value = dpop();
-
-       obj->slots()[slot] = value;
-       write_barrier(obj);
-}
-
-PRIMITIVE(set_slot)
-{
-       PRIMITIVE_GETVM()->primitive_set_slot();
-}
-
-inline void factorvm::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;
-}
-
-PRIMITIVE(load_locals)
-{
-       PRIMITIVE_GETVM()->primitive_load_locals();
-}
-
-cell factorvm::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(obj.type(),size);
-               memcpy(new_obj,obj.untagged(),size);
-               return tag_dynamic(new_obj);
-       }
-}
-
-inline void factorvm::primitive_clone()
-{
-       drepl(clone_object(dpeek()));
-}
-
-PRIMITIVE(clone)
-{
-       PRIMITIVE_GETVM()->primitive_clone();
-}
+void factor_vm::primitive_sleep() { sleep_nanos(to_unsigned_8(ctx->pop())); }
 
 }