From 4f4965a4a20b1fba002d7b428508632604fd0b38 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Mon, 18 Jun 2012 08:58:56 +0900 Subject: allow struct access; close #295 --- src/struct.c | 58 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 20 deletions(-) (limited to 'src/struct.c') diff --git a/src/struct.c b/src/struct.c index c0af85d0e..4d59be22d 100644 --- a/src/struct.c +++ b/src/struct.c @@ -183,33 +183,51 @@ mrb_struct_modify(mrb_value s) } mrb_sym -mrb_id_attrset(mrb_sym id) +mrb_id_attrset(mrb_state *mrb, mrb_sym id) { - //id &= ~ID_SCOPE_MASK; - //id |= ID_ATTRSET; - return id; + const char *name; + char *buf; + int len; + mrb_sym mid; + + name = mrb_sym2name_len(mrb, id, &len); + buf = mrb_malloc(mrb, len+2); + memcpy(buf, name, len); + buf[len] = '='; + buf[len+1] = '\0'; + + mid = mrb_intern2(mrb, buf, len+1); + mrb_free(mrb, buf); + return mid; } static mrb_value mrb_struct_set(mrb_state *mrb, mrb_value obj, mrb_value val) { - mrb_value members, slot, *ptr, *ptr_members; - long i, len; + const char *name; + int i, len; + mrb_sym mid; + mrb_value members, slot, *ptr, *ptr_members; - members = mrb_struct_members(mrb, obj); - ptr_members = RARRAY_PTR(members); - len = RARRAY_LEN(members); - mrb_struct_modify(obj); - ptr = RSTRUCT_PTR(obj); - for (i=0; ici->mid, &len); + mid = mrb_intern2(mrb, name, len-1); /* omit last "=" */ + + members = mrb_struct_members(mrb, obj); + ptr_members = RARRAY_PTR(members); + len = RARRAY_LEN(members); + mrb_struct_modify(obj); + ptr = RSTRUCT_PTR(obj); + for (i=0; itLAST_TOKEN) @@ -275,7 +293,7 @@ make_struct(mrb_state *mrb, mrb_value name, mrb_value members, struct RClass * k else { mrb_define_method_id(mrb, c, id, mrb_struct_ref, 0); } - mrb_define_method_id(mrb, c, mrb_id_attrset(id), (mrb_func_t)mrb_struct_set, 1); + mrb_define_method_id(mrb, c, mrb_id_attrset(mrb, id), (mrb_func_t)mrb_struct_set, 1); } } -- cgit v1.2.3