move functions from run.cpp into vm

db4
Phil Dawes 2009-08-17 21:37:04 +01:00
parent 88084a66ac
commit 110f925245
2 changed files with 65 additions and 9 deletions

63
vm/run.cpp Normal file → Executable file
View File

@ -7,35 +7,60 @@ namespace factor
cell T; cell T;
PRIMITIVE(getenv) inline void factorvm::vmprim_getenv()
{ {
fixnum e = untag_fixnum(dpeek()); fixnum e = untag_fixnum(dpeek());
drepl(userenv[e]); drepl(userenv[e]);
} }
PRIMITIVE(setenv) PRIMITIVE(getenv)
{
PRIMITIVE_GETVM()->vmprim_getenv();
}
inline void factorvm::vmprim_setenv()
{ {
fixnum e = untag_fixnum(dpop()); fixnum e = untag_fixnum(dpop());
cell value = dpop(); cell value = dpop();
userenv[e] = value; userenv[e] = value;
} }
PRIMITIVE(exit) PRIMITIVE(setenv)
{
PRIMITIVE_GETVM()->vmprim_setenv();
}
inline void factorvm::vmprim_exit()
{ {
exit(to_fixnum(dpop())); exit(to_fixnum(dpop()));
} }
PRIMITIVE(micros) PRIMITIVE(exit)
{
PRIMITIVE_GETVM()->vmprim_exit();
}
inline void factorvm::vmprim_micros()
{ {
box_unsigned_8(current_micros()); box_unsigned_8(current_micros());
} }
PRIMITIVE(sleep) PRIMITIVE(micros)
{
PRIMITIVE_GETVM()->vmprim_micros();
}
inline void factorvm::vmprim_sleep()
{ {
sleep_micros(to_cell(dpop())); 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()); fixnum slot = untag_fixnum(dpop());
object *obj = untag<object>(dpop()); object *obj = untag<object>(dpop());
@ -45,7 +70,12 @@ PRIMITIVE(set_slot)
write_barrier(obj); 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()); fixnum count = untag_fixnum(dpop());
memcpy((cell *)(rs + sizeof(cell)),(cell *)(ds - sizeof(cell) * (count - 1)),sizeof(cell) * count); 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; 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<object> obj(obj_); gc_root<object> 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())); drepl(clone_object(dpeek()));
} }
PRIMITIVE(clone)
{
PRIMITIVE_GETVM()->vmprim_clone();
}
} }

View File

@ -20,6 +20,17 @@ struct factorvm {
inline void vmprim_set_datastack(); inline void vmprim_set_datastack();
inline void vmprim_set_retainstack(); inline void vmprim_set_retainstack();
inline void vmprim_check_datastack(); 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: // next method here:
}; };