]> gitweb.factorcode.org Git - factor.git/blob - vm/run.hpp
Clean up bootstrap.image, and implement new calling convention for tail calls; tail...
[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_WORD_SPECIAL,
45         JIT_IF_WORD,
46         JIT_IF,
47         JIT_EPILOG,
48         JIT_RETURN,
49         JIT_PROFILING,
50         JIT_PUSH_IMMEDIATE,
51         JIT_DIP_WORD,
52         JIT_DIP,
53         JIT_2DIP_WORD,
54         JIT_2DIP,
55         JIT_3DIP_WORD,
56         JIT_3DIP,
57         JIT_EXECUTE_WORD,
58         JIT_EXECUTE_JUMP,
59         JIT_EXECUTE_CALL,
60
61         /* Polymorphic inline cache generation in inline_cache.c */
62         PIC_LOAD            = 47,
63         PIC_TAG,
64         PIC_HI_TAG,
65         PIC_TUPLE,
66         PIC_HI_TAG_TUPLE,
67         PIC_CHECK_TAG,
68         PIC_CHECK,
69         PIC_HIT,
70         PIC_MISS_WORD,
71         PIC_MISS_TAIL_WORD,
72
73         /* Megamorphic cache generation in dispatch.c */
74         MEGA_LOOKUP         = 57,
75         MEGA_LOOKUP_WORD,
76         MEGA_MISS_WORD,
77
78         UNDEFINED_ENV       = 60, /* default quotation for undefined words */
79
80         STDERR_ENV          = 61, /* stderr FILE* handle */
81
82         STAGE2_ENV          = 62, /* have we bootstrapped? */
83
84         CURRENT_THREAD_ENV  = 63,
85
86         THREADS_ENV         = 64,
87         RUN_QUEUE_ENV       = 65,
88         SLEEP_QUEUE_ENV     = 66,
89
90         STACK_TRACES_ENV    = 67,
91 };
92
93 #define FIRST_SAVE_ENV BOOT_ENV
94 #define LAST_SAVE_ENV STAGE2_ENV
95
96 inline static bool save_env_p(cell i)
97 {
98         return (i >= FIRST_SAVE_ENV && i <= LAST_SAVE_ENV) || i == STACK_TRACES_ENV;
99 }
100
101 /* Canonical T object. It's just a word */
102 extern cell T;
103
104 PRIMITIVE(getenv);
105 PRIMITIVE(setenv);
106 PRIMITIVE(exit);
107 PRIMITIVE(micros);
108 PRIMITIVE(sleep);
109 PRIMITIVE(set_slot);
110 PRIMITIVE(load_locals);
111 PRIMITIVE(clone);
112
113 }
114
115 /* TAGGED user environment data; see getenv/setenv prims */
116 VM_C_API factor::cell userenv[USER_ENV];