mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
struct.c: struct_make_members_list
* struct.c (struct_make_members_list): extract making member name list from char* va_list, with creating symbols without intermediate IDs. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54611 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
25c0a2d3ad
commit
c746d5027d
2 changed files with 24 additions and 28 deletions
|
@ -1,3 +1,9 @@
|
|||
Sat Apr 16 09:59:40 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* struct.c (struct_make_members_list): extract making member name
|
||||
list from char* va_list, with creating symbols without
|
||||
intermediate IDs.
|
||||
|
||||
Sat Apr 16 01:33:27 2016 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
|
||||
|
||||
* tool/redmine-backporter.rb: sort revisions.
|
||||
|
|
46
struct.c
46
struct.c
|
@ -330,6 +330,20 @@ rb_struct_alloc_noinit(VALUE klass)
|
|||
return struct_alloc(klass);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
struct_make_members_list(va_list ar)
|
||||
{
|
||||
char *mem;
|
||||
VALUE ary = rb_ary_tmp_new(0);
|
||||
|
||||
while ((mem = va_arg(ar, char*)) != 0) {
|
||||
VALUE sym = rb_sym_intern_ascii_cstr(mem);
|
||||
rb_ary_push(ary, sym);
|
||||
}
|
||||
OBJ_FREEZE_RAW(ary);
|
||||
return ary;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
struct_define_without_accessor(VALUE outer, const char *class_name, VALUE super, rb_alloc_func_t alloc, VALUE members)
|
||||
{
|
||||
|
@ -364,15 +378,10 @@ rb_struct_define_without_accessor_under(VALUE outer, const char *class_name, VAL
|
|||
{
|
||||
va_list ar;
|
||||
VALUE members;
|
||||
char *name;
|
||||
|
||||
members = rb_ary_tmp_new(0);
|
||||
va_start(ar, alloc);
|
||||
while ((name = va_arg(ar, char*)) != NULL) {
|
||||
rb_ary_push(members, ID2SYM(rb_intern(name)));
|
||||
}
|
||||
members = struct_make_members_list(ar);
|
||||
va_end(ar);
|
||||
OBJ_FREEZE_RAW(members);
|
||||
|
||||
return struct_define_without_accessor(outer, class_name, super, alloc, members);
|
||||
}
|
||||
|
@ -382,15 +391,10 @@ rb_struct_define_without_accessor(const char *class_name, VALUE super, rb_alloc_
|
|||
{
|
||||
va_list ar;
|
||||
VALUE members;
|
||||
char *name;
|
||||
|
||||
members = rb_ary_tmp_new(0);
|
||||
va_start(ar, alloc);
|
||||
while ((name = va_arg(ar, char*)) != NULL) {
|
||||
rb_ary_push(members, ID2SYM(rb_intern(name)));
|
||||
}
|
||||
members = struct_make_members_list(ar);
|
||||
va_end(ar);
|
||||
OBJ_FREEZE_RAW(members);
|
||||
|
||||
return struct_define_without_accessor(0, class_name, super, alloc, members);
|
||||
}
|
||||
|
@ -400,17 +404,10 @@ rb_struct_define(const char *name, ...)
|
|||
{
|
||||
va_list ar;
|
||||
VALUE st, ary;
|
||||
char *mem;
|
||||
|
||||
ary = rb_ary_tmp_new(0);
|
||||
|
||||
va_start(ar, name);
|
||||
while ((mem = va_arg(ar, char*)) != 0) {
|
||||
ID slot = rb_intern(mem);
|
||||
rb_ary_push(ary, ID2SYM(slot));
|
||||
}
|
||||
ary = struct_make_members_list(ar);
|
||||
va_end(ar);
|
||||
OBJ_FREEZE_RAW(ary);
|
||||
|
||||
if (!name) st = anonymous_struct(rb_cStruct);
|
||||
else st = new_struct(rb_str_new2(name), rb_cStruct);
|
||||
|
@ -422,17 +419,10 @@ rb_struct_define_under(VALUE outer, const char *name, ...)
|
|||
{
|
||||
va_list ar;
|
||||
VALUE ary;
|
||||
char *mem;
|
||||
|
||||
ary = rb_ary_tmp_new(0);
|
||||
|
||||
va_start(ar, name);
|
||||
while ((mem = va_arg(ar, char*)) != 0) {
|
||||
ID slot = rb_intern(mem);
|
||||
rb_ary_push(ary, ID2SYM(slot));
|
||||
}
|
||||
ary = struct_make_members_list(ar);
|
||||
va_end(ar);
|
||||
OBJ_FREEZE_RAW(ary);
|
||||
|
||||
return setup_struct(rb_define_class_under(outer, name, rb_cStruct), ary);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue