factor/vm/run.cpp

114 lines
1.7 KiB
C++
Raw Normal View History

2009-05-02 05:04:19 -04:00
#include "master.hpp"
2009-05-04 02:46:13 -04:00
namespace factor
{
2009-05-02 05:04:19 -04:00
2009-08-17 16:37:04 -04:00
inline void factorvm::vmprim_getenv()
2009-05-02 05:04:19 -04:00
{
2009-05-04 05:50:24 -04:00
fixnum e = untag_fixnum(dpeek());
2009-05-02 05:04:19 -04:00
drepl(userenv[e]);
}
2009-08-17 16:37:04 -04:00
PRIMITIVE(getenv)
{
PRIMITIVE_GETVM()->vmprim_getenv();
}
inline void factorvm::vmprim_setenv()
2009-05-02 05:04:19 -04:00
{
2009-05-04 05:50:24 -04:00
fixnum e = untag_fixnum(dpop());
cell value = dpop();
2009-05-02 05:04:19 -04:00
userenv[e] = value;
}
2009-08-17 16:37:04 -04:00
PRIMITIVE(setenv)
{
PRIMITIVE_GETVM()->vmprim_setenv();
}
inline void factorvm::vmprim_exit()
2009-05-02 05:04:19 -04:00
{
exit(to_fixnum(dpop()));
}
2009-08-17 16:37:04 -04:00
PRIMITIVE(exit)
{
PRIMITIVE_GETVM()->vmprim_exit();
}
inline void factorvm::vmprim_micros()
2009-05-02 05:04:19 -04:00
{
box_unsigned_8(current_micros());
}
2009-08-17 16:37:04 -04:00
PRIMITIVE(micros)
{
PRIMITIVE_GETVM()->vmprim_micros();
}
inline void factorvm::vmprim_sleep()
2009-05-02 05:04:19 -04:00
{
sleep_micros(to_cell(dpop()));
}
2009-08-17 16:37:04 -04:00
PRIMITIVE(sleep)
{
PRIMITIVE_GETVM()->vmprim_sleep();
}
inline void factorvm::vmprim_set_slot()
2009-05-02 05:04:19 -04:00
{
2009-05-04 05:50:24 -04:00
fixnum slot = untag_fixnum(dpop());
object *obj = untag<object>(dpop());
cell value = dpop();
2009-05-04 05:50:24 -04:00
obj->slots()[slot] = value;
write_barrier(obj);
2009-05-02 05:04:19 -04:00
}
2009-08-17 16:37:04 -04:00
PRIMITIVE(set_slot)
{
PRIMITIVE_GETVM()->vmprim_set_slot();
}
inline void factorvm::vmprim_load_locals()
2009-05-02 05:04:19 -04:00
{
2009-05-04 05:50:24 -04:00
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;
2009-05-02 05:04:19 -04:00
}
2009-08-17 16:37:04 -04:00
PRIMITIVE(load_locals)
{
PRIMITIVE_GETVM()->vmprim_load_locals();
}
cell factorvm::clone_object(cell obj_)
2009-05-02 05:04:19 -04:00
{
gc_root<object> obj(obj_,this);
2009-05-02 10:19:09 -04:00
2009-05-04 05:50:24 -04:00
if(immediate_p(obj.value()))
return obj.value();
2009-05-02 05:04:19 -04:00
else
{
2009-05-04 05:50:24 -04:00
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);
2009-05-02 05:04:19 -04:00
}
}
2009-08-17 16:37:04 -04:00
inline void factorvm::vmprim_clone()
2009-05-02 05:04:19 -04:00
{
drepl(clone_object(dpeek()));
}
2009-05-04 02:46:13 -04:00
2009-08-17 16:37:04 -04:00
PRIMITIVE(clone)
{
PRIMITIVE_GETVM()->vmprim_clone();
}
2009-05-04 02:46:13 -04:00
}