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(const char *class_name, VALUE super, rb_alloc_func_t alloc, ...) { VALUE klass; 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); if (class_name) { 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(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)); } va_end(ar); if (!name) st = anonymous_struct(rb_cStruct); else st = new_struct(rb_str_new2(name), rb_cStruct); return setup_struct(st, ary); }
static VALUE rb_struct_s_def(int argc, VALUE *argv, VALUE klass) { VALUE name, rest; long i; VALUE st; ID id; rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS); name = argv[0]; if (SYMBOL_P(name)) { name = Qnil; } else { --argc; ++argv; } rest = rb_ary_tmp_new(argc); for (i=0; i<argc; i++) { id = rb_to_id(argv[i]); RARRAY_ASET(rest, i, ID2SYM(id)); rb_ary_set_len(rest, i+1); } if (NIL_P(name)) { st = anonymous_struct(klass); } else { st = new_struct(name, klass); } setup_struct(st, rest); if (rb_block_given_p()) { rb_mod_module_eval(0, 0, st); } return st; }