summaryrefslogtreecommitdiff
path: root/ext/-test-/array/concat/to_ary_conact.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/-test-/array/concat/to_ary_conact.c')
-rw-r--r--ext/-test-/array/concat/to_ary_conact.c64
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);
+}