]> gitweb.factorcode.org Git - factor.git/blob - vm/run.hpp
JIT now supports multiple relocations per code template. This simplifies non-optimizi...
[factor.git] / vm / run.hpp
1 namespace factor
2 {
3
4 #define USER_ENV 70
5
6 enum special_object {
7         NAMESTACK_ENV,            /* used by library only */
8         CATCHSTACK_ENV,           /* used by library only, per-callback */
9
10         CURRENT_CALLBACK_ENV = 2, /* used by library only, per-callback */
11         WALKER_HOOK_ENV,          /* non-local exit hook, used by library only */
12         CALLCC_1_ENV,             /* used to pass the value in callcc1 */
13
14         BREAK_ENV            = 5, /* quotation called by throw primitive */
15         ERROR_ENV,                /* a marker consed onto kernel errors */
16
17         CELL_SIZE_ENV        = 7, /* sizeof(cell) */
18         CPU_ENV,                  /* CPU architecture */
19         OS_ENV,                   /* operating system name */
20
21         ARGS_ENV            = 10, /* command line arguments */
22         STDIN_ENV,                /* stdin FILE* handle */
23         STDOUT_ENV,               /* stdout FILE* handle */
24
25         IMAGE_ENV           = 13, /* image path name */
26         EXECUTABLE_ENV,           /* runtime executable path name */
27
28         EMBEDDED_ENV        = 15, /* are we embedded in another app? */
29         EVAL_CALLBACK_ENV,        /* used when Factor is embedded in a C app */
30         YIELD_CALLBACK_ENV,       /* used when Factor is embedded in a C app */
31         SLEEP_CALLBACK_ENV,       /* used when Factor is embedded in a C app */
32
33         COCOA_EXCEPTION_ENV = 19, /* Cocoa exception handler quotation */
34
35         BOOT_ENV            = 20, /* boot quotation */
36         GLOBAL_ENV,               /* global namespace */
37
38         /* Quotation compilation in quotations.c */
39         JIT_PROLOG          = 23,
40         JIT_PRIMITIVE_WORD,
41         JIT_PRIMITIVE,
42         JIT_WORD_JUMP,
43         JIT_WORD_CALL,
44         JIT_IF_WORD,
45         JIT_IF,
46         JIT_EPILOG          = 33,
47         JIT_RETURN,
48         JIT_PROFILING,
49         JIT_PUSH_IMMEDIATE,
50         JIT_DIP_WORD        = 38,
51         JIT_DIP,
52         JIT_2DIP_WORD,
53         JIT_2DIP,
54         JIT_3DIP_WORD,
55         JIT_3DIP,
56         JIT_EXECUTE_WORD,
57         JIT_EXECUTE_JUMP,
58         JIT_EXECUTE_CALL,
59
60         /* Polymorphic inline cache generation in inline_cache.c */
61         PIC_LOAD            = 47,
62         PIC_TAG,
63         PIC_HI_TAG,
64         PIC_TUPLE,
65         PIC_HI_TAG_TUPLE,
66         PIC_CHECK_TAG,
67         PIC_CHECK,
68         PIC_HIT,
69         PIC_MISS_WORD,
70         PIC_MISS_TAIL_WORD,
71
72         /* Megamorphic cache generation in dispatch.c */
73         MEGA_LOOKUP         = 57,
74         MEGA_LOOKUP_WORD,
75         MEGA_MISS_WORD,
76
77         UNDEFINED_ENV       = 60, /* default quotation for undefined words */
78
79         STDERR_ENV          = 61, /* stderr FILE* handle */
80
81         STAGE2_ENV          = 62, /* have we bootstrapped? */
82
83         CURRENT_THREAD_ENV  = 63,
84
85         THREADS_ENV         = 64,
86         RUN_QUEUE_ENV       = 65,
87         SLEEP_QUEUE_ENV     = 66,
88
89         STACK_TRACES_ENV    = 67,
90 };
91
92 #define FIRST_SAVE_ENV BOOT_ENV
93 #define LAST_SAVE_ENV STAGE2_ENV
94
95 inline static bool save_env_p(cell i)
96 {
97         return (i >= FIRST_SAVE_ENV && i <= LAST_SAVE_ENV) || i == STACK_TRACES_ENV;
98 }
99
100 /* Canonical T object. It's just a word */
101 extern cell T;
102
103 PRIMITIVE(getenv);
104 PRIMITIVE(setenv);
105 PRIMITIVE(exit);
106 PRIMITIVE(micros);
107 PRIMITIVE(sleep);
108 PRIMITIVE(set_slot);
109 PRIMITIVE(load_locals);
110 PRIMITIVE(clone);
111
112 }
113
114 /* TAGGED user environment data; see getenv/setenv prims */
115 VM_C_API factor::cell userenv[USER_ENV];