From 110f9252458508f6b484b387c7c220106acd916f Mon Sep 17 00:00:00 2001 From: Phil Dawes Date: Mon, 17 Aug 2009 21:37:04 +0100 Subject: [PATCH] move functions from run.cpp into vm --- vm/run.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++-------- vm/vm.hpp | 11 ++++++++++ 2 files changed, 65 insertions(+), 9 deletions(-) mode change 100644 => 100755 vm/run.cpp diff --git a/vm/run.cpp b/vm/run.cpp old mode 100644 new mode 100755 index c6a4bad695..0a14d4f017 --- a/vm/run.cpp +++ b/vm/run.cpp @@ -7,35 +7,60 @@ namespace factor cell T; -PRIMITIVE(getenv) +inline void factorvm::vmprim_getenv() { fixnum e = untag_fixnum(dpeek()); drepl(userenv[e]); } -PRIMITIVE(setenv) +PRIMITIVE(getenv) +{ + PRIMITIVE_GETVM()->vmprim_getenv(); +} + +inline void factorvm::vmprim_setenv() { fixnum e = untag_fixnum(dpop()); cell value = dpop(); userenv[e] = value; } -PRIMITIVE(exit) +PRIMITIVE(setenv) +{ + PRIMITIVE_GETVM()->vmprim_setenv(); +} + +inline void factorvm::vmprim_exit() { exit(to_fixnum(dpop())); } -PRIMITIVE(micros) +PRIMITIVE(exit) +{ + PRIMITIVE_GETVM()->vmprim_exit(); +} + +inline void factorvm::vmprim_micros() { box_unsigned_8(current_micros()); } -PRIMITIVE(sleep) +PRIMITIVE(micros) +{ + PRIMITIVE_GETVM()->vmprim_micros(); +} + +inline void factorvm::vmprim_sleep() { sleep_micros(to_cell(dpop())); } -PRIMITIVE(set_slot) +PRIMITIVE(sleep) +{ + PRIMITIVE_GETVM()->vmprim_sleep(); +} + +inline void factorvm::vmprim_set_slot() { fixnum slot = untag_fixnum(dpop()); object *obj = untag(dpop()); @@ -45,7 +70,12 @@ PRIMITIVE(set_slot) write_barrier(obj); } -PRIMITIVE(load_locals) +PRIMITIVE(set_slot) +{ + PRIMITIVE_GETVM()->vmprim_set_slot(); +} + +inline void factorvm::vmprim_load_locals() { fixnum count = untag_fixnum(dpop()); memcpy((cell *)(rs + sizeof(cell)),(cell *)(ds - sizeof(cell) * (count - 1)),sizeof(cell) * count); @@ -53,7 +83,12 @@ PRIMITIVE(load_locals) rs += sizeof(cell) * count; } -static cell clone_object(cell obj_) +PRIMITIVE(load_locals) +{ + PRIMITIVE_GETVM()->vmprim_load_locals(); +} + +cell factorvm::clone_object(cell obj_) { gc_root obj(obj_); @@ -68,9 +103,19 @@ static cell clone_object(cell obj_) } } -PRIMITIVE(clone) +cell clone_object(cell obj_) +{ + return vm->clone_object(obj_); +} + +inline void factorvm::vmprim_clone() { drepl(clone_object(dpeek())); } +PRIMITIVE(clone) +{ + PRIMITIVE_GETVM()->vmprim_clone(); +} + } diff --git a/vm/vm.hpp b/vm/vm.hpp index 73bcffc764..7533d748b0 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -20,6 +20,17 @@ struct factorvm { inline void vmprim_set_datastack(); inline void vmprim_set_retainstack(); inline void vmprim_check_datastack(); + + // run + inline void vmprim_getenv(); + inline void vmprim_setenv(); + inline void vmprim_exit(); + inline void vmprim_micros(); + inline void vmprim_sleep(); + inline void vmprim_set_slot(); + inline void vmprim_load_locals(); + cell clone_object(cell obj_); + inline void vmprim_clone(); // next method here: };