]> gitweb.factorcode.org Git - factor.git/blob - vm/run.cpp
Merge branch 'invaders' of git://double.co.nz/git/factor
[factor.git] / vm / run.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 void factor_vm::primitive_getenv()
7 {
8         fixnum e = untag_fixnum(dpeek());
9         drepl(userenv[e]);
10 }
11
12 void factor_vm::primitive_setenv()
13 {
14         fixnum e = untag_fixnum(dpop());
15         cell value = dpop();
16         userenv[e] = value;
17 }
18
19 void factor_vm::primitive_exit()
20 {
21         exit(to_fixnum(dpop()));
22 }
23
24 void factor_vm::primitive_micros()
25 {
26         box_unsigned_8(current_micros());
27 }
28
29 void factor_vm::primitive_sleep()
30 {
31         sleep_micros(to_cell(dpop()));
32 }
33
34 void factor_vm::primitive_set_slot()
35 {
36         fixnum slot = untag_fixnum(dpop());
37         object *obj = untag<object>(dpop());
38         cell value = dpop();
39
40         cell *slot_ptr = &obj->slots()[slot];
41         *slot_ptr = value;
42         write_barrier(slot_ptr);
43 }
44
45 void factor_vm::primitive_load_locals()
46 {
47         fixnum count = untag_fixnum(dpop());
48         memcpy((cell *)(rs + sizeof(cell)),(cell *)(ds - sizeof(cell) * (count - 1)),sizeof(cell) * count);
49         ds -= sizeof(cell) * count;
50         rs += sizeof(cell) * count;
51 }
52
53 cell factor_vm::clone_object(cell obj_)
54 {
55         gc_root<object> obj(obj_,this);
56
57         if(immediate_p(obj.value()))
58                 return obj.value();
59         else
60         {
61                 cell size = object_size(obj.value());
62                 object *new_obj = allot_object(header(obj.type()),size);
63                 memcpy(new_obj,obj.untagged(),size);
64                 return tag_dynamic(new_obj);
65         }
66 }
67
68 void factor_vm::primitive_clone()
69 {
70         drepl(clone_object(dpeek()));
71 }
72
73 }