array.c:1812
static VALUE
rb_ary_and(ary1, ary2)
    VALUE ary1, ary2;
{
    VALUE hash, ary3;
    long i;

    ary2 = to_ary(ary2);
    ary3 = rb_ary_new2(RARRAY(ary1)->len < RARRAY(ary2)->len ?
	    RARRAY(ary1)->len : RARRAY(ary2)->len);
    hash = ary_make_hash(ary2, 0);

    for (i=0; i<RARRAY(ary1)->len; i++) {
	VALUE v = RARRAY(ary1)->ptr[i];
	if (st_delete(RHASH(hash)->tbl, (st_data_t*)&v, 0)) {
	    rb_ary_push(ary3, RARRAY(ary1)->ptr[i]);
	}
    }

    return ary3;
}
