Index: objc.m
===================================================================
--- objc.m	(revision 798)
+++ objc.m	(working copy)
@@ -650,6 +650,33 @@
 }
 
 static void
+rb_objc_rval_to_ocval(VALUE rval, const char *octype, void **ocval);
+
+static void
+rb_objc_ary_to_ocval(VALUE rval, const char *octype, void **ocval)
+{
+	size_t aryCount = 0;
+	while (isdigit(*octype))
+		aryCount = aryCount*10 + (*(octype++) - '0');
+		
+	size_t offset = rb_objc_octype_size(octype);
+
+	if (aryCount != RARRAY_LEN(rval))
+		rb_raise(rb_eArgError, "can't convert Ruby array `%s' to " \
+		 "Objective-C value of type `%s' because of length mismatch", 
+		 RSTRING_PTR(rb_inspect(rval)), octype);
+
+	void *oc = ocval;
+
+	size_t i = 0;
+	for (i = 0; i < aryCount; ++i)
+	{
+		rb_objc_rval_to_ocval(RARRAY_AT(rval, i), octype, oc);
+		oc += offset;
+	}
+}
+
+static void
 rb_objc_rval_to_ocval(VALUE rval, const char *octype, void **ocval)
 {
     bs_element_boxed_t *bs_boxed;
@@ -827,6 +854,12 @@
 	    }
 	    break;
 
+	case _C_ARY_B:
+	    {
+			rb_objc_ary_to_ocval(rval, octype+1, ocval);
+	    }
+	    break;
+
 	default:
 	    ok = false;
     }
@@ -854,6 +887,28 @@
 }
 
 static void
+rb_objc_ocval_to_ary(void **ocval, const char *octype, VALUE *rbval)
+{
+	size_t aryCount = 0;
+	while(isdigit(*octype))
+		aryCount = aryCount*10 + (*(octype++) - '0');
+	
+	*rbval = rb_ary_new2(aryCount);
+
+	size_t offset = rb_objc_octype_size(octype);
+
+	void *oc = ocval;
+	size_t i = 0;
+	for (i = 0; i < aryCount; ++i)
+	{
+		VALUE val = 0;
+		rb_objc_ocval_to_rval(oc, octype, &val);
+		rb_ary_insert(*rbval, i, val);
+		oc += offset;
+	}
+}
+
+static void
 rb_objc_ocval_to_rval(void **ocval, const char *octype, VALUE *rbval)
 {
     bool ok;
@@ -974,6 +1029,12 @@
 	    }
 	    break;
 
+	case _C_ARY_B:
+	{
+		rb_objc_ocval_to_ary(ocval, octype+1, rbval);
+	    break;
+	}
+
 	default:
 	    ok = false;
     }

