]> gitweb.factorcode.org Git - factor.git/blob - vm/run.cpp
renamed factorvm to factor_vm
[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(getenv)
13 {
14         PRIMITIVE_GETVM()->primitive_getenv();
15 }
16
17 inline void factor_vm::primitive_setenv()
18 {
19         fixnum e = untag_fixnum(dpop());
20         cell value = dpop();
21         userenv[e] = value;
22 }
23
24 PRIMITIVE(setenv)
25 {
26         PRIMITIVE_GETVM()->primitive_setenv();
27 }
28
29 inline void factor_vm::primitive_exit()
30 {
31         exit(to_fixnum(dpop()));
32 }
33
34 PRIMITIVE(exit)
35 {
36         PRIMITIVE_GETVM()->primitive_exit();
37 }
38
39 inline void factor_vm::primitive_micros()
40 {
41         box_unsigned_8(current_micros());
42 }
43
44 PRIMITIVE(micros)
45 {
46         PRIMITIVE_GETVM()->primitive_micros();
47 }
48
49 inline void factor_vm::primitive_sleep()
50 {
51         sleep_micros(to_cell(dpop()));
52 }
53
54 PRIMITIVE(sleep)
55 {
56         PRIMITIVE_GETVM()->primitive_sleep();
57 }
58
59 inline void factor_vm::primitive_set_slot()
60 {
61         fixnum slot = untag_fixnum(dpop());
62         object *obj = untag<object>(dpop());
63         cell value = dpop();
64
65         obj->slots()[slot] = value;
66         write_barrier(obj);
67 }
68
69 PRIMITIVE(set_slot)
70 {
71         PRIMITIVE_GETVM()->primitive_set_slot();
72 }
73
74 inline void factor_vm::primitive_load_locals()
75 {
76         fixnum count = untag_fixnum(dpop());
77         memcpy((cell *)(rs + sizeof(cell)),(cell *)(ds - sizeof(cell) * (count - 1)),sizeof(cell) * count);
78         ds -= sizeof(cell) * count;
79         rs += sizeof(cell) * count;
80 }
81
82 PRIMITIVE(load_locals)
83 {
84         PRIMITIVE_GETVM()->primitive_load_locals();
85 }
86
87 cell factor_vm::clone_object(cell obj_)
88 {
89         gc_root<object> obj(obj_,this);
90
91         if(immediate_p(obj.value()))
92                 return obj.value();
93         else
94         {
95                 cell size = object_size(obj.value());
96                 object *new_obj = allot_object(obj.type(),size);
97                 memcpy(new_obj,obj.untagged(),size);
98                 return tag_dynamic(new_obj);
99         }
100 }
101
102 inline void factor_vm::primitive_clone()
103 {
104         drepl(clone_object(dpeek()));
105 }
106
107 PRIMITIVE(clone)
108 {
109         PRIMITIVE_GETVM()->primitive_clone();
110 }
111
112 }