diff options
Diffstat (limited to 'spec/rubyspec/optional/capi/ext/util_spec.c')
-rw-r--r-- | spec/rubyspec/optional/capi/ext/util_spec.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/spec/rubyspec/optional/capi/ext/util_spec.c b/spec/rubyspec/optional/capi/ext/util_spec.c new file mode 100644 index 0000000000..50795b51af --- /dev/null +++ b/spec/rubyspec/optional/capi/ext/util_spec.c @@ -0,0 +1,95 @@ +#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) { + return rb_str_new2(rb_sourcefile()); +} +#endif + +#ifdef HAVE_RB_SOURCELINE +static VALUE util_spec_rb_sourceline(VALUE self) { + return INT2NUM(rb_sourceline()); +} +#endif + +void Init_util_spec(void) { + 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 |