diff options
author | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-07 12:04:49 +0000 |
---|---|---|
committer | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-07 12:04:49 +0000 |
commit | 95e8c48dd3348503a8c7db5d0498894a1b676395 (patch) | |
tree | 9eef7f720314ebaff56845a74e203770e62284e4 /spec/rubyspec/optional/capi/ext/array_spec.c | |
parent | ed7d803500de38186c74bce94d233e85ef51e503 (diff) |
Add in-tree mspec and ruby/spec
* For easier modifications of ruby/spec by MRI developers.
* .gitignore: track changes under spec.
* spec/mspec, spec/rubyspec: add in-tree mspec and ruby/spec.
These files can therefore be updated like any other file in MRI.
Instructions are provided in spec/README.
[Feature #13156] [ruby-core:79246]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58595 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'spec/rubyspec/optional/capi/ext/array_spec.c')
-rw-r--r-- | spec/rubyspec/optional/capi/ext/array_spec.c | 452 |
1 files changed, 452 insertions, 0 deletions
diff --git a/spec/rubyspec/optional/capi/ext/array_spec.c b/spec/rubyspec/optional/capi/ext/array_spec.c new file mode 100644 index 0000000000..8bc144195c --- /dev/null +++ b/spec/rubyspec/optional/capi/ext/array_spec.c @@ -0,0 +1,452 @@ +#include "ruby.h" +#include "rubyspec.h" + +#include <stdio.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_RB_ARRAY +static VALUE array_spec_rb_Array(VALUE self, VALUE object) { + return rb_Array(object); +} +#endif + +#if defined(HAVE_RARRAY_LEN) && defined(HAVE_RARRAY_PTR) +static VALUE array_spec_RARRAY_PTR_iterate(VALUE self, VALUE array) { + int i; + VALUE* ptr; + + ptr = RARRAY_PTR(array); + for(i = 0; i < RARRAY_LEN(array); i++) { + rb_yield(ptr[i]); + } + return Qnil; +} + +static VALUE array_spec_RARRAY_PTR_assign(VALUE self, VALUE array, VALUE value) { + int i; + VALUE* ptr; + + ptr = RARRAY_PTR(array); + for(i = 0; i < RARRAY_LEN(array); i++) { + ptr[i] = value; + } + return Qnil; +} +#endif + +#ifdef HAVE_RARRAY_LEN +static VALUE array_spec_RARRAY_LEN(VALUE self, VALUE array) { + return INT2FIX(RARRAY_LEN(array)); +} +#endif + +#ifdef HAVE_RARRAY_AREF +static VALUE array_spec_RARRAY_AREF(VALUE self, VALUE array, VALUE index) { + return RARRAY_AREF(array, FIX2INT(index)); +} +#endif + +#ifdef HAVE_RB_ARY_AREF +static VALUE array_spec_rb_ary_aref(int argc, VALUE *argv, VALUE self) { + VALUE ary, args; + rb_scan_args(argc, argv, "1*", &ary, &args); + return rb_ary_aref((int)RARRAY_LEN(args), RARRAY_PTR(args), ary); +} +#endif + +#ifdef HAVE_RB_ARY_CLEAR +static VALUE array_spec_rb_ary_clear(VALUE self, VALUE array) { + return rb_ary_clear(array); +} +#endif + +#ifdef HAVE_RB_ARY_DELETE +static VALUE array_spec_rb_ary_delete(VALUE self, VALUE array, VALUE item) { + return rb_ary_delete(array, item); +} +#endif + +#ifdef HAVE_RB_ARY_DELETE_AT +static VALUE array_spec_rb_ary_delete_at(VALUE self, VALUE array, VALUE index) { + return rb_ary_delete_at(array, NUM2LONG(index)); +} +#endif + +#ifdef HAVE_RB_ARY_DUP +static VALUE array_spec_rb_ary_dup(VALUE self, VALUE array) { + return rb_ary_dup(array); +} +#endif + +#ifdef HAVE_RB_ARY_ENTRY +static VALUE array_spec_rb_ary_entry(VALUE self, VALUE array, VALUE offset) { + return rb_ary_entry(array, FIX2INT(offset)); +} +#endif + +#ifdef HAVE_RB_ARY_INCLUDES +static VALUE array_spec_rb_ary_includes(VALUE self, VALUE ary, VALUE item) { + return rb_ary_includes(ary, item); +} +#endif + +#ifdef HAVE_RB_ARY_JOIN +static VALUE array_spec_rb_ary_join(VALUE self, VALUE array1, VALUE array2) { + return rb_ary_join(array1, array2); +} +#endif + +#ifdef HAVE_RB_ARY_TO_S +static VALUE array_spec_rb_ary_to_s(VALUE self, VALUE array) { + return rb_ary_to_s(array); +} +#endif + +#ifdef HAVE_RB_ARY_NEW +static VALUE array_spec_rb_ary_new(VALUE self) { + VALUE ret; + ret = rb_ary_new(); + return ret; +} +#endif + +#ifdef HAVE_RB_ARY_NEW2 +static VALUE array_spec_rb_ary_new2(VALUE self, VALUE length) { + return rb_ary_new2(NUM2LONG(length)); +} +#endif + +#ifdef HAVE_RB_ARY_NEW_CAPA +static VALUE array_spec_rb_ary_new_capa(VALUE self, VALUE length) { + return rb_ary_new_capa(NUM2LONG(length)); +} +#endif + +#ifdef HAVE_RB_ARY_NEW3 +static VALUE array_spec_rb_ary_new3(VALUE self, VALUE first, VALUE second, VALUE third) { + return rb_ary_new3(3, first, second, third); +} +#endif + +#ifdef HAVE_RB_ARY_NEW_FROM_ARGS +static VALUE array_spec_rb_ary_new_from_args(VALUE self, VALUE first, VALUE second, VALUE third) { + return rb_ary_new_from_args(3, first, second, third); +} +#endif + +#ifdef HAVE_RB_ARY_NEW4 +static VALUE array_spec_rb_ary_new4(VALUE self, VALUE first, VALUE second, VALUE third) { + VALUE values[3]; + values[0] = first; + values[1] = second; + values[2] = third; + return rb_ary_new4(3, values); +} +#endif + +#ifdef HAVE_RB_ARY_NEW_FROM_VALUES +static VALUE array_spec_rb_ary_new_from_values(VALUE self, VALUE first, VALUE second, VALUE third) { + VALUE values[3]; + values[0] = first; + values[1] = second; + values[2] = third; + return rb_ary_new_from_values(3, values); +} +#endif + +#ifdef HAVE_RB_ARY_POP +static VALUE array_spec_rb_ary_pop(VALUE self, VALUE array) { + return rb_ary_pop(array); +} +#endif + +#ifdef HAVE_RB_ARY_PUSH +static VALUE array_spec_rb_ary_push(VALUE self, VALUE array, VALUE item) { + rb_ary_push(array, item); + return array; +} +#endif + +#ifdef HAVE_RB_ARY_CAT +static VALUE array_spec_rb_ary_cat(int argc, VALUE *argv, VALUE self) { + VALUE ary, args; + rb_scan_args(argc, argv, "1*", &ary, &args); + return rb_ary_cat(ary, RARRAY_PTR(args), RARRAY_LEN(args)); +} +#endif + +#ifdef HAVE_RB_ARY_REVERSE +static VALUE array_spec_rb_ary_reverse(VALUE self, VALUE array) { + return rb_ary_reverse(array); +} +#endif + +#ifdef HAVE_RB_ARY_ROTATE +static VALUE array_spec_rb_ary_rotate(VALUE self, VALUE array, VALUE count) { + return rb_ary_rotate(array, NUM2LONG(count)); +} +#endif + +#ifdef HAVE_RB_ARY_SHIFT +static VALUE array_spec_rb_ary_shift(VALUE self, VALUE array) { + return rb_ary_shift(array); +} +#endif + +#ifdef HAVE_RB_ARY_STORE +static VALUE array_spec_rb_ary_store(VALUE self, VALUE array, VALUE offset, VALUE value) { + rb_ary_store(array, FIX2INT(offset), value); + + return Qnil; +} +#endif + +#ifdef HAVE_RB_ARY_CONCAT +static VALUE array_spec_rb_ary_concat(VALUE self, VALUE array1, VALUE array2) { + return rb_ary_concat(array1, array2); +} +#endif + +#ifdef HAVE_RB_ARY_PLUS +static VALUE array_spec_rb_ary_plus(VALUE self, VALUE array1, VALUE array2) { + return rb_ary_plus(array1, array2); +} +#endif + +#ifdef HAVE_RB_ARY_UNSHIFT +static VALUE array_spec_rb_ary_unshift(VALUE self, VALUE array, VALUE val) { + return rb_ary_unshift(array, val); +} +#endif + +#ifdef HAVE_RB_ASSOC_NEW +static VALUE array_spec_rb_assoc_new(VALUE self, VALUE first, VALUE second) { + return rb_assoc_new(first, second); +} +#endif + +#if defined(HAVE_RB_ITERATE) && defined(HAVE_RB_EACH) +static VALUE copy_ary(VALUE el, VALUE new_ary) { + return rb_ary_push(new_ary, el); +} + +static VALUE array_spec_rb_iterate(VALUE self, VALUE ary) { + VALUE new_ary = rb_ary_new(); + + rb_iterate(rb_each, ary, copy_ary, new_ary); + + return new_ary; +} + +static VALUE sub_pair(VALUE el, VALUE holder) { + return rb_ary_push(holder, rb_ary_entry(el, 1)); +} + +static VALUE each_pair(VALUE obj) { + return rb_funcall(obj, rb_intern("each_pair"), 0); +} + +static VALUE array_spec_rb_iterate_each_pair(VALUE self, VALUE obj) { + VALUE new_ary = rb_ary_new(); + + rb_iterate(each_pair, obj, sub_pair, new_ary); + + return new_ary; +} + +static VALUE iter_yield(VALUE el, VALUE ary) { + rb_yield(el); + return Qnil; +} + +static VALUE array_spec_rb_iterate_then_yield(VALUE self, VALUE obj) { + rb_iterate(rb_each, obj, iter_yield, obj); + return Qnil; +} +#endif + +#if defined(HAVE_RB_MEM_CLEAR) +static VALUE array_spec_rb_mem_clear(VALUE self, VALUE obj) { + VALUE ary[1]; + ary[0] = obj; + rb_mem_clear(ary, 1); + return ary[0]; +} +#endif + +#ifdef HAVE_RB_ARY_FREEZE +static VALUE array_spec_rb_ary_freeze(VALUE self, VALUE ary) { + return rb_ary_freeze(ary); +} +#endif + +#ifdef HAVE_RB_ARY_TO_ARY +static VALUE array_spec_rb_ary_to_ary(VALUE self, VALUE ary) { + return rb_ary_to_ary(ary); +} +#endif + +#ifdef HAVE_RB_ARY_SUBSEQ +static VALUE array_spec_rb_ary_subseq(VALUE self, VALUE ary, VALUE begin, VALUE len) { + return rb_ary_subseq(ary, FIX2LONG(begin), FIX2LONG(len)); +} +#endif + +void Init_array_spec(void) { + VALUE cls; + cls = rb_define_class("CApiArraySpecs", rb_cObject); + +#ifdef HAVE_RB_ARRAY + rb_define_method(cls, "rb_Array", array_spec_rb_Array, 1); +#endif + +#ifdef HAVE_RARRAY_LEN + rb_define_method(cls, "RARRAY_LEN", array_spec_RARRAY_LEN, 1); +#endif + +#if defined(HAVE_RARRAY_LEN) && defined(HAVE_RARRAY_PTR) + rb_define_method(cls, "RARRAY_PTR_iterate", array_spec_RARRAY_PTR_iterate, 1); + rb_define_method(cls, "RARRAY_PTR_assign", array_spec_RARRAY_PTR_assign, 2); +#endif + +#ifdef HAVE_RARRAY_AREF + rb_define_method(cls, "RARRAY_AREF", array_spec_RARRAY_AREF, 2); +#endif + +#ifdef HAVE_RB_ARY_AREF + rb_define_method(cls, "rb_ary_aref", array_spec_rb_ary_aref, -1); +#endif + +#ifdef HAVE_RB_ARY_CLEAR + rb_define_method(cls, "rb_ary_clear", array_spec_rb_ary_clear, 1); +#endif + +#ifdef HAVE_RB_ARY_DELETE + rb_define_method(cls, "rb_ary_delete", array_spec_rb_ary_delete, 2); +#endif + +#ifdef HAVE_RB_ARY_DELETE_AT + rb_define_method(cls, "rb_ary_delete_at", array_spec_rb_ary_delete_at, 2); +#endif + +#ifdef HAVE_RB_ARY_DUP + rb_define_method(cls, "rb_ary_dup", array_spec_rb_ary_dup, 1); +#endif + +#ifdef HAVE_RB_ARY_ENTRY + rb_define_method(cls, "rb_ary_entry", array_spec_rb_ary_entry, 2); +#endif + +#ifdef HAVE_RB_ARY_INCLUDES + rb_define_method(cls, "rb_ary_includes", array_spec_rb_ary_includes, 2); +#endif + +#ifdef HAVE_RB_ARY_JOIN + rb_define_method(cls, "rb_ary_join", array_spec_rb_ary_join, 2); +#endif + +#ifdef HAVE_RB_ARY_TO_S + rb_define_method(cls, "rb_ary_to_s", array_spec_rb_ary_to_s, 1); +#endif + +#ifdef HAVE_RB_ARY_NEW + rb_define_method(cls, "rb_ary_new", array_spec_rb_ary_new, 0); +#endif + +#ifdef HAVE_RB_ARY_NEW2 + rb_define_method(cls, "rb_ary_new2", array_spec_rb_ary_new2, 1); +#endif + +#ifdef HAVE_RB_ARY_NEW_CAPA + rb_define_method(cls, "rb_ary_new_capa", array_spec_rb_ary_new_capa, 1); +#endif + +#ifdef HAVE_RB_ARY_NEW3 + rb_define_method(cls, "rb_ary_new3", array_spec_rb_ary_new3, 3); +#endif + +#ifdef HAVE_RB_ARY_NEW_FROM_ARGS + rb_define_method(cls, "rb_ary_new_from_args", array_spec_rb_ary_new_from_args, 3); +#endif + +#ifdef HAVE_RB_ARY_NEW4 + rb_define_method(cls, "rb_ary_new4", array_spec_rb_ary_new4, 3); +#endif + +#ifdef HAVE_RB_ARY_NEW_FROM_VALUES + rb_define_method(cls, "rb_ary_new_from_values", array_spec_rb_ary_new_from_values, 3); +#endif + +#ifdef HAVE_RB_ARY_POP + rb_define_method(cls, "rb_ary_pop", array_spec_rb_ary_pop, 1); +#endif + +#ifdef HAVE_RB_ARY_PUSH + rb_define_method(cls, "rb_ary_push", array_spec_rb_ary_push, 2); +#endif + +#ifdef HAVE_RB_ARY_CAT + rb_define_method(cls, "rb_ary_cat", array_spec_rb_ary_cat, -1); +#endif + +#ifdef HAVE_RB_ARY_REVERSE + rb_define_method(cls, "rb_ary_reverse", array_spec_rb_ary_reverse, 1); +#endif + +#ifdef HAVE_RB_ARY_ROTATE + rb_define_method(cls, "rb_ary_rotate", array_spec_rb_ary_rotate, 2); +#endif + +#ifdef HAVE_RB_ARY_SHIFT + rb_define_method(cls, "rb_ary_shift", array_spec_rb_ary_shift, 1); +#endif + +#ifdef HAVE_RB_ARY_STORE + rb_define_method(cls, "rb_ary_store", array_spec_rb_ary_store, 3); +#endif + +#ifdef HAVE_RB_ARY_CONCAT + rb_define_method(cls, "rb_ary_concat", array_spec_rb_ary_concat, 2); +#endif + +#ifdef HAVE_RB_ARY_PLUS + rb_define_method(cls, "rb_ary_plus", array_spec_rb_ary_plus, 2); +#endif + +#ifdef HAVE_RB_ARY_UNSHIFT + rb_define_method(cls, "rb_ary_unshift", array_spec_rb_ary_unshift, 2); +#endif + +#ifdef HAVE_RB_ASSOC_NEW + rb_define_method(cls, "rb_assoc_new", array_spec_rb_assoc_new, 2); +#endif + +#if defined(HAVE_RB_ITERATE) && defined(HAVE_RB_EACH) + rb_define_method(cls, "rb_iterate", array_spec_rb_iterate, 1); + rb_define_method(cls, "rb_iterate_each_pair", array_spec_rb_iterate_each_pair, 1); + rb_define_method(cls, "rb_iterate_then_yield", array_spec_rb_iterate_then_yield, 1); +#endif + +#if defined(HAVE_RB_MEM_CLEAR) + rb_define_method(cls, "rb_mem_clear", array_spec_rb_mem_clear, 1); +#endif + +#ifdef HAVE_RB_ARY_FREEZE + rb_define_method(cls, "rb_ary_freeze", array_spec_rb_ary_freeze, 1); +#endif + +#ifdef HAVE_RB_ARY_TO_ARY + rb_define_method(cls, "rb_ary_to_ary", array_spec_rb_ary_to_ary, 1); +#endif + +#ifdef HAVE_RB_ARY_SUBSEQ + rb_define_method(cls, "rb_ary_subseq", array_spec_rb_ary_subseq, 3); +#endif +} + +#ifdef __cplusplus +} +#endif |