mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* struct.c (rb_struct_define_without_accessor_under): added.
This function is similar to rb_define_class_under() against rb_define_class(). * include/ruby/intern.h: add a declaration of this function. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42725 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
74b85189b8
commit
5da55dfcb4
3 changed files with 57 additions and 15 deletions
|
@ -1,3 +1,11 @@
|
|||
Thu Aug 29 18:05:33 2013 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* struct.c (rb_struct_define_without_accessor_under): added.
|
||||
This function is similar to rb_define_class_under() against
|
||||
rb_define_class().
|
||||
|
||||
* include/ruby/intern.h: add a declaration of this function.
|
||||
|
||||
Thu Aug 29 17:03:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* vm_insnhelper.c (vm_call_method): a method entry refers the based
|
||||
|
|
|
@ -848,6 +848,8 @@ VALUE rb_struct_s_members(VALUE);
|
|||
VALUE rb_struct_members(VALUE);
|
||||
VALUE rb_struct_alloc_noinit(VALUE);
|
||||
VALUE rb_struct_define_without_accessor(const char *, VALUE, rb_alloc_func_t, ...);
|
||||
VALUE rb_struct_define_without_accessor_under(VALUE outer, const char *class_name, VALUE super, rb_alloc_func_t alloc, ...);
|
||||
|
||||
/* thread.c */
|
||||
typedef void rb_unblock_function_t(void *);
|
||||
typedef VALUE rb_blocking_function_t(void *);
|
||||
|
|
62
struct.c
62
struct.c
|
@ -229,10 +229,38 @@ rb_struct_alloc_noinit(VALUE klass)
|
|||
return struct_alloc(klass);
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_struct_define_without_accessor(const char *class_name, VALUE super, rb_alloc_func_t alloc, ...)
|
||||
static VALUE
|
||||
struct_define_without_accessor(VALUE outer, const char *class_name, VALUE super, rb_alloc_func_t alloc, VALUE members)
|
||||
{
|
||||
VALUE klass;
|
||||
|
||||
if (class_name) {
|
||||
if (outer) {
|
||||
klass = rb_define_class_under(outer, class_name, super);
|
||||
}
|
||||
else {
|
||||
klass = rb_define_class(class_name, super);
|
||||
}
|
||||
}
|
||||
else {
|
||||
klass = anonymous_struct(super);
|
||||
}
|
||||
|
||||
rb_ivar_set(klass, id_members, members);
|
||||
|
||||
if (alloc) {
|
||||
rb_define_alloc_func(klass, alloc);
|
||||
}
|
||||
else {
|
||||
rb_define_alloc_func(klass, struct_alloc);
|
||||
}
|
||||
|
||||
return klass;
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_struct_define_without_accessor_under(VALUE outer, const char *class_name, VALUE super, rb_alloc_func_t alloc, ...)
|
||||
{
|
||||
va_list ar;
|
||||
VALUE members;
|
||||
char *name;
|
||||
|
@ -245,21 +273,25 @@ rb_struct_define_without_accessor(const char *class_name, VALUE super, rb_alloc_
|
|||
va_end(ar);
|
||||
OBJ_FREEZE(members);
|
||||
|
||||
if (class_name) {
|
||||
klass = rb_define_class(class_name, super);
|
||||
}
|
||||
else {
|
||||
klass = anonymous_struct(super);
|
||||
return struct_define_without_accessor(outer, class_name, super, alloc, members);
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_struct_define_without_accessor(const char *class_name, VALUE super, rb_alloc_func_t 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)));
|
||||
}
|
||||
va_end(ar);
|
||||
OBJ_FREEZE(members);
|
||||
|
||||
rb_ivar_set(klass, id_members, members);
|
||||
|
||||
if (alloc)
|
||||
rb_define_alloc_func(klass, alloc);
|
||||
else
|
||||
rb_define_alloc_func(klass, struct_alloc);
|
||||
|
||||
return klass;
|
||||
return struct_define_without_accessor(0, class_name, super, alloc, members);
|
||||
}
|
||||
|
||||
VALUE
|
||||
|
|
Loading…
Reference in a new issue