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