00001
00002
00003
00004
00005
00006
00007
00008 #include <ruby/ruby.h>
00009 #include <ruby/io.h>
00010 #include <ctype.h>
00011 #include "dl.h"
00012
00013 VALUE rb_mDL;
00014 VALUE rb_eDLError;
00015 VALUE rb_eDLTypeError;
00016
00017 ID rbdl_id_cdecl;
00018 ID rbdl_id_stdcall;
00019
00020 VALUE
00021 rb_dl_dlopen(int argc, VALUE argv[], VALUE self)
00022 {
00023 return rb_class_new_instance(argc, argv, rb_cDLHandle);
00024 }
00025
00026
00027
00028
00029
00030
00031
00032 VALUE
00033 rb_dl_malloc(VALUE self, VALUE size)
00034 {
00035 void *ptr;
00036
00037 rb_secure(4);
00038 ptr = (void*)ruby_xmalloc(NUM2INT(size));
00039 return PTR2NUM(ptr);
00040 }
00041
00042
00043
00044
00045
00046
00047
00048
00049 VALUE
00050 rb_dl_realloc(VALUE self, VALUE addr, VALUE size)
00051 {
00052 void *ptr = NUM2PTR(addr);
00053
00054 rb_secure(4);
00055 ptr = (void*)ruby_xrealloc(ptr, NUM2INT(size));
00056 return PTR2NUM(ptr);
00057 }
00058
00059
00060
00061
00062
00063
00064 VALUE
00065 rb_dl_free(VALUE self, VALUE addr)
00066 {
00067 void *ptr = NUM2PTR(addr);
00068
00069 rb_secure(4);
00070 ruby_xfree(ptr);
00071 return Qnil;
00072 }
00073
00074 VALUE
00075 rb_dl_ptr2value(VALUE self, VALUE addr)
00076 {
00077 rb_secure(4);
00078 return (VALUE)NUM2PTR(addr);
00079 }
00080
00081 VALUE
00082 rb_dl_value2ptr(VALUE self, VALUE val)
00083 {
00084 return PTR2NUM((void*)val);
00085 }
00086
00087 static void
00088 rb_dl_init_callbacks(VALUE dl)
00089 {
00090 static const char cb[] = "dl/callback.so";
00091
00092 rb_autoload(dl, rb_intern_const("CdeclCallbackAddrs"), cb);
00093 rb_autoload(dl, rb_intern_const("CdeclCallbackProcs"), cb);
00094 #ifdef FUNC_STDCALL
00095 rb_autoload(dl, rb_intern_const("StdcallCallbackAddrs"), cb);
00096 rb_autoload(dl, rb_intern_const("StdcallCallbackProcs"), cb);
00097 #endif
00098 }
00099
00100 void
00101 Init_dl(void)
00102 {
00103 void Init_dlhandle(void);
00104 void Init_dlcfunc(void);
00105 void Init_dlptr(void);
00106
00107 rbdl_id_cdecl = rb_intern_const("cdecl");
00108 rbdl_id_stdcall = rb_intern_const("stdcall");
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 rb_mDL = rb_define_module("DL");
00157
00158
00159
00160
00161
00162
00163 rb_eDLError = rb_define_class_under(rb_mDL, "DLError", rb_eStandardError);
00164
00165
00166
00167
00168
00169
00170 rb_eDLTypeError = rb_define_class_under(rb_mDL, "DLTypeError", rb_eDLError);
00171
00172
00173
00174
00175
00176 rb_define_const(rb_mDL, "MAX_CALLBACK", INT2NUM(MAX_CALLBACK));
00177
00178
00179
00180
00181
00182 rb_define_const(rb_mDL, "DLSTACK_SIZE", INT2NUM(DLSTACK_SIZE));
00183
00184 rb_dl_init_callbacks(rb_mDL);
00185
00186
00187
00188
00189
00190
00191
00192
00193 rb_define_const(rb_mDL, "RTLD_GLOBAL", INT2NUM(RTLD_GLOBAL));
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 rb_define_const(rb_mDL, "RTLD_LAZY", INT2NUM(RTLD_LAZY));
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 rb_define_const(rb_mDL, "RTLD_NOW", INT2NUM(RTLD_NOW));
00217
00218
00219
00220
00221
00222 rb_define_const(rb_mDL, "TYPE_VOID", INT2NUM(DLTYPE_VOID));
00223
00224
00225
00226
00227
00228 rb_define_const(rb_mDL, "TYPE_VOIDP", INT2NUM(DLTYPE_VOIDP));
00229
00230
00231
00232
00233
00234 rb_define_const(rb_mDL, "TYPE_CHAR", INT2NUM(DLTYPE_CHAR));
00235
00236
00237
00238
00239
00240 rb_define_const(rb_mDL, "TYPE_SHORT", INT2NUM(DLTYPE_SHORT));
00241
00242
00243
00244
00245
00246 rb_define_const(rb_mDL, "TYPE_INT", INT2NUM(DLTYPE_INT));
00247
00248
00249
00250
00251
00252 rb_define_const(rb_mDL, "TYPE_LONG", INT2NUM(DLTYPE_LONG));
00253
00254 #if HAVE_LONG_LONG
00255
00256
00257
00258
00259 rb_define_const(rb_mDL, "TYPE_LONG_LONG", INT2NUM(DLTYPE_LONG_LONG));
00260 #endif
00261
00262
00263
00264
00265
00266 rb_define_const(rb_mDL, "TYPE_FLOAT", INT2NUM(DLTYPE_FLOAT));
00267
00268
00269
00270
00271
00272 rb_define_const(rb_mDL, "TYPE_DOUBLE", INT2NUM(DLTYPE_DOUBLE));
00273
00274
00275
00276
00277
00278 rb_define_const(rb_mDL, "ALIGN_VOIDP", INT2NUM(ALIGN_VOIDP));
00279
00280
00281
00282
00283
00284 rb_define_const(rb_mDL, "ALIGN_CHAR", INT2NUM(ALIGN_CHAR));
00285
00286
00287
00288
00289
00290 rb_define_const(rb_mDL, "ALIGN_SHORT", INT2NUM(ALIGN_SHORT));
00291
00292
00293
00294
00295
00296 rb_define_const(rb_mDL, "ALIGN_INT", INT2NUM(ALIGN_INT));
00297
00298
00299
00300
00301
00302 rb_define_const(rb_mDL, "ALIGN_LONG", INT2NUM(ALIGN_LONG));
00303
00304 #if HAVE_LONG_LONG
00305
00306
00307
00308
00309 rb_define_const(rb_mDL, "ALIGN_LONG_LONG", INT2NUM(ALIGN_LONG_LONG));
00310 #endif
00311
00312
00313
00314
00315
00316 rb_define_const(rb_mDL, "ALIGN_FLOAT", INT2NUM(ALIGN_FLOAT));
00317
00318
00319
00320
00321
00322 rb_define_const(rb_mDL, "ALIGN_DOUBLE",INT2NUM(ALIGN_DOUBLE));
00323
00324
00325
00326
00327
00328 rb_define_const(rb_mDL, "SIZEOF_VOIDP", INT2NUM(sizeof(void*)));
00329
00330
00331
00332
00333
00334 rb_define_const(rb_mDL, "SIZEOF_CHAR", INT2NUM(sizeof(char)));
00335
00336
00337
00338
00339
00340 rb_define_const(rb_mDL, "SIZEOF_SHORT", INT2NUM(sizeof(short)));
00341
00342
00343
00344
00345
00346 rb_define_const(rb_mDL, "SIZEOF_INT", INT2NUM(sizeof(int)));
00347
00348
00349
00350
00351
00352 rb_define_const(rb_mDL, "SIZEOF_LONG", INT2NUM(sizeof(long)));
00353
00354 #if HAVE_LONG_LONG
00355
00356
00357
00358
00359 rb_define_const(rb_mDL, "SIZEOF_LONG_LONG", INT2NUM(sizeof(LONG_LONG)));
00360 #endif
00361
00362
00363
00364
00365
00366 rb_define_const(rb_mDL, "SIZEOF_FLOAT", INT2NUM(sizeof(float)));
00367
00368
00369
00370
00371
00372 rb_define_const(rb_mDL, "SIZEOF_DOUBLE",INT2NUM(sizeof(double)));
00373
00374 rb_define_module_function(rb_mDL, "dlwrap", rb_dl_value2ptr, 1);
00375 rb_define_module_function(rb_mDL, "dlunwrap", rb_dl_ptr2value, 1);
00376
00377 rb_define_module_function(rb_mDL, "dlopen", rb_dl_dlopen, -1);
00378 rb_define_module_function(rb_mDL, "malloc", rb_dl_malloc, 1);
00379 rb_define_module_function(rb_mDL, "realloc", rb_dl_realloc, 2);
00380 rb_define_module_function(rb_mDL, "free", rb_dl_free, 1);
00381
00382
00383
00384
00385
00386 rb_define_const(rb_mDL, "RUBY_FREE", PTR2NUM(ruby_xfree));
00387
00388
00389
00390
00391
00392
00393
00394 rb_define_const(rb_mDL, "BUILD_RUBY_PLATFORM", rb_str_new2(RUBY_PLATFORM));
00395
00396
00397
00398
00399
00400
00401
00402 rb_define_const(rb_mDL, "BUILD_RUBY_VERSION", rb_str_new2(RUBY_VERSION));
00403
00404 Init_dlhandle();
00405 Init_dlcfunc();
00406 Init_dlptr();
00407 }
00408