[macruby-changes] [1793] MacRuby/branches/experimental/struct.c
source_changes at macosforge.org
source_changes at macosforge.org
Sat Jun 6 20:41:15 PDT 2009
Revision: 1793
http://trac.macosforge.org/projects/ruby/changeset/1793
Author: lsansonetti at apple.com
Date: 2009-06-06 20:41:14 -0700 (Sat, 06 Jun 2009)
Log Message:
-----------
fixed several bugs in the Struct class, now it's usable again
Modified Paths:
--------------
MacRuby/branches/experimental/struct.c
Modified: MacRuby/branches/experimental/struct.c
===================================================================
--- MacRuby/branches/experimental/struct.c 2009-06-07 00:59:21 UTC (rev 1792)
+++ MacRuby/branches/experimental/struct.c 2009-06-07 03:41:14 UTC (rev 1793)
@@ -160,25 +160,33 @@
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 (rb_id_attrset(SYM2ID(slot)) == rb_frame_this_func()) {
+ if (SYM2ID(slot) == field) {
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()));
+ rb_id2name(field));
return Qnil; /* not reached */
}
+VALUE rb_class_new_instance_imp(VALUE klass, SEL sel, int argc, VALUE *argv);
+
static VALUE
make_struct(VALUE name, VALUE members, VALUE klass)
{
VALUE nstr;
ID id;
- long i;
+ long i, count;
OBJ_FREEZE(members);
if (NIL_P(name)) {
@@ -193,7 +201,8 @@
name = rb_str_to_str(name);
id = rb_to_id(name);
if (!rb_is_const_id(id)) {
- rb_name_error(id, "identifier %s needs to be constant", StringValuePtr(name));
+ rb_name_error(id, "identifier %s needs to be constant",
+ StringValuePtr(name));
}
if (rb_const_defined_at(klass, id)) {
rb_warn("redefining constant Struct::%s", StringValuePtr(name));
@@ -205,10 +214,10 @@
rb_iv_set(nstr, "__members__", members);
rb_objc_define_method(*(VALUE *)nstr, "alloc", struct_alloc, 0);
- rb_objc_define_method(*(VALUE *)nstr, "new", rb_class_new_instance, -1);
- rb_objc_define_method(*(VALUE *)nstr, "[]", rb_class_new_instance, -1);
+ rb_objc_define_method(*(VALUE *)nstr, "new", rb_class_new_instance_imp, -1);
+ rb_objc_define_method(*(VALUE *)nstr, "[]", rb_class_new_instance_imp, -1);
rb_objc_define_method(*(VALUE *)nstr, "members", rb_struct_s_members_m, 0);
- for (i=0; i< RARRAY_LEN(members); i++) {
+ for (i = 0, count = RARRAY_LEN(members); i < count; i++) {
ID id = SYM2ID(RARRAY_AT(members, i));
if (rb_is_local_id(id) || rb_is_const_id(id)) {
if (i < N_REF_FUNC) {
@@ -217,7 +226,8 @@
else {
rb_objc_define_method(nstr, rb_id2name(id), rb_struct_ref, 0);
}
- rb_objc_define_method(nstr, rb_id2name(rb_id_attrset(id)), rb_struct_set, 1);
+ rb_objc_define_method(nstr, rb_id2name(rb_id_attrset(id)),
+ rb_struct_set, 1);
}
}
@@ -328,7 +338,7 @@
rb_struct_s_def(VALUE klass, SEL sel, int argc, VALUE *argv)
{
VALUE name, rest;
- long i;
+ long i, count;
VALUE st;
ID id;
@@ -337,7 +347,7 @@
rb_ary_unshift(rest, name);
name = Qnil;
}
- for (i=0; i<RARRAY_LEN(rest); i++) {
+ for (i = 0, count = RARRAY_LEN(rest); i < count; i++) {
id = rb_to_id(RARRAY_AT(rest, i));
rb_ary_store(rest, i, ID2SYM(id));
}
@@ -515,13 +525,13 @@
slot = RARRAY_AT(members, i);
id = SYM2ID(slot);
if (rb_is_local_id(id) || rb_is_const_id(id)) {
- rb_str_append(str, rb_id2str(id));
+ rb_str_buf_append(str, rb_id2str(id));
}
else {
- rb_str_append(str, rb_inspect(slot));
+ rb_str_buf_append(str, rb_inspect(slot));
}
rb_str_cat2(str, "=");
- rb_str_append(str, rb_inspect(RSTRUCT_PTR(s)[i]));
+ rb_str_buf_append(str, rb_inspect(RSTRUCT_PTR(s)[i]));
}
rb_str_cat2(str, ">");
OBJ_INFECT(str, s);
@@ -916,8 +926,8 @@
rb_objc_define_method(rb_cStruct, "each", rb_struct_each, 0);
rb_objc_define_method(rb_cStruct, "each_pair", rb_struct_each_pair, 0);
- rb_objc_define_method(rb_cStruct, "[]", rb_struct_aref, 1);
- rb_objc_define_method(rb_cStruct, "[]=", rb_struct_aset, 2);
+ rb_objc_define_method(rb_cStruct, "[]", rb_struct_aref_imp, 1);
+ rb_objc_define_method(rb_cStruct, "[]=", rb_struct_aset_imp, 2);
rb_objc_define_method(rb_cStruct, "select", rb_struct_select, -1);
rb_objc_define_method(rb_cStruct, "values_at", rb_struct_values_at, -1);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090606/e428fa74/attachment.html>
More information about the macruby-changes
mailing list