move functions from run.cpp into vm
parent
88084a66ac
commit
110f925245
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
11
vm/vm.hpp
11
vm/vm.hpp
|
@ -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:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue