Skip to content

Commit 9c1fe90

Browse files
committed
[Feature #19757] Add new API rb_data_define
1 parent d426343 commit 9c1fe90

File tree

5 files changed

+216
-0
lines changed

5 files changed

+216
-0
lines changed

ext/-test-/struct/data.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include "ruby.h"
2+
3+
static VALUE
4+
bug_data_new(VALUE self, VALUE super)
5+
{
6+
return rb_data_define(super, "mem1", "mem2", NULL);
7+
}
8+
9+
void
10+
Init_data(VALUE klass)
11+
{
12+
rb_define_singleton_method(klass, "data_new", bug_data_new, 1);
13+
}

ext/-test-/struct/depend

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,163 @@
11
# AUTOGENERATED DEPENDENCIES START
2+
data.o: $(RUBY_EXTCONF_H)
3+
data.o: $(arch_hdrdir)/ruby/config.h
4+
data.o: $(hdrdir)/ruby.h
5+
data.o: $(hdrdir)/ruby/assert.h
6+
data.o: $(hdrdir)/ruby/backward.h
7+
data.o: $(hdrdir)/ruby/backward/2/assume.h
8+
data.o: $(hdrdir)/ruby/backward/2/attributes.h
9+
data.o: $(hdrdir)/ruby/backward/2/bool.h
10+
data.o: $(hdrdir)/ruby/backward/2/inttypes.h
11+
data.o: $(hdrdir)/ruby/backward/2/limits.h
12+
data.o: $(hdrdir)/ruby/backward/2/long_long.h
13+
data.o: $(hdrdir)/ruby/backward/2/stdalign.h
14+
data.o: $(hdrdir)/ruby/backward/2/stdarg.h
15+
data.o: $(hdrdir)/ruby/defines.h
16+
data.o: $(hdrdir)/ruby/intern.h
17+
data.o: $(hdrdir)/ruby/internal/abi.h
18+
data.o: $(hdrdir)/ruby/internal/anyargs.h
19+
data.o: $(hdrdir)/ruby/internal/arithmetic.h
20+
data.o: $(hdrdir)/ruby/internal/arithmetic/char.h
21+
data.o: $(hdrdir)/ruby/internal/arithmetic/double.h
22+
data.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h
23+
data.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h
24+
data.o: $(hdrdir)/ruby/internal/arithmetic/int.h
25+
data.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h
26+
data.o: $(hdrdir)/ruby/internal/arithmetic/long.h
27+
data.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h
28+
data.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h
29+
data.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h
30+
data.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h
31+
data.o: $(hdrdir)/ruby/internal/arithmetic/short.h
32+
data.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h
33+
data.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h
34+
data.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h
35+
data.o: $(hdrdir)/ruby/internal/assume.h
36+
data.o: $(hdrdir)/ruby/internal/attr/alloc_size.h
37+
data.o: $(hdrdir)/ruby/internal/attr/artificial.h
38+
data.o: $(hdrdir)/ruby/internal/attr/cold.h
39+
data.o: $(hdrdir)/ruby/internal/attr/const.h
40+
data.o: $(hdrdir)/ruby/internal/attr/constexpr.h
41+
data.o: $(hdrdir)/ruby/internal/attr/deprecated.h
42+
data.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h
43+
data.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h
44+
data.o: $(hdrdir)/ruby/internal/attr/error.h
45+
data.o: $(hdrdir)/ruby/internal/attr/flag_enum.h
46+
data.o: $(hdrdir)/ruby/internal/attr/forceinline.h
47+
data.o: $(hdrdir)/ruby/internal/attr/format.h
48+
data.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h
49+
data.o: $(hdrdir)/ruby/internal/attr/noalias.h
50+
data.o: $(hdrdir)/ruby/internal/attr/nodiscard.h
51+
data.o: $(hdrdir)/ruby/internal/attr/noexcept.h
52+
data.o: $(hdrdir)/ruby/internal/attr/noinline.h
53+
data.o: $(hdrdir)/ruby/internal/attr/nonnull.h
54+
data.o: $(hdrdir)/ruby/internal/attr/noreturn.h
55+
data.o: $(hdrdir)/ruby/internal/attr/packed_struct.h
56+
data.o: $(hdrdir)/ruby/internal/attr/pure.h
57+
data.o: $(hdrdir)/ruby/internal/attr/restrict.h
58+
data.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h
59+
data.o: $(hdrdir)/ruby/internal/attr/warning.h
60+
data.o: $(hdrdir)/ruby/internal/attr/weakref.h
61+
data.o: $(hdrdir)/ruby/internal/cast.h
62+
data.o: $(hdrdir)/ruby/internal/compiler_is.h
63+
data.o: $(hdrdir)/ruby/internal/compiler_is/apple.h
64+
data.o: $(hdrdir)/ruby/internal/compiler_is/clang.h
65+
data.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h
66+
data.o: $(hdrdir)/ruby/internal/compiler_is/intel.h
67+
data.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h
68+
data.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h
69+
data.o: $(hdrdir)/ruby/internal/compiler_since.h
70+
data.o: $(hdrdir)/ruby/internal/config.h
71+
data.o: $(hdrdir)/ruby/internal/constant_p.h
72+
data.o: $(hdrdir)/ruby/internal/core.h
73+
data.o: $(hdrdir)/ruby/internal/core/rarray.h
74+
data.o: $(hdrdir)/ruby/internal/core/rbasic.h
75+
data.o: $(hdrdir)/ruby/internal/core/rbignum.h
76+
data.o: $(hdrdir)/ruby/internal/core/rclass.h
77+
data.o: $(hdrdir)/ruby/internal/core/rdata.h
78+
data.o: $(hdrdir)/ruby/internal/core/rfile.h
79+
data.o: $(hdrdir)/ruby/internal/core/rhash.h
80+
data.o: $(hdrdir)/ruby/internal/core/robject.h
81+
data.o: $(hdrdir)/ruby/internal/core/rregexp.h
82+
data.o: $(hdrdir)/ruby/internal/core/rstring.h
83+
data.o: $(hdrdir)/ruby/internal/core/rstruct.h
84+
data.o: $(hdrdir)/ruby/internal/core/rtypeddata.h
85+
data.o: $(hdrdir)/ruby/internal/ctype.h
86+
data.o: $(hdrdir)/ruby/internal/dllexport.h
87+
data.o: $(hdrdir)/ruby/internal/dosish.h
88+
data.o: $(hdrdir)/ruby/internal/error.h
89+
data.o: $(hdrdir)/ruby/internal/eval.h
90+
data.o: $(hdrdir)/ruby/internal/event.h
91+
data.o: $(hdrdir)/ruby/internal/fl_type.h
92+
data.o: $(hdrdir)/ruby/internal/gc.h
93+
data.o: $(hdrdir)/ruby/internal/glob.h
94+
data.o: $(hdrdir)/ruby/internal/globals.h
95+
data.o: $(hdrdir)/ruby/internal/has/attribute.h
96+
data.o: $(hdrdir)/ruby/internal/has/builtin.h
97+
data.o: $(hdrdir)/ruby/internal/has/c_attribute.h
98+
data.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h
99+
data.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h
100+
data.o: $(hdrdir)/ruby/internal/has/extension.h
101+
data.o: $(hdrdir)/ruby/internal/has/feature.h
102+
data.o: $(hdrdir)/ruby/internal/has/warning.h
103+
data.o: $(hdrdir)/ruby/internal/intern/array.h
104+
data.o: $(hdrdir)/ruby/internal/intern/bignum.h
105+
data.o: $(hdrdir)/ruby/internal/intern/class.h
106+
data.o: $(hdrdir)/ruby/internal/intern/compar.h
107+
data.o: $(hdrdir)/ruby/internal/intern/complex.h
108+
data.o: $(hdrdir)/ruby/internal/intern/cont.h
109+
data.o: $(hdrdir)/ruby/internal/intern/dir.h
110+
data.o: $(hdrdir)/ruby/internal/intern/enum.h
111+
data.o: $(hdrdir)/ruby/internal/intern/enumerator.h
112+
data.o: $(hdrdir)/ruby/internal/intern/error.h
113+
data.o: $(hdrdir)/ruby/internal/intern/eval.h
114+
data.o: $(hdrdir)/ruby/internal/intern/file.h
115+
data.o: $(hdrdir)/ruby/internal/intern/hash.h
116+
data.o: $(hdrdir)/ruby/internal/intern/io.h
117+
data.o: $(hdrdir)/ruby/internal/intern/load.h
118+
data.o: $(hdrdir)/ruby/internal/intern/marshal.h
119+
data.o: $(hdrdir)/ruby/internal/intern/numeric.h
120+
data.o: $(hdrdir)/ruby/internal/intern/object.h
121+
data.o: $(hdrdir)/ruby/internal/intern/parse.h
122+
data.o: $(hdrdir)/ruby/internal/intern/proc.h
123+
data.o: $(hdrdir)/ruby/internal/intern/process.h
124+
data.o: $(hdrdir)/ruby/internal/intern/random.h
125+
data.o: $(hdrdir)/ruby/internal/intern/range.h
126+
data.o: $(hdrdir)/ruby/internal/intern/rational.h
127+
data.o: $(hdrdir)/ruby/internal/intern/re.h
128+
data.o: $(hdrdir)/ruby/internal/intern/ruby.h
129+
data.o: $(hdrdir)/ruby/internal/intern/select.h
130+
data.o: $(hdrdir)/ruby/internal/intern/select/largesize.h
131+
data.o: $(hdrdir)/ruby/internal/intern/signal.h
132+
data.o: $(hdrdir)/ruby/internal/intern/sprintf.h
133+
data.o: $(hdrdir)/ruby/internal/intern/string.h
134+
data.o: $(hdrdir)/ruby/internal/intern/struct.h
135+
data.o: $(hdrdir)/ruby/internal/intern/thread.h
136+
data.o: $(hdrdir)/ruby/internal/intern/time.h
137+
data.o: $(hdrdir)/ruby/internal/intern/variable.h
138+
data.o: $(hdrdir)/ruby/internal/intern/vm.h
139+
data.o: $(hdrdir)/ruby/internal/interpreter.h
140+
data.o: $(hdrdir)/ruby/internal/iterator.h
141+
data.o: $(hdrdir)/ruby/internal/memory.h
142+
data.o: $(hdrdir)/ruby/internal/method.h
143+
data.o: $(hdrdir)/ruby/internal/module.h
144+
data.o: $(hdrdir)/ruby/internal/newobj.h
145+
data.o: $(hdrdir)/ruby/internal/scan_args.h
146+
data.o: $(hdrdir)/ruby/internal/special_consts.h
147+
data.o: $(hdrdir)/ruby/internal/static_assert.h
148+
data.o: $(hdrdir)/ruby/internal/stdalign.h
149+
data.o: $(hdrdir)/ruby/internal/stdbool.h
150+
data.o: $(hdrdir)/ruby/internal/symbol.h
151+
data.o: $(hdrdir)/ruby/internal/value.h
152+
data.o: $(hdrdir)/ruby/internal/value_type.h
153+
data.o: $(hdrdir)/ruby/internal/variable.h
154+
data.o: $(hdrdir)/ruby/internal/warning_push.h
155+
data.o: $(hdrdir)/ruby/internal/xmalloc.h
156+
data.o: $(hdrdir)/ruby/missing.h
157+
data.o: $(hdrdir)/ruby/ruby.h
158+
data.o: $(hdrdir)/ruby/st.h
159+
data.o: $(hdrdir)/ruby/subst.h
160+
data.o: data.c
2161
duplicate.o: $(RUBY_EXTCONF_H)
3162
duplicate.o: $(arch_hdrdir)/ruby/config.h
4163
duplicate.o: $(hdrdir)/ruby.h

include/ruby/internal/intern/struct.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,20 @@ RBIMPL_ATTR_NONNULL((2))
198198
*/
199199
VALUE rb_struct_define_without_accessor_under(VALUE outer, const char *class_name, VALUE super, rb_alloc_func_t alloc, ...);
200200

201+
/**
202+
* Defines an anonymous data class.
203+
*
204+
* @endinternal
205+
*
206+
* @param[in] super Superclass of the defining class. Must be a
207+
* descendant of ::rb_cData, or 0 as ::rb_cData.
208+
* @param[in] ... Arbitrary number of `const char*`, terminated by
209+
* NULL. Each of which are the name of fields.
210+
* @exception rb_eArgError Duplicated field name.
211+
* @return The defined class.
212+
*/
213+
VALUE rb_data_define(VALUE super, ...);
214+
201215
RBIMPL_SYMBOL_EXPORT_END()
202216

203217
#endif /* RBIMPL_INTERN_STRUCT_H */

struct.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1722,6 +1722,18 @@ rb_data_s_def(int argc, VALUE *argv, VALUE klass)
17221722
return data_class;
17231723
}
17241724

1725+
VALUE
1726+
rb_data_define(VALUE super, ...)
1727+
{
1728+
va_list ar;
1729+
VALUE ary;
1730+
va_start(ar, super);
1731+
ary = struct_make_members_list(ar);
1732+
va_end(ar);
1733+
if (!super) super = rb_cData;
1734+
return setup_data(anonymous_struct(super), ary);
1735+
}
1736+
17251737
/*
17261738
* call-seq:
17271739
* DataClass::members -> array_of_symbols

test/-ext-/struct/test_data.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# frozen_string_literal: false
2+
require 'test/unit'
3+
require "-test-/struct"
4+
5+
class Bug::Struct::Test_Data < Test::Unit::TestCase
6+
def test_data_new_default
7+
klass = Bug::Struct.data_new(false)
8+
assert_equal Data, klass.superclass
9+
assert_equal %i[mem1 mem2], klass.members
10+
end
11+
12+
def test_data_new_superclass
13+
superclass = Data.define
14+
klass = Bug::Struct.data_new(superclass)
15+
assert_equal superclass, klass.superclass
16+
assert_equal %i[mem1 mem2], klass.members
17+
end
18+
end

0 commit comments

Comments
 (0)