array.c:1861
static VALUE
rb_ary_uniq_bang(ary)
    VALUE ary;
{
    VALUE hash;
    VALUE *p, *q, *end;

    rb_ary_modify(ary); 

    hash = ary_make_hash(ary, 0);

    if (RARRAY(ary)->len == RHASH(hash)->tbl->num_entries) {
	return Qnil;
    }
    p = q = RARRAY(ary)->ptr;
    end = p + RARRAY(ary)->len;
    while (p < end) {
	VALUE v = *p;
	if (st_delete(RHASH(hash)->tbl, (st_data_t*)&v, 0)) {
	    *q++ = *p;
	}
	p++;
    }
    RARRAY(ary)->len = (q - RARRAY(ary)->ptr);

    return ary;
}
