1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
#include "ruby.h"
#include "rubyspec.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef HAVE_RB_SCAN_ARGS
VALUE util_spec_rb_scan_args(VALUE self, VALUE argv, VALUE fmt, VALUE expected, VALUE acc) {
int i, result, argc = (int)RARRAY_LEN(argv);
VALUE args[6], failed, a1, a2, a3, a4, a5, a6;
failed = rb_intern("failed");
a1 = a2 = a3 = a4 = a5 = a6 = failed;
for(i = 0; i < argc; i++) {
args[i] = rb_ary_entry(argv, i);
}
result = rb_scan_args(argc, args, RSTRING_PTR(fmt), &a1, &a2, &a3, &a4, &a5, &a6);
switch(NUM2INT(expected)) {
case 6:
rb_ary_unshift(acc, a6);
case 5:
rb_ary_unshift(acc, a5);
case 4:
rb_ary_unshift(acc, a4);
case 3:
rb_ary_unshift(acc, a3);
case 2:
rb_ary_unshift(acc, a2);
case 1:
rb_ary_unshift(acc, a1);
break;
default:
rb_raise(rb_eException, "unexpected number of arguments returned by rb_scan_args");
}
return INT2NUM(result);
}
#endif
#ifdef HAVE_RB_LONG2INT
static VALUE util_spec_rb_long2int(VALUE self, VALUE n) {
return INT2NUM(rb_long2int(NUM2LONG(n)));
}
#endif
#ifdef HAVE_RB_ITER_BREAK
static VALUE util_spec_rb_iter_break(VALUE self) {
rb_iter_break();
return Qnil;
}
#endif
#ifdef HAVE_RB_SOURCEFILE
static VALUE util_spec_rb_sourcefile(VALUE self) {
#ifdef RUBY_VERSION_IS_1_8_EX_1_9
return rb_str_new2(ruby_sourcefile);
#else
return rb_str_new2(rb_sourcefile());
#endif
}
#endif
#ifdef HAVE_RB_SOURCELINE
static VALUE util_spec_rb_sourceline(VALUE self) {
#ifdef RUBY_VERSION_IS_1_8_EX_1_9
return INT2NUM(ruby_sourceline);
#else
return INT2NUM(rb_sourceline());
#endif
}
#endif
void Init_util_spec() {
VALUE cls = rb_define_class("CApiUtilSpecs", rb_cObject);
#ifdef HAVE_RB_SCAN_ARGS
rb_define_method(cls, "rb_scan_args", util_spec_rb_scan_args, 4);
#endif
#ifdef HAVE_RB_LONG2INT
rb_define_method(cls, "rb_long2int", util_spec_rb_long2int, 1);
#endif
#ifdef HAVE_RB_ITER_BREAK
rb_define_method(cls, "rb_iter_break", util_spec_rb_iter_break, 0);
#endif
#ifdef HAVE_RB_SOURCEFILE
rb_define_method(cls, "rb_sourcefile", util_spec_rb_sourcefile, 0);
#endif
#ifdef HAVE_RB_SOURCELINE
rb_define_method(cls, "rb_sourceline", util_spec_rb_sourceline, 0);
#endif
}
#ifdef __cplusplus
}
#endif
|