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 #ifndef DLTYPE_SSIZE_T
00021 # if SIZEOF_SIZE_T == SIZEOF_INT
00022 # define DLTYPE_SSIZE_T DLTYPE_INT
00023 # elif SIZEOF_SIZE_T == SIZEOF_LONG
00024 # define DLTYPE_SSIZE_T DLTYPE_LONG
00025 # elif defined HAVE_LONG_LONG && SIZEOF_SIZE_T == SIZEOF_LONG_LONG
00026 # define DLTYPE_SSIZE_T DLTYPE_LONG_LONG
00027 # endif
00028 #endif
00029 #define DLTYPE_SIZE_T (-1*SIGNEDNESS_OF_SIZE_T*DLTYPE_SSIZE_T)
00030
00031 #ifndef DLTYPE_PTRDIFF_T
00032 # if SIZEOF_PTRDIFF_T == SIZEOF_INT
00033 # define DLTYPE_PTRDIFF_T DLTYPE_INT
00034 # elif SIZEOF_PTRDIFF_T == SIZEOF_LONG
00035 # define DLTYPE_PTRDIFF_T DLTYPE_LONG
00036 # elif defined HAVE_LONG_LONG && SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG
00037 # define DLTYPE_PTRDIFF_T DLTYPE_LONG_LONG
00038 # endif
00039 #endif
00040
00041 #ifndef DLTYPE_INTPTR_T
00042 # if SIZEOF_INTPTR_T == SIZEOF_INT
00043 # define DLTYPE_INTPTR_T DLTYPE_INT
00044 # elif SIZEOF_INTPTR_T == SIZEOF_LONG
00045 # define DLTYPE_INTPTR_T DLTYPE_LONG
00046 # elif defined HAVE_LONG_LONG && SIZEOF_INTPTR_T == SIZEOF_LONG_LONG
00047 # define DLTYPE_INTPTR_T DLTYPE_LONG_LONG
00048 # endif
00049 #endif
00050 #define DLTYPE_UINTPTR_T (-DLTYPE_INTPTR_T)
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 VALUE
00068 rb_dl_dlopen(int argc, VALUE argv[], VALUE self)
00069 {
00070 return rb_class_new_instance(argc, argv, rb_cDLHandle);
00071 }
00072
00073
00074
00075
00076
00077
00078
00079 VALUE
00080 rb_dl_malloc(VALUE self, VALUE size)
00081 {
00082 void *ptr;
00083
00084 rb_secure(4);
00085 ptr = (void*)ruby_xmalloc(NUM2INT(size));
00086 return PTR2NUM(ptr);
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096 VALUE
00097 rb_dl_realloc(VALUE self, VALUE addr, VALUE size)
00098 {
00099 void *ptr = NUM2PTR(addr);
00100
00101 rb_secure(4);
00102 ptr = (void*)ruby_xrealloc(ptr, NUM2INT(size));
00103 return PTR2NUM(ptr);
00104 }
00105
00106
00107
00108
00109
00110
00111 VALUE
00112 rb_dl_free(VALUE self, VALUE addr)
00113 {
00114 void *ptr = NUM2PTR(addr);
00115
00116 rb_secure(4);
00117 ruby_xfree(ptr);
00118 return Qnil;
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 VALUE
00138 rb_dl_ptr2value(VALUE self, VALUE addr)
00139 {
00140 rb_secure(4);
00141 return (VALUE)NUM2PTR(addr);
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 VALUE
00158 rb_dl_value2ptr(VALUE self, VALUE val)
00159 {
00160 return PTR2NUM((void*)val);
00161 }
00162
00163 static void
00164 rb_dl_init_callbacks(VALUE dl)
00165 {
00166 static const char cb[] = "dl/callback.so";
00167
00168 rb_autoload(dl, rb_intern_const("CdeclCallbackAddrs"), cb);
00169 rb_autoload(dl, rb_intern_const("CdeclCallbackProcs"), cb);
00170 #ifdef FUNC_STDCALL
00171 rb_autoload(dl, rb_intern_const("StdcallCallbackAddrs"), cb);
00172 rb_autoload(dl, rb_intern_const("StdcallCallbackProcs"), cb);
00173 #endif
00174 }
00175
00176 void
00177 Init_dl(void)
00178 {
00179 void Init_dlhandle(void);
00180 void Init_dlcfunc(void);
00181 void Init_dlptr(void);
00182
00183 rbdl_id_cdecl = rb_intern_const("cdecl");
00184 rbdl_id_stdcall = rb_intern_const("stdcall");
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 rb_mDL = rb_define_module("DL");
00233
00234
00235
00236
00237
00238
00239 rb_eDLError = rb_define_class_under(rb_mDL, "DLError", rb_eStandardError);
00240
00241
00242
00243
00244
00245
00246 rb_eDLTypeError = rb_define_class_under(rb_mDL, "DLTypeError", rb_eDLError);
00247
00248
00249
00250
00251
00252 rb_define_const(rb_mDL, "MAX_CALLBACK", INT2NUM(MAX_CALLBACK));
00253
00254
00255
00256
00257
00258 rb_define_const(rb_mDL, "DLSTACK_SIZE", INT2NUM(DLSTACK_SIZE));
00259
00260 rb_dl_init_callbacks(rb_mDL);
00261
00262
00263
00264
00265
00266
00267
00268
00269 rb_define_const(rb_mDL, "RTLD_GLOBAL", INT2NUM(RTLD_GLOBAL));
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 rb_define_const(rb_mDL, "RTLD_LAZY", INT2NUM(RTLD_LAZY));
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292 rb_define_const(rb_mDL, "RTLD_NOW", INT2NUM(RTLD_NOW));
00293
00294
00295
00296
00297
00298 rb_define_const(rb_mDL, "TYPE_VOID", INT2NUM(DLTYPE_VOID));
00299
00300
00301
00302
00303
00304 rb_define_const(rb_mDL, "TYPE_VOIDP", INT2NUM(DLTYPE_VOIDP));
00305
00306
00307
00308
00309
00310 rb_define_const(rb_mDL, "TYPE_CHAR", INT2NUM(DLTYPE_CHAR));
00311
00312
00313
00314
00315
00316 rb_define_const(rb_mDL, "TYPE_SHORT", INT2NUM(DLTYPE_SHORT));
00317
00318
00319
00320
00321
00322 rb_define_const(rb_mDL, "TYPE_INT", INT2NUM(DLTYPE_INT));
00323
00324
00325
00326
00327
00328 rb_define_const(rb_mDL, "TYPE_LONG", INT2NUM(DLTYPE_LONG));
00329
00330 #if HAVE_LONG_LONG
00331
00332
00333
00334
00335 rb_define_const(rb_mDL, "TYPE_LONG_LONG", INT2NUM(DLTYPE_LONG_LONG));
00336 #endif
00337
00338
00339
00340
00341
00342 rb_define_const(rb_mDL, "TYPE_FLOAT", INT2NUM(DLTYPE_FLOAT));
00343
00344
00345
00346
00347
00348 rb_define_const(rb_mDL, "TYPE_DOUBLE", INT2NUM(DLTYPE_DOUBLE));
00349
00350
00351
00352
00353
00354 rb_define_const(rb_mDL, "TYPE_SIZE_T", INT2NUM(DLTYPE_SIZE_T));
00355
00356
00357
00358
00359
00360 rb_define_const(rb_mDL, "TYPE_SSIZE_T", INT2NUM(DLTYPE_SSIZE_T));
00361
00362
00363
00364
00365
00366 rb_define_const(rb_mDL, "TYPE_PTRDIFF_T", INT2NUM(DLTYPE_PTRDIFF_T));
00367
00368
00369
00370
00371
00372 rb_define_const(rb_mDL, "TYPE_INTPTR_T", INT2NUM(DLTYPE_INTPTR_T));
00373
00374
00375
00376
00377
00378 rb_define_const(rb_mDL, "TYPE_UINTPTR_T", INT2NUM(DLTYPE_UINTPTR_T));
00379
00380
00381
00382
00383
00384 rb_define_const(rb_mDL, "ALIGN_VOIDP", INT2NUM(ALIGN_VOIDP));
00385
00386
00387
00388
00389
00390 rb_define_const(rb_mDL, "ALIGN_CHAR", INT2NUM(ALIGN_CHAR));
00391
00392
00393
00394
00395
00396 rb_define_const(rb_mDL, "ALIGN_SHORT", INT2NUM(ALIGN_SHORT));
00397
00398
00399
00400
00401
00402 rb_define_const(rb_mDL, "ALIGN_INT", INT2NUM(ALIGN_INT));
00403
00404
00405
00406
00407
00408 rb_define_const(rb_mDL, "ALIGN_LONG", INT2NUM(ALIGN_LONG));
00409
00410 #if HAVE_LONG_LONG
00411
00412
00413
00414
00415 rb_define_const(rb_mDL, "ALIGN_LONG_LONG", INT2NUM(ALIGN_LONG_LONG));
00416 #endif
00417
00418
00419
00420
00421
00422 rb_define_const(rb_mDL, "ALIGN_FLOAT", INT2NUM(ALIGN_FLOAT));
00423
00424
00425
00426
00427
00428 rb_define_const(rb_mDL, "ALIGN_DOUBLE",INT2NUM(ALIGN_DOUBLE));
00429
00430
00431
00432
00433
00434 rb_define_const(rb_mDL, "ALIGN_SIZE_T", INT2NUM(ALIGN_OF(size_t)));
00435
00436
00437
00438
00439
00440 rb_define_const(rb_mDL, "ALIGN_SSIZE_T", INT2NUM(ALIGN_OF(size_t)));
00441
00442
00443
00444
00445
00446 rb_define_const(rb_mDL, "ALIGN_PTRDIFF_T", INT2NUM(ALIGN_OF(ptrdiff_t)));
00447
00448
00449
00450
00451
00452 rb_define_const(rb_mDL, "ALIGN_INTPTR_T", INT2NUM(ALIGN_OF(intptr_t)));
00453
00454
00455
00456
00457
00458 rb_define_const(rb_mDL, "ALIGN_UINTPTR_T", INT2NUM(ALIGN_OF(uintptr_t)));
00459
00460
00461
00462
00463
00464 rb_define_const(rb_mDL, "SIZEOF_VOIDP", INT2NUM(sizeof(void*)));
00465
00466
00467
00468
00469
00470 rb_define_const(rb_mDL, "SIZEOF_CHAR", INT2NUM(sizeof(char)));
00471
00472
00473
00474
00475
00476 rb_define_const(rb_mDL, "SIZEOF_SHORT", INT2NUM(sizeof(short)));
00477
00478
00479
00480
00481
00482 rb_define_const(rb_mDL, "SIZEOF_INT", INT2NUM(sizeof(int)));
00483
00484
00485
00486
00487
00488 rb_define_const(rb_mDL, "SIZEOF_LONG", INT2NUM(sizeof(long)));
00489
00490 #if HAVE_LONG_LONG
00491
00492
00493
00494
00495 rb_define_const(rb_mDL, "SIZEOF_LONG_LONG", INT2NUM(sizeof(LONG_LONG)));
00496 #endif
00497
00498
00499
00500
00501
00502 rb_define_const(rb_mDL, "SIZEOF_FLOAT", INT2NUM(sizeof(float)));
00503
00504
00505
00506
00507
00508 rb_define_const(rb_mDL, "SIZEOF_DOUBLE",INT2NUM(sizeof(double)));
00509
00510
00511
00512
00513
00514 rb_define_const(rb_mDL, "SIZEOF_SIZE_T", INT2NUM(sizeof(size_t)));
00515
00516
00517
00518
00519
00520 rb_define_const(rb_mDL, "SIZEOF_SSIZE_T", INT2NUM(sizeof(size_t)));
00521
00522
00523
00524
00525
00526 rb_define_const(rb_mDL, "SIZEOF_PTRDIFF_T", INT2NUM(sizeof(ptrdiff_t)));
00527
00528
00529
00530
00531
00532 rb_define_const(rb_mDL, "SIZEOF_INTPTR_T", INT2NUM(sizeof(intptr_t)));
00533
00534
00535
00536
00537
00538 rb_define_const(rb_mDL, "SIZEOF_UINTPTR_T", INT2NUM(sizeof(uintptr_t)));
00539
00540 rb_define_module_function(rb_mDL, "dlwrap", rb_dl_value2ptr, 1);
00541 rb_define_module_function(rb_mDL, "dlunwrap", rb_dl_ptr2value, 1);
00542
00543 rb_define_module_function(rb_mDL, "dlopen", rb_dl_dlopen, -1);
00544 rb_define_module_function(rb_mDL, "malloc", rb_dl_malloc, 1);
00545 rb_define_module_function(rb_mDL, "realloc", rb_dl_realloc, 2);
00546 rb_define_module_function(rb_mDL, "free", rb_dl_free, 1);
00547
00548
00549
00550
00551
00552 rb_define_const(rb_mDL, "RUBY_FREE", PTR2NUM(ruby_xfree));
00553
00554
00555
00556
00557
00558
00559
00560 rb_define_const(rb_mDL, "BUILD_RUBY_PLATFORM", rb_str_new2(RUBY_PLATFORM));
00561
00562
00563
00564
00565
00566
00567
00568 rb_define_const(rb_mDL, "BUILD_RUBY_VERSION", rb_str_new2(RUBY_VERSION));
00569
00570 Init_dlhandle();
00571 Init_dlcfunc();
00572 Init_dlptr();
00573 }
00574