]> gitweb.factorcode.org Git - factor.git/blob - vm/run.cpp
Merge branch 'master' of git://factorcode.org/git/factor into constraints
[factor.git] / vm / run.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6
7 inline void factorvm::vmprim_getenv()
8 {
9         fixnum e = untag_fixnum(dpeek());
10         drepl(userenv[e]);
11 }
12
13 PRIMITIVE(getenv)
14 {
15         PRIMITIVE_GETVM()->vmprim_getenv();
16 }
17
18 inline void factorvm::vmprim_setenv()
19 {
20         fixnum e = untag_fixnum(dpop());
21         cell value = dpop();
22         userenv[e] = value;
23 }
24
25 PRIMITIVE(setenv)
26 {
27         PRIMITIVE_GETVM()->vmprim_setenv();
28 }
29
30 inline void factorvm::vmprim_exit()
31 {
32         exit(to_fixnum(dpop()));
33 }
34
35 PRIMITIVE(exit)
36 {
37         PRIMITIVE_GETVM()->vmprim_exit();
38 }
39
40 inline void factorvm::vmprim_micros()
41 {
42         box_unsigned_8(current_micros());
43 }
44
45 PRIMITIVE(micros)
46 {
47         PRIMITIVE_GETVM()->vmprim_micros();
48 }
49
50 inline void factorvm::vmprim_sleep()
51 {
52         sleep_micros(to_cell(dpop()));
53 }
54
55 PRIMITIVE(sleep)
56 {
57         PRIMITIVE_GETVM()->vmprim_sleep();
58 }
59
60 inline void factorvm::vmprim_set_slot()
61 {
62         fixnum slot = untag_fixnum(dpop());
63         object *obj = untag<object>(dpop());
64         cell value = dpop();
65
66         obj->slots()[slot] = value;
67         write_barrier(obj);
68 }
69
70 PRIMITIVE(set_slot)
71 {
72         PRIMITIVE_GETVM()->vmprim_set_slot();
73 }
74
75 inline void factorvm::vmprim_load_locals()
76 {
77         fixnum count = untag_fixnum(dpop());
78         memcpy((cell *)(rs + sizeof(cell)),(cell *)(ds - sizeof(cell) * (count - 1)),sizeof(cell) * count);
79         ds -= sizeof(cell) * count;
80         rs += sizeof(cell) * count;
81 }
82
83 PRIMITIVE(load_locals)
84 {
85         PRIMITIVE_GETVM()->vmprim_load_locals();
86 }
87
88 cell factorvm::clone_object(cell obj_)
89 {
90         gc_root<object> obj(obj_,this);
91
92         if(immediate_p(obj.value()))
93                 return obj.value();
94         else
95         {
96                 cell size = object_size(obj.value());
97                 object *new_obj = allot_object(obj.type(),size);
98                 memcpy(new_obj,obj.untagged(),size);
99                 return tag_dynamic(new_obj);
100         }
101 }
102
103 inline void factorvm::vmprim_clone()
104 {
105         drepl(clone_object(dpeek()));
106 }
107
108 PRIMITIVE(clone)
109 {
110         PRIMITIVE_GETVM()->vmprim_clone();
111 }
112
113 }