static VALUE struct_alloc(VALUE klass) { VALUE size; long n; NEWOBJ(st, struct RStruct); OBJSETUP(st, klass, T_STRUCT); size = rb_struct_iv_get(klass, "__size__"); n = FIX2LONG(size); if (0 < n && n <= RSTRUCT_EMBED_LEN_MAX) { RBASIC(st)->flags &= ~RSTRUCT_EMBED_LEN_MASK; RBASIC(st)->flags |= n << RSTRUCT_EMBED_LEN_SHIFT; rb_mem_clear(st->as.ary, n); } else { if (n > 0) { GC_WB(&st->as.heap.ptr, xmalloc_ptrs(sizeof(VALUE) * n)); rb_mem_clear(st->as.heap.ptr, n); } else { st->as.heap.ptr = NULL; } st->as.heap.len = n; } return (VALUE)st; }
static VALUE array_spec_rb_mem_clear(VALUE self, VALUE obj) { VALUE ary = obj; rb_mem_clear(&ary, 1); return ary; }
static VALUE struct_alloc(VALUE klass) { long n; NEWOBJ_OF(st, struct RStruct, klass, T_STRUCT); n = num_members(klass); if (0 < n && n <= RSTRUCT_EMBED_LEN_MAX) { RBASIC(st)->flags &= ~RSTRUCT_EMBED_LEN_MASK; RBASIC(st)->flags |= n << RSTRUCT_EMBED_LEN_SHIFT; rb_mem_clear(st->as.ary, n); } else { st->as.heap.ptr = ALLOC_N(VALUE, n); rb_mem_clear(st->as.heap.ptr, n); st->as.heap.len = n; } return (VALUE)st; }
static VALUE rb_struct_initialize_m(int argc, VALUE *argv, VALUE self) { VALUE klass = rb_obj_class(self); long n; rb_struct_modify(self); n = num_members(klass); if (n < argc) { rb_raise(rb_eArgError, "struct size differs"); } MEMCPY(RSTRUCT_PTR(self), argv, VALUE, argc); if (n > argc) { rb_mem_clear(RSTRUCT_PTR(self)+argc, n-argc); } return Qnil; }
static VALUE struct_alloc(VALUE klass) { VALUE size; long n; NEWOBJ(st, struct RStruct); OBJSETUP(st, klass, T_STRUCT); size = rb_struct_iv_get(klass, "__size__"); n = FIX2LONG(size); st->ptr = ALLOC_N(VALUE, n); rb_mem_clear(st->ptr, n); st->len = n; return (VALUE)st; }
static VALUE rb_struct_initialize_m(int argc, const VALUE *argv, VALUE self) { VALUE klass = rb_obj_class(self); long i, n; rb_struct_modify(self); n = num_members(klass); if (n < argc) { rb_raise(rb_eArgError, "struct size differs"); } for (i=0; i<argc; i++) { RSTRUCT_SET(self, i, argv[i]); } if (n > argc) { rb_mem_clear((VALUE *)RSTRUCT_CONST_PTR(self)+argc, n-argc); } return Qnil; }
static VALUE rb_struct_initialize(VALUE self, VALUE values) { VALUE klass = rb_obj_class(self); VALUE size; long n; rb_struct_modify(self); size = rb_struct_iv_get(klass, "__size__"); n = FIX2LONG(size); if (n < RARRAY(values)->len) { rb_raise(rb_eArgError, "struct size differs"); } MEMCPY(RSTRUCT(self)->ptr, RARRAY(values)->ptr, VALUE, RARRAY(values)->len); if (n > RARRAY(values)->len) { rb_mem_clear(RSTRUCT(self)->ptr+RARRAY(values)->len, n-RARRAY(values)->len); } return Qnil; }