static VALUE rb_struct_aset_id(VALUE s, ID id, VALUE val) { VALUE members, *ptr, *ptr_members; long i, len; members = rb_struct_members(s); len = RARRAY_LEN(members); rb_struct_modify(s); if (RSTRUCT_LEN(s) != len) { rb_raise(rb_eTypeError, "struct size differs (%ld required %ld given)", len, RSTRUCT_LEN(s)); } ptr = RSTRUCT_PTR(s); ptr_members = RARRAY_PTR(members); for (i=0; i<len; i++) { if (SYM2ID(ptr_members[i]) == id) { ptr[i] = val; return val; } } rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); UNREACHABLE; }
static VALUE rb_struct_set(VALUE obj, SEL sel, VALUE val) { VALUE members, slot; long i; // foo=: -> foo char buf[100]; const size_t s = strlcpy(buf, sel_getName(sel), sizeof buf); buf[s - 2] = '\0'; ID field = rb_intern(buf); members = rb_struct_members(obj); rb_struct_modify(obj); for (i=0; i<RARRAY_LEN(members); i++) { slot = RARRAY_AT(members, i); if (SYM2ID(slot) == field) { GC_WB(&RSTRUCT_PTR(obj)[i], val); return val; } } rb_name_error(rb_frame_this_func(), "`%s' is not a struct member", rb_id2name(field)); return Qnil; /* not reached */ }
static VALUE rb_struct_to_h(VALUE s) { VALUE h = rb_hash_new(); VALUE members = rb_struct_members(s); long i; for (i=0; i<RSTRUCT_LEN(s); i++) { rb_hash_aset(h, rb_ary_entry(members, i), RSTRUCT_PTR(s)[i]); } return h; }
static VALUE rb_struct_each_pair(VALUE s) { VALUE members; long i; RETURN_ENUMERATOR(s, 0, 0); members = rb_struct_members(s); for (i=0; i<RSTRUCT_LEN(s); i++) { rb_yield_values(2, rb_ary_entry(members, i), RSTRUCT_PTR(s)[i]); } return s; }
static VALUE rb_struct_each_pair(VALUE s) { VALUE members; long i; RETURN_SIZED_ENUMERATOR(s, 0, 0, rb_struct_size); members = rb_struct_members(s); for (i=0; i<RSTRUCT_LEN(s); i++) { VALUE key = rb_ary_entry(members, i); VALUE value = RSTRUCT_PTR(s)[i]; rb_yield(rb_assoc_new(key, value)); } return s; }
static VALUE rb_struct_aref_id(VALUE s, ID id) { VALUE members = rb_struct_members(s); long i, len = RARRAY_LEN(members); for (i=0; i<len; i++) { if (SYM2ID(RARRAY_AREF(members, i)) == id) { return RSTRUCT_GET(s, i); } } rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); UNREACHABLE; }
VALUE rb_struct_getmember(VALUE obj, ID id) { VALUE members, slot; long i; members = rb_struct_members(obj); slot = ID2SYM(id); for (i=0; i<RARRAY_LEN(members); i++) { if (RARRAY_PTR(members)[i] == slot) { return RSTRUCT_PTR(obj)[i]; } } rb_name_error(id, "%s is not struct member", rb_id2name(id)); return Qnil; /* not reached */ }
static VALUE rb_struct_aref_id(VALUE s, ID id) { VALUE members; long i, len; members = rb_struct_members(s); len = RARRAY_LEN(members); for (i=0; i<len; i++) { if (SYM2ID(RARRAY_PTR(members)[i]) == id) { return RSTRUCT_PTR(s)[i]; } } rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); return Qnil; /* not reached */ }
static VALUE inspect_struct(VALUE s, VALUE dummy, int recur) { VALUE cname = rb_class_name(rb_obj_class(s)); VALUE members, str = rb_str_new2("#<struct "); VALUE *ptr, *ptr_members; long i, len; char first = RSTRING_PTR(cname)[0]; if (recur || first != '#') { rb_str_append(str, cname); } if (recur) { return rb_str_cat2(str, ":...>"); } members = rb_struct_members(s); ptr_members = RARRAY_PTR(members); ptr = RSTRUCT_PTR(s); len = RSTRUCT_LEN(s); for (i=0; i<len; i++) { VALUE slot; ID id; if (i > 0) { rb_str_cat2(str, ", "); } else if (first != '#') { rb_str_cat2(str, " "); } slot = ptr_members[i]; id = SYM2ID(slot); if (rb_is_local_id(id) || rb_is_const_id(id)) { rb_str_append(str, rb_id2str(id)); } else { rb_str_append(str, rb_inspect(slot)); } rb_str_cat2(str, "="); rb_str_append(str, rb_inspect(ptr[i])); } rb_str_cat2(str, ">"); OBJ_INFECT(str, s); return str; }
VALUE rb_struct_getmember(VALUE obj, ID id) { VALUE members, slot; long i, len; members = rb_struct_members(obj); slot = ID2SYM(id); len = RARRAY_LEN(members); for (i=0; i<len; i++) { if (RARRAY_AREF(members, i) == slot) { return RSTRUCT_GET(obj, i); } } rb_name_error(id, "%s is not struct member", rb_id2name(id)); UNREACHABLE; }
VALUE rb_struct_getmember(VALUE obj, ID id) { VALUE members, slot, *ptr; long i, len; ptr = RSTRUCT_PTR(obj); members = rb_struct_members(obj); slot = ID2SYM(id); len = RARRAY_LEN(members); for (i=0; i<len; i++) { if (RARRAY_AT(members, i) == slot) { return ptr[i]; } } rb_name_error(id, "%s is not struct member", rb_id2name(id)); return Qnil; /* not reached */ }
static VALUE rb_struct_set(VALUE obj, VALUE val) { VALUE members, slot; long i; members = rb_struct_members(obj); rb_struct_modify(obj); for (i=0; i<RARRAY_LEN(members); i++) { slot = RARRAY_PTR(members)[i]; if (rb_id_attrset(SYM2ID(slot)) == rb_frame_this_func()) { return RSTRUCT_PTR(obj)[i] = val; } } rb_name_error(rb_frame_this_func(), "`%s' is not a struct member", rb_id2name(rb_frame_this_func())); return Qnil; /* not reached */ }
static VALUE rb_struct_aref_id(VALUE s, ID id) { VALUE *ptr, members, *ptr_members; long i, len; ptr = RSTRUCT_PTR(s); members = rb_struct_members(s); ptr_members = RARRAY_PTR(members); len = RARRAY_LEN(members); for (i=0; i<len; i++) { if (SYM2ID(ptr_members[i]) == id) { return ptr[i]; } } rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); UNREACHABLE; }
VALUE rb_struct_getmember(VALUE obj, ID id) { VALUE members, slot, *ptr, *ptr_members; long i, len; ptr = RSTRUCT_PTR(obj); members = rb_struct_members(obj); ptr_members = RARRAY_PTR(members); slot = ID2SYM(id); len = RARRAY_LEN(members); for (i=0; i<len; i++) { if (ptr_members[i] == slot) { return ptr[i]; } } rb_name_error(id, "%s is not struct member", rb_id2name(id)); UNREACHABLE; }
static VALUE rb_struct_set(VALUE obj, VALUE val) { VALUE members, slot; ID id; long i; members = rb_struct_members(obj); rb_struct_modify(obj); id = ruby_frame->orig_func; for (i=0; i<RARRAY(members)->len; i++) { slot = RARRAY(members)->ptr[i]; if (rb_id_attrset(SYM2ID(slot)) == id) { return RSTRUCT(obj)->ptr[i] = val; } } rb_name_error(ruby_frame->last_func, "`%s' is not a struct member", rb_id2name(id)); return Qnil; /* not reached */ }
static VALUE inspect_struct(VALUE s, VALUE dummy, int recur) { const char *cname = rb_class2name(rb_obj_class(s)); VALUE str, members; long i; if (recur) { return rb_sprintf("#<struct %s:...>", cname); } members = rb_struct_members(s); if (cname[0] == '#') { str = rb_str_new2("#<struct "); } else { str = rb_sprintf("#<struct %s ", cname); } for (i=0; i<RSTRUCT_LEN(s); i++) { VALUE slot; ID id; if (i > 0) { rb_str_cat2(str, ", "); } slot = RARRAY_AT(members, i); id = SYM2ID(slot); if (rb_is_local_id(id) || rb_is_const_id(id)) { rb_str_buf_append(str, rb_id2str(id)); } else { rb_str_buf_append(str, rb_inspect(slot)); } rb_str_cat2(str, "="); rb_str_buf_append(str, rb_inspect(RSTRUCT_PTR(s)[i])); } rb_str_cat2(str, ">"); OBJ_INFECT(str, s); return str; }
static VALUE rb_struct_aset_id(VALUE s, ID id, VALUE val) { VALUE members; long i, len; members = rb_struct_members(s); rb_struct_modify(s); len = RARRAY_LEN(members); if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) { rb_raise(rb_eTypeError, "struct size differs (%ld required %ld given)", RARRAY_LEN(members), RSTRUCT_LEN(s)); } for (i=0; i<len; i++) { if (SYM2ID(RARRAY_AT(members, i)) == id) { GC_WB(&RSTRUCT_PTR(s)[i], val); return val; } } rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); }
static VALUE rb_struct_set(VALUE obj, VALUE val) { VALUE members, slot; long i, len; members = rb_struct_members(obj); len = RARRAY_LEN(members); rb_struct_modify(obj); for (i=0; i<len; i++) { slot = RARRAY_AREF(members, i); if (rb_id_attrset(SYM2ID(slot)) == rb_frame_this_func()) { RSTRUCT_SET(obj, i, val); return val; } } rb_name_error(rb_frame_this_func(), "`%s' is not a struct member", rb_id2name(rb_frame_this_func())); UNREACHABLE; }
static VALUE rb_struct_aset_id(VALUE s, ID id, VALUE val) { VALUE members; long i, len; members = rb_struct_members(s); rb_struct_modify(s); len = RARRAY(members)->len; if (RSTRUCT(s)->len != RARRAY(members)->len) { rb_raise(rb_eTypeError, "struct size differs (%d required %d given)", RARRAY(members)->len, RSTRUCT(s)->len); } for (i=0; i<len; i++) { if (SYM2ID(RARRAY(members)->ptr[i]) == id) { RSTRUCT(s)->ptr[i] = val; return val; } } rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); }
static VALUE rb_struct_aset_id(VALUE s, ID id, VALUE val) { VALUE members = rb_struct_members(s); long i, len = RARRAY_LEN(members); if (RSTRUCT_LEN(s) != len) { rb_raise(rb_eTypeError, "struct size differs (%ld required %ld given)", len, RSTRUCT_LEN(s)); } for (i=0; i<len; i++) { if (SYM2ID(RARRAY_AREF(members, i)) == id) { rb_struct_modify(s); RSTRUCT_SET(s, i, val); return val; } } rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); UNREACHABLE; }
static VALUE rb_struct_set(VALUE obj, VALUE val) { VALUE members, slot, *ptr, *ptr_members; long i, len; members = rb_struct_members(obj); ptr_members = RARRAY_PTR(members); len = RARRAY_LEN(members); rb_struct_modify(obj); ptr = RSTRUCT_PTR(obj); for (i=0; i<len; i++) { slot = ptr_members[i]; if (rb_id_attrset(SYM2ID(slot)) == rb_frame_this_func()) { return ptr[i] = val; } } rb_name_error(rb_frame_this_func(), "`%s' is not a struct member", rb_id2name(rb_frame_this_func())); UNREACHABLE; }
static VALUE rb_struct_each_pair(VALUE s) { VALUE members; long i; RETURN_SIZED_ENUMERATOR(s, 0, 0, struct_enum_size); members = rb_struct_members(s); if (rb_block_arity() > 1) { for (i=0; i<RSTRUCT_LEN(s); i++) { VALUE key = rb_ary_entry(members, i); VALUE value = RSTRUCT_GET(s, i); rb_yield_values(2, key, value); } } else { for (i=0; i<RSTRUCT_LEN(s); i++) { VALUE key = rb_ary_entry(members, i); VALUE value = RSTRUCT_GET(s, i); rb_yield(rb_assoc_new(key, value)); } } return s; }
static VALUE inspect_struct(VALUE s) { const char *cname = rb_class2name(rb_obj_class(s)); VALUE str, members; long i; members = rb_struct_members(s); str = rb_str_buf_new2("#<struct "); rb_str_cat2(str, cname); rb_str_cat2(str, " "); for (i=0; i<RSTRUCT(s)->len; i++) { VALUE slot; ID id; const char *p; if (i > 0) { rb_str_cat2(str, ", "); } slot = RARRAY(members)->ptr[i]; id = SYM2ID(slot); if (rb_is_local_id(id) || rb_is_const_id(id)) { p = rb_id2name(id); rb_str_cat2(str, p); } else { rb_str_append(str, rb_inspect(slot)); } rb_str_cat2(str, "="); rb_str_append(str, rb_inspect(RSTRUCT(s)->ptr[i])); } rb_str_cat2(str, ">"); OBJ_INFECT(str, s); return str; }
static VALUE struct_spec_rb_struct_members(VALUE self, VALUE st) { return rb_ary_dup(rb_struct_members(st)); }