1 #include "Object.h"
2 #include "Object-inl.h"
3 #include "Pair.h"
4 #include "Pair-inl.h"
5 #include "SString.h"
6 #include "ByteVector.h"
7 #include "VM.h"
8 #include "ByteVectorProcedures.h"
9 #include "ErrorProcedures.h"
10 #include "PortProcedures.h"
11 #include "ByteArrayBinaryInputPort.h"
12 #include "BinaryInputPort.h"
13 #include "Symbol.h"
14 #include "ProcedureMacro.h"
15 #include "Transcoder.h"
16 #include "UTF8Codec.h"
17 #include "UTF16Codec.h"
18 #include "UTF32Codec.h"
19 #include "Ratnum.h"
20 #include "Flonum.h"
21 #include "Bignum.h"
22 #include "Arithmetic.h"
23 #include "TextualOutputPort.h"
24 #include "FFI.h"
25 #include "Gloc.h"
26 #include "Closure.h"
27 #include "VM-inl.h"
28 
29 #if !defined(_WIN32) && !defined(MONA)
30 #define HAVE_TERMINAL // this should be done in configure..
31 #endif
32 
33 #ifndef MONA
34 #define HAVE_BDWGC_STUBS
35 #endif
36 
37 #ifdef _WIN32
38 #define HAVE_AIO_WIN32
39 #include "aio_win32.h"
40 #endif
41 
42 #ifdef HAVE_TERMINAL
43 #include "posix/terminal/mosh_terminal.h"
44 #endif
45 
46 #ifdef HAVE_BDWGC_STUBS
47 #include "generic/boehmgc-stubs.h"
48 #endif
49 
50 #ifdef HAVE_KQUEUE
51 #include "bsd/kqueue/kqueue_stubs.h"
52 #endif
53 
54 #ifdef HAVE_PTRACE_COMMON
55 #include "posix/ptrace/ptrace_common.h"
56 #endif
57 
58 using namespace scheme;
59 
60 #define NIL Object::Nil
61 #define CONS(x,y) Object::cons((x),(y))
62 #define SYM(x) Symbol::intern(UC(x))
63 #define PTR(x) Object::makePointer((void*)x)
64 #define FUNC(x,y) CONS(SYM(x),PTR(y))
65 #define FN(x) FUNC(#x,x)
66 
67 
68 #ifdef HAVE_TERMINAL
69 #define LIBDATA_TERMINAL CONS(SYM("terminal"), \
70 CONS(FUNC("terminal_acquire",terminal_acquire), \
71 CONS(FUNC("terminal_release",terminal_release), \
72 CONS(FUNC("terminal_getsize",terminal_getsize), \
73 CONS(FUNC("terminal_isatty",terminal_isatty),NIL)))))
74 #endif
75 
76 #ifdef HAVE_PTRACE_COMMON
77 #define LIBDATA_PTRACE_COMMON CONS(SYM("ptrace-common"), \
78 CONS(FN(call_ptrace), \
79 CONS(FN(ptrace_traceme), \
80 CONS(FN(ptrace_write), \
81 CONS(FN(ptrace_read), \
82 CONS(FN(ptrace_continue), \
83 CONS(FN(ptrace_singlestep), \
84 CONS(FN(ptrace_attach), \
85 CONS(FN(ptrace_detatch), \
86 CONS(FN(ptrace_regsize), \
87 CONS(FN(ptrace_getregs), \
88 CONS(FN(ptrace_setregs), \
89 CONS(FN(ptrace_fpregsize), \
90 CONS(FN(ptrace_getfpregs), \
91 CONS(FN(ptrace_setfpregs), NIL)))))))))))))))
92 #endif
93 
94 #ifdef HAVE_AIO_WIN32
95 #define LIBDATA_AIO_WIN32 CONS(SYM("aio-win32"), \
96 CONS(FN(win32_handle_close), \
97 CONS(FN(win32_iocp_create), \
98 CONS(FN(win32_iocp_assoc), \
99 CONS(FN(win32_iocp_pop), \
100 CONS(FN(win32_overlapped_alloc), \
101 CONS(FN(win32_overlapped_free), \
102 CONS(FN(win32_overlapped_setmydata), \
103 CONS(FN(win32_overlapped_getmydata), \
104 CONS(FN(win32_handle_read_async), \
105 CONS(FN(win32_handle_write_async), \
106 CONS(FN(win32_process_redirected_child2), \
107 CONS(FN(win32_create_named_pipe_async), \
108 CONS(FN(win32_wait_named_pipe_async), \
109 CONS(FN(win32_process_wait_async), \
110 CONS(FN(win32_sockaddr_storage_size), \
111 CONS(FN(win32_socket_create), \
112 CONS(FN(win32_socket_close), \
113 CONS(FN(win32_addrinfoex_free), \
114 CONS(FN(win32_addrinfoex_read), \
115 CONS(FN(win32_socket_connect), \
116 CONS(FN(win32_socket_accept), \
117 CONS(FN(win32_socket_bind), \
118 CONS(FN(win32_socket_listen), \
119 CONS(FN(win32_getaddrinfo), \
120 CONS(FN(win32_finalization_handler_get), \
121 CONS(FN(win32_finalization_handler_create), \
122 	NIL)))))))))))))))))))))))))))
123 
124 #define LIBDATA_WIN32_GUI CONS(SYM("win32-gui"), \
125 CONS(FN(win32_messagebox) ,\
126 CONS(FN(win32_window_move) ,\
127 CONS(FN(win32_window_show) ,\
128 CONS(FN(win32_window_hide) ,\
129 CONS(FN(win32_window_settitle) ,\
130 CONS(FN(win32_window_close) ,\
131 CONS(FN(win32_window_destroy) ,\
132 CONS(FN(win32_registerwindowclass) ,\
133 CONS(FN(win32_window_alloc) ,\
134 CONS(FN(win32_window_create) ,\
135 CONS(FN(win32_window_fitbuffer) ,\
136 CONS(FN(win32_getmonitorinfo) ,\
137 CONS(FN(win32_window_updaterects) ,\
138 CONS(FN(win32_window_createbitmap) ,\
139 CONS(FN(win32_window_getclientrect_x) ,\
140 CONS(FN(win32_window_getclientrect_y) ,\
141 CONS(FN(win32_dc_create) ,\
142 CONS(FN(win32_dc_dispose) ,\
143 CONS(FN(win32_dc_selectobject) ,\
144 CONS(FN(win32_dc_transform) ,\
145 CONS(FN(win32_dc_settransform) ,\
146 CONS(FN(win32_gdi_deleteobject) ,\
147 CONS(FN(win32_pen_create) ,\
148 CONS(FN(win32_brush_create) ,\
149 CONS(FN(win32_font_create) ,\
150 CONS(FN(win32_dc_draw) ,\
151 CONS(FN(win32_dc_measure_text) ,\
152 	NIL))))))))))))))))))))))))))))
153 
154 #define LIBDATA_WIN32_MISC CONS(SYM("win32-misc"), \
155 CONS(FN(win32_get_processor_count), \
156 CONS(FN(win32_get_ansi_codepage), \
157 CONS(FN(win32_multibyte_to_widechar), \
158 CONS(FN(win32_measure_multibyte_to_widechar), \
159 CONS(FN(win32_mypath), \
160 	NIL))))))
161 #endif
162 
163 #define LIBDATA_BOEHMGC_STUBS CONS(SYM("boehmgc-stubs"), \
164 CONS(FN(create_weak_vector), \
165 CONS(FN(weak_vector_ref), \
166 CONS(FN(weak_vector_set), \
167 CONS(FN(register_disappearing_link_wv), \
168 CONS(FN(register_finalizer), \
169 CONS(FN(register_disappearing_link), \
170 CONS(FN(gcollect),NIL))))))))
171 
172 #ifdef HAVE_KQUEUE
173 #define LIBDATA_KQUEUE CONS(SYM("kqueue-stubs"), \
174 CONS(FN(kq_create), \
175 CONS(FN(kevent_alloc), \
176 CONS(FN(kevent_offset), \
177 CONS(FN(kevent_dispose), \
178 CONS(FN(kevent_set_readevent), \
179 CONS(FN(kevent_set_writeevent), \
180 CONS(FN(kevent_set_enableuserevent), \
181 CONS(FN(kevent_set_triggeruserevent), \
182 CONS(FN(kevent_ident), \
183 CONS(FN(kevent_type), \
184 CONS(FN(kevent_decode_fd), \
185 CONS(FN(kevent_exec), \
186 CONS(FN(socket_sizeof_sockaddr_storage), \
187 CONS(FN(socket_getaddrinfo), \
188 CONS(FN(socket_create), \
189 CONS(FN(socket_freeaddrinfo), \
190 CONS(FN(socket_bind), \
191 CONS(FN(socket_accept), \
192 CONS(FN(socket_listen), \
193 CONS(FN(socket_connect), \
194 CONS(FN(socket_addrinfo_read), \
195 CONS(FN(socket_setnodelay), \
196 CONS(FN(fd_read), \
197 CONS(FN(fd_write), \
198 CONS(FN(fd_close), \
199 CONS(FN(fd_setnonblock), \
200 CONS(FN(fd_pipe), \
201     NIL))))))))))))))))))))))))))))
202 #endif
203 
204 Object
stub_get_pffi_feature_set(VM * theVM,int argc,const Object * argv)205 stub_get_pffi_feature_set(VM* theVM, int argc, const Object* argv){
206     //DeclareProcedureName("%get-pffi-feature-set");
207     Object tmp;
208 
209     tmp = Object::Nil;
210 #ifdef HAVE_PTRACE_COMMON
211 	tmp = Object::cons(LIBDATA_PTRACE_COMMON,tmp);
212 #endif
213 #ifdef HAVE_KQUEUE
214 	tmp = Object::cons(LIBDATA_KQUEUE,tmp);
215 #endif
216 #ifdef HAVE_BDWGC_STUBS
217 	tmp = Object::cons(LIBDATA_BOEHMGC_STUBS,tmp);
218 #endif
219 #ifdef HAVE_TERMINAL
220     tmp = Object::cons(LIBDATA_TERMINAL,tmp);
221 #endif
222 #ifdef HAVE_AIO_WIN32
223 	tmp = Object::cons(LIBDATA_AIO_WIN32,tmp);
224 	tmp = Object::cons(LIBDATA_WIN32_GUI,tmp);
225     tmp = Object::cons(LIBDATA_WIN32_MISC,tmp);
226 #endif
227     return tmp;
228 }
229 
230 #undef NIL
231 #undef CONS
232 #undef SYM
233 #undef PTR
234 
235 void
register_stubs(VM * theVM)236 register_stubs(VM* theVM){
237     theVM->setValueString(UC("%get-pffi-feature-set"),Object::makeCProcedure(stub_get_pffi_feature_set));
238 }
239