Revision: 1896 http://trac.macosforge.org/projects/ruby/changeset/1896 Author: lsansonetti@apple.com Date: 2009-06-19 19:22:44 -0700 (Fri, 19 Jun 2009) Log Message: ----------- also allow an Array of objects as a Pointer arg Modified Paths: -------------- MacRuby/branches/experimental/bridgesupport.cpp MacRuby/branches/experimental/compiler.cpp Modified: MacRuby/branches/experimental/bridgesupport.cpp =================================================================== --- MacRuby/branches/experimental/bridgesupport.cpp 2009-06-20 00:57:44 UTC (rev 1895) +++ MacRuby/branches/experimental/bridgesupport.cpp 2009-06-20 02:22:44 UTC (rev 1896) @@ -537,14 +537,33 @@ return Data_Wrap_Struct(rb_cPointer, NULL, NULL, ptr); } -static VALUE rb_pointer_assign(VALUE rcv, SEL sel, VALUE val); +static VALUE rb_pointer_aset(VALUE rcv, SEL sel, VALUE idx, VALUE val); VALUE rb_pointer_new2(const char *type_str, VALUE rval) { - VALUE p = rb_pointer_new(type_str, - xmalloc(GET_VM()->get_sizeof(type_str))); - rb_pointer_assign(p, 0, rval); + VALUE p; + + if (TYPE(rval) == T_ARRAY) { + const int len = RARRAY_LEN(rval); + if (len == 0) { + rb_raise(rb_eArgError, + "can't convert an empty array to a `%s' pointer", + type_str); + } + p = rb_pointer_new(type_str, + xmalloc(GET_VM()->get_sizeof(type_str) * len)); + int i; + for (i = 0; i < len; i++) { + rb_pointer_aset(p, 0, INT2FIX(i), RARRAY_AT(rval, i)); + } + } + else { + p = rb_pointer_new(type_str, + xmalloc(GET_VM()->get_sizeof(type_str))); + rb_pointer_aset(p, 0, INT2FIX(0), rval); + } + return p; } Modified: MacRuby/branches/experimental/compiler.cpp =================================================================== --- MacRuby/branches/experimental/compiler.cpp 2009-06-20 00:57:44 UTC (rev 1895) +++ MacRuby/branches/experimental/compiler.cpp 2009-06-20 02:22:44 UTC (rev 1896) @@ -4605,9 +4605,10 @@ *cptr = NULL; } else { - if (rb_boxed_is_type(CLASS_OF(rval), type + 1)) { - // A convenience helper so that the user can pass a Boxed object - // instead of a Pointer to the object. + if (TYPE(rval) == T_ARRAY + || rb_boxed_is_type(CLASS_OF(rval), type + 1)) { + // A convenience helper so that the user can pass a Boxed or an + // Array object instead of a Pointer to the object. rval = rb_pointer_new2(type + 1, rval); } *cptr = rb_pointer_get_data(rval, type);
participants (1)
-
source_changes@macosforge.org