diff options
Diffstat (limited to 'ext/-test-/array/concat/to_ary_conact.c')
-rw-r--r-- | ext/-test-/array/concat/to_ary_conact.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/ext/-test-/array/concat/to_ary_conact.c b/ext/-test-/array/concat/to_ary_conact.c new file mode 100644 index 0000000000..a61659a66e --- /dev/null +++ b/ext/-test-/array/concat/to_ary_conact.c @@ -0,0 +1,64 @@ +#include "ruby.h" + +VALUE cFoo; + +// Foo + +typedef struct { + int dummy; +} Foo; + +static void Foo_free(void* _self) { + xfree(_self); +} + +static rb_data_type_t Foo_type = { + "Foo", + {NULL, Foo_free, NULL }, + .flags = RUBY_TYPED_FREE_IMMEDIATELY, +}; + +static VALUE Foo_alloc(VALUE klass) { + Foo* _self = ALLOC(Foo); + return TypedData_Wrap_Struct(klass, &Foo_type, _self); +} + +// Bar + +typedef struct { + int dummy; +} Bar; + +static void Bar_free(void* _self) { + xfree(_self); +} + +static rb_data_type_t Bar_type = { + "Bar", + {NULL, Bar_free, NULL }, + .flags = RUBY_TYPED_FREE_IMMEDIATELY, +}; + +static VALUE Bar_alloc(VALUE klass) { + Bar* bar = ALLOC(Bar); + return TypedData_Wrap_Struct(klass, &Bar_type, bar); +} + +VALUE Bar_to_ary(VALUE _self) { + VALUE ary = rb_ary_new2(2); + rb_ary_push(ary, Foo_alloc(cFoo)); + rb_ary_push(ary, Foo_alloc(cFoo)); + rb_ary_push(ary, Foo_alloc(cFoo)); + return ary; +} + +void Init_to_ary_concat() { + VALUE mBug = rb_define_module("Bug"); + cFoo = rb_define_class_under(mBug, "Foo", rb_cObject); + rb_gc_register_address(&cFoo); + rb_define_alloc_func(cFoo, Foo_alloc); + + VALUE bar = rb_define_class_under(mBug, "Bar", rb_cObject); + rb_define_alloc_func(bar, Bar_alloc); + rb_define_method(bar, "to_ary", Bar_to_ary, 0); +} |