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