a | b | |
---|
| 0 | + | --- array.c (revision 25052) |
---|
| 0 | + | +++ array.c (working copy) |
---|
| 0 | + | @@ -2708,8 +2708,8 @@ |
---|
| 0 | + | static VALUE |
---|
| 0 | + | rb_ary_times(VALUE ary, VALUE times) |
---|
| 0 | + | { |
---|
| 0 | + | - VALUE ary2, tmp; |
---|
| 0 | + | - long i, len; |
---|
| 0 | + | + VALUE ary2, tmp, *ptr, *ptr2; |
---|
| 0 | + | + long i, t, len; |
---|
| 0 | + | |
---|
| 0 | + | tmp = rb_check_string_type(times); |
---|
| 0 | + | if (!NIL_P(tmp)) { |
---|
| 0 | + | @@ -2732,8 +2732,11 @@ |
---|
| 0 | + | ary2 = ary_new(rb_obj_class(ary), len); |
---|
| 0 | + | ARY_SET_LEN(ary2, len); |
---|
| 0 | + | |
---|
| 0 | + | - for (i=0; i<len; i+=RARRAY_LEN(ary)) { |
---|
| 0 | + | - MEMCPY(RARRAY_PTR(ary2)+i, RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary)); |
---|
| 0 | + | + ptr = RARRAY_PTR(ary); |
---|
| 0 | + | + ptr2 = RARRAY_PTR(ary2); |
---|
| 0 | + | + t = RARRAY_LEN(ary); |
---|
| 0 | + | + for (i=0; i<len; i+=t) { |
---|
| 0 | + | + MEMCPY(ptr2+i, ptr, VALUE, t); |
---|
| 0 | + | } |
---|
| 0 | + | out: |
---|
| 0 | + | OBJ_INFECT(ary2, ary); |
---|
| 0 | + | @@ -3491,14 +3494,16 @@ |
---|
| 0 | + | static VALUE |
---|
| 0 | + | rb_ary_shuffle_bang(VALUE ary) |
---|
| 0 | + | { |
---|
| 0 | + | + VALUE *ptr; |
---|
| 0 | + | long i = RARRAY_LEN(ary); |
---|
| 0 | + | |
---|
| 0 | + | rb_ary_modify(ary); |
---|
| 0 | + | + ptr = RARRAY_PTR(ary); |
---|
| 0 | + | while (i) { |
---|
| 0 | + | long j = (long)(rb_genrand_real()*i); |
---|
| 0 | + | - VALUE tmp = RARRAY_PTR(ary)[--i]; |
---|
| 0 | + | - RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j]; |
---|
| 0 | + | - RARRAY_PTR(ary)[j] = tmp; |
---|
| 0 | + | + VALUE tmp = ptr[--i]; |
---|
| 0 | + | + ptr[i] = ptr[j]; |
---|
| 0 | + | + ptr[j] = tmp; |
---|
| 0 | + | } |
---|
| 0 | + | return ary; |
---|
| 0 | + | } |
---|
| 0 | + | @@ -3576,6 +3581,7 @@ |
---|
| 0 | + | return rb_ary_new3(3, ptr[i], ptr[j], ptr[k]); |
---|
| 0 | + | } |
---|
| 0 | + | if ((size_t)n < sizeof(idx)/sizeof(idx[0])) { |
---|
| 0 | + | + VALUE *ptr_result; |
---|
| 0 | + | long sorted[sizeof(idx)/sizeof(idx[0])]; |
---|
| 0 | + | sorted[0] = idx[0] = (long)(rb_genrand_real()*len); |
---|
| 0 | + | for (i=1; i<n; i++) { |
---|
| 0 | + | @@ -3588,18 +3594,21 @@ |
---|
| 0 | + | sorted[j] = idx[i] = k; |
---|
| 0 | + | } |
---|
| 0 | + | result = rb_ary_new2(n); |
---|
| 0 | + | + ptr_result = RARRAY_PTR(result); |
---|
| 0 | + | for (i=0; i<n; i++) { |
---|
| 0 | + | - RARRAY_PTR(result)[i] = RARRAY_PTR(ary)[idx[i]]; |
---|
| 0 | + | + ptr_result[i] = ptr[idx[i]]; |
---|
| 0 | + | } |
---|
| 0 | + | } |
---|
| 0 | + | else { |
---|
| 0 | + | + VALUE *ptr_result; |
---|
| 0 | + | result = rb_ary_new4(len, ptr); |
---|
| 0 | + | + ptr_result = RARRAY_PTR(result); |
---|
| 0 | + | RB_GC_GUARD(ary); |
---|
| 0 | + | for (i=0; i<n; i++) { |
---|
| 0 | + | j = (long)(rb_genrand_real()*(len-i)) + i; |
---|
| 0 | + | - nv = RARRAY_PTR(result)[j]; |
---|
| 0 | + | - RARRAY_PTR(result)[j] = RARRAY_PTR(result)[i]; |
---|
| 0 | + | - RARRAY_PTR(result)[i] = nv; |
---|
| 0 | + | + nv = ptr_result[j]; |
---|
| 0 | + | + ptr_result[j] = ptr_result[i]; |
---|
| 0 | + | + ptr_result[i] = nv; |
---|
| 0 | + | } |
---|
| 0 | + | } |
---|
| 0 | + | ARY_SET_LEN(result, n); |
---|
| 0 | + | --- string.c (revision 25052) |
---|
| 0 | + | +++ string.c (working copy) |
---|
| 0 | + | @@ -1159,6 +1159,7 @@ |
---|
| 0 | + | { |
---|
| 0 | + | VALUE str2; |
---|
| 0 | + | long n, len; |
---|
| 0 | + | + char *ptr2; |
---|
| 0 | + | |
---|
| 0 | + | len = NUM2LONG(times); |
---|
| 0 | + | if (len < 0) { |
---|
| 0 | + | @@ -1169,16 +1170,17 @@ |
---|
| 0 | + | } |
---|
| 0 | + | |
---|
| 0 | + | str2 = rb_str_new5(str, 0, len *= RSTRING_LEN(str)); |
---|
| 0 | + | + ptr2 = RSTRING_PTR(str2); |
---|
| 0 | + | if (len) { |
---|
| 0 | + | n = RSTRING_LEN(str); |
---|
| 0 | + | - memcpy(RSTRING_PTR(str2), RSTRING_PTR(str), n); |
---|
| 0 | + | + memcpy(ptr2, RSTRING_PTR(str), n); |
---|
| 0 | + | while (n <= len/2) { |
---|
| 0 | + | - memcpy(RSTRING_PTR(str2) + n, RSTRING_PTR(str2), n); |
---|
| 0 | + | + memcpy(ptr2 + n, ptr2, n); |
---|
| 0 | + | n *= 2; |
---|
| 0 | + | } |
---|
| 0 | + | - memcpy(RSTRING_PTR(str2) + n, RSTRING_PTR(str2), len-n); |
---|
| 0 | + | + memcpy(ptr2 + n, ptr2, len-n); |
---|
| 0 | + | } |
---|
| 0 | + | - RSTRING_PTR(str2)[RSTRING_LEN(str2)] = '\0'; |
---|
| 0 | + | + ptr2[RSTRING_LEN(str2)] = '\0'; |
---|
| 0 | + | OBJ_INFECT(str2, str); |
---|
| 0 | + | rb_enc_cr_str_copy_for_substr(str2, str); |
---|
| 0 | + | |
---|
| 0 | + | @@ -5701,6 +5703,7 @@ |
---|
| 0 | + | } |
---|
| 0 | + | else if (split_type == string) { |
---|
| 0 | + | char *ptr = RSTRING_PTR(str); |
---|
| 0 | + | + char *temp = ptr; |
---|
| 0 | + | char *eptr = RSTRING_END(str); |
---|
| 0 | + | char *sptr = RSTRING_PTR(spat); |
---|
| 0 | + | long slen = RSTRING_LEN(spat); |
---|
| 0 | + | @@ -5720,13 +5723,15 @@ |
---|
| 0 | + | ptr = t; |
---|
| 0 | + | continue; |
---|
| 0 | + | } |
---|
| 0 | + | - rb_ary_push(result, rb_str_subseq(str, ptr - RSTRING_PTR(str), end)); |
---|
| 0 | + | + rb_ary_push(result, rb_str_subseq(str, ptr - temp, end)); |
---|
| 0 | + | ptr += end + slen; |
---|
| 0 | + | if (!NIL_P(limit) && lim <= ++i) break; |
---|
| 0 | + | } |
---|
| 0 | + | - beg = ptr - RSTRING_PTR(str); |
---|
| 0 | + | + beg = ptr - temp; |
---|
| 0 | + | } |
---|
| 0 | + | else { |
---|
| 0 | + | + char *ptr = RSTRING_PTR(str); |
---|
| 0 | + | + long len = RSTRING_LEN(str); |
---|
| 0 | + | long start = beg; |
---|
| 0 | + | long idx; |
---|
| 0 | + | int last_null = 0; |
---|
| 0 | + | @@ -5735,22 +5740,22 @@ |
---|
| 0 | + | while ((end = rb_reg_search(spat, str, start, 0)) >= 0) { |
---|
| 0 | + | regs = RMATCH_REGS(rb_backref_get()); |
---|
| 0 | + | if (start == end && BEG(0) == END(0)) { |
---|
| 0 | + | - if (!RSTRING_PTR(str)) { |
---|
| 0 | + | + if (!ptr) { |
---|
| 0 | + | rb_ary_push(result, rb_str_new("", 0)); |
---|
| 0 | + | break; |
---|
| 0 | + | } |
---|
| 0 | + | else if (last_null == 1) { |
---|
| 0 | + | rb_ary_push(result, rb_str_subseq(str, beg, |
---|
| 0 | + | - rb_enc_fast_mbclen(RSTRING_PTR(str)+beg, |
---|
| 0 | + | - RSTRING_END(str), |
---|
| 0 | + | + rb_enc_fast_mbclen(ptr+beg, |
---|
| 0 | + | + ptr+len, |
---|
| 0 | + | enc))); |
---|
| 0 | + | beg = start; |
---|
| 0 | + | } |
---|
| 0 | + | else { |
---|
| 0 | + | - if (RSTRING_PTR(str)+start == RSTRING_END(str)) |
---|
| 0 | + | + if (ptr+start == ptr+len) |
---|
| 0 | + | start++; |
---|
| 0 | + | else |
---|
| 0 | + | - start += rb_enc_fast_mbclen(RSTRING_PTR(str)+start,RSTRING_END(str),enc); |
---|
| 0 | + | + start += rb_enc_fast_mbclen(ptr+start,ptr+len,enc); |
---|
| 0 | + | last_null = 1; |
---|
| 0 | + | continue; |
---|
| 0 | + | } |
---|
| 0 | + | --- struct.c (revision 25052) |
---|
| 0 | + | +++ struct.c (working copy) |
---|
| 0 | + | @@ -98,14 +98,17 @@ |
---|
| 0 | + | VALUE |
---|
| 0 | + | rb_struct_getmember(VALUE obj, ID id) |
---|
| 0 | + | { |
---|
| 0 | + | - VALUE members, slot; |
---|
| 0 | + | - long i; |
---|
| 0 | + | + VALUE members, slot, *ptr, *ptr_members; |
---|
| 0 | + | + long i, len; |
---|
| 0 | + | |
---|
| 0 | + | + ptr = RSTRUCT_PTR(obj); |
---|
| 0 | + | members = rb_struct_members(obj); |
---|
| 0 | + | + ptr_members = RARRAY_PTR(members); |
---|
| 0 | + | slot = ID2SYM(id); |
---|
| 0 | + | - for (i=0; i<RARRAY_LEN(members); i++) { |
---|
| 0 | + | - if (RARRAY_PTR(members)[i] == slot) { |
---|
| 0 | + | - return RSTRUCT_PTR(obj)[i]; |
---|
| 0 | + | + len = RARRAY_LEN(members); |
---|
| 0 | + | + for (i=0; i<len; i++) { |
---|
| 0 | + | + if (ptr_members[i] == slot) { |
---|
| 0 | + | + return ptr[i]; |
---|
| 0 | + | } |
---|
| 0 | + | } |
---|
| 0 | + | rb_name_error(id, "%s is not struct member", rb_id2name(id)); |
---|
| 0 | + | @@ -156,15 +159,18 @@ |
---|
| 0 | + | static VALUE |
---|
| 0 | + | rb_struct_set(VALUE obj, VALUE val) |
---|
| 0 | + | { |
---|
| 0 | + | - VALUE members, slot; |
---|
| 0 | + | - long i; |
---|
| 0 | + | + VALUE members, slot, *ptr, *ptr_members; |
---|
| 0 | + | + long i, len; |
---|
| 0 | + | |
---|
| 0 | + | members = rb_struct_members(obj); |
---|
| 0 | + | + ptr_members = RARRAY_PTR(members); |
---|
| 0 | + | + len = RARRAY_LEN(members); |
---|
| 0 | + | rb_struct_modify(obj); |
---|
| 0 | + | - for (i=0; i<RARRAY_LEN(members); i++) { |
---|
| 0 | + | - slot = RARRAY_PTR(members)[i]; |
---|
| 0 | + | + ptr = RSTRUCT_PTR(obj); |
---|
| 0 | + | + for (i=0; i<len; i++) { |
---|
| 0 | + | + slot = ptr_members[i]; |
---|
| 0 | + | if (rb_id_attrset(SYM2ID(slot)) == rb_frame_this_func()) { |
---|
| 0 | + | - return RSTRUCT_PTR(obj)[i] = val; |
---|
| 0 | + | + return ptr[i] = val; |
---|
| 0 | + | } |
---|
| 0 | + | } |
---|
| 0 | + | rb_name_error(rb_frame_this_func(), "`%s' is not a struct member", |
---|
| 0 | + | @@ -175,9 +181,9 @@ |
---|
| 0 | + | static VALUE |
---|
| 0 | + | make_struct(VALUE name, VALUE members, VALUE klass) |
---|
| 0 | + | { |
---|
| 0 | + | - VALUE nstr; |
---|
| 0 | + | + VALUE nstr, *ptr_members; |
---|
| 0 | + | ID id; |
---|
| 0 | + | - long i; |
---|
| 0 | + | + long i, len; |
---|
| 0 | + | |
---|
| 0 | + | OBJ_FREEZE(members); |
---|
| 0 | + | if (NIL_P(name)) { |
---|
| 0 | + | @@ -204,8 +210,10 @@ |
---|
| 0 | + | rb_define_singleton_method(nstr, "new", rb_class_new_instance, -1); |
---|
| 0 | + | rb_define_singleton_method(nstr, "[]", rb_class_new_instance, -1); |
---|
| 0 | + | rb_define_singleton_method(nstr, "members", rb_struct_s_members_m, 0); |
---|
| 0 | + | - for (i=0; i< RARRAY_LEN(members); i++) { |
---|
| 0 | + | - ID id = SYM2ID(RARRAY_PTR(members)[i]); |
---|
| 0 | + | + ptr_members = RARRAY_PTR(members); |
---|
| 0 | + | + len = RARRAY_LEN(members); |
---|
| 0 | + | + for (i=0; i< len; i++) { |
---|
| 0 | + | + ID id = SYM2ID(ptr_members[i]); |
---|
| 0 | + | if (rb_is_local_id(id) || rb_is_const_id(id)) { |
---|
| 0 | + | if (i < N_REF_FUNC) { |
---|
| 0 | + | rb_define_method_id(nstr, id, ref_func[i], 0); |
---|
| 0 | + | @@ -498,7 +506,8 @@ |
---|
| 0 | + | { |
---|
| 0 | + | VALUE cname = rb_class_name(rb_obj_class(s)); |
---|
| 0 | + | VALUE members, str = rb_str_new2("#<struct "); |
---|
| 0 | + | - long i; |
---|
| 0 | + | + VALUE *ptr, *ptr_members; |
---|
| 0 | + | + long i, len; |
---|
| 0 | + | char first = RSTRING_PTR(cname)[0]; |
---|
| 0 | + | |
---|
| 0 | + | if (recur || first != '#') { |
---|
| 0 | + | @@ -509,7 +518,10 @@ |
---|
| 0 | + | } |
---|
| 0 | + | |
---|
| 0 | + | members = rb_struct_members(s); |
---|
| 0 | + | - for (i=0; i<RSTRUCT_LEN(s); i++) { |
---|
| 0 | + | + ptr_members = RARRAY_PTR(members); |
---|
| 0 | + | + ptr = RSTRUCT_PTR(s); |
---|
| 0 | + | + len = RSTRUCT_LEN(s); |
---|
| 0 | + | + for (i=0; i<len; i++) { |
---|
| 0 | + | VALUE slot; |
---|
| 0 | + | ID id; |
---|
| 0 | + | |
---|
| 0 | + | @@ -519,7 +531,7 @@ |
---|
| 0 | + | else if (first != '#') { |
---|
| 0 | + | rb_str_cat2(str, " "); |
---|
| 0 | + | } |
---|
| 0 | + | - slot = RARRAY_PTR(members)[i]; |
---|
| 0 | + | + slot = ptr_members[i]; |
---|
| 0 | + | id = SYM2ID(slot); |
---|
| 0 | + | if (rb_is_local_id(id) || rb_is_const_id(id)) { |
---|
| 0 | + | rb_str_append(str, rb_id2str(id)); |
---|
| 0 | + | @@ -528,7 +540,7 @@ |
---|
| 0 | + | rb_str_append(str, rb_inspect(slot)); |
---|
| 0 | + | } |
---|
| 0 | + | rb_str_cat2(str, "="); |
---|
| 0 | + | - rb_str_append(str, rb_inspect(RSTRUCT_PTR(s)[i])); |
---|
| 0 | + | + rb_str_append(str, rb_inspect(ptr[i])); |
---|
| 0 | + | } |
---|
| 0 | + | rb_str_cat2(str, ">"); |
---|
| 0 | + | OBJ_INFECT(str, s); |
---|
| 0 | + | @@ -588,14 +600,16 @@ |
---|
| 0 | + | static VALUE |
---|
| 0 | + | rb_struct_aref_id(VALUE s, ID id) |
---|
| 0 | + | { |
---|
| 0 | + | - VALUE members; |
---|
| 0 | + | + VALUE *ptr, members, *ptr_members; |
---|
| 0 | + | long i, len; |
---|
| 0 | + | |
---|
| 0 | + | + ptr = RSTRUCT_PTR(s); |
---|
| 0 | + | members = rb_struct_members(s); |
---|
| 0 | + | + ptr_members = RARRAY_PTR(members); |
---|
| 0 | + | len = RARRAY_LEN(members); |
---|
| 0 | + | for (i=0; i<len; i++) { |
---|
| 0 | + | - if (SYM2ID(RARRAY_PTR(members)[i]) == id) { |
---|
| 0 | + | - return RSTRUCT_PTR(s)[i]; |
---|
| 0 | + | + if (SYM2ID(ptr_members[i]) == id) { |
---|
| 0 | + | + return ptr[i]; |
---|
| 0 | + | } |
---|
| 0 | + | } |
---|
| 0 | + | rb_name_error(id, "no member '%s' in struct", rb_id2name(id)); |
---|
| 0 | + | @@ -644,19 +658,21 @@ |
---|
| 0 | + | static VALUE |
---|
| 0 | + | rb_struct_aset_id(VALUE s, ID id, VALUE val) |
---|
| 0 | + | { |
---|
| 0 | + | - VALUE members; |
---|
| 0 | + | + VALUE members, *ptr, *ptr_members; |
---|
| 0 | + | long i, len; |
---|
| 0 | + | |
---|
| 0 | + | members = rb_struct_members(s); |
---|
| 0 | + | - rb_struct_modify(s); |
---|
| 0 | + | len = RARRAY_LEN(members); |
---|
| 0 | + | - if (RSTRUCT_LEN(s) != RARRAY_LEN(members)) { |
---|
| 0 | + | + rb_struct_modify(s); |
---|
| 0 | + | + if (RSTRUCT_LEN(s) != len) { |
---|
| 0 | + | rb_raise(rb_eTypeError, "struct size differs (%ld required %ld given)", |
---|
| 0 | + | - RARRAY_LEN(members), RSTRUCT_LEN(s)); |
---|
| 0 | + | + len, RSTRUCT_LEN(s)); |
---|
| 0 | + | } |
---|
| 0 | + | + ptr = RSTRUCT_PTR(s); |
---|
| 0 | + | + ptr_members = RARRAY_PTR(members); |
---|
| 0 | + | for (i=0; i<len; i++) { |
---|
| 0 | + | - if (SYM2ID(RARRAY_PTR(members)[i]) == id) { |
---|
| 0 | + | - RSTRUCT_PTR(s)[i] = val; |
---|
| 0 | + | + if (SYM2ID(ptr_members[i]) == id) { |
---|
| 0 | + | + ptr[i] = val; |
---|
| 0 | + | return val; |
---|
| 0 | + | } |
---|
| 0 | + | } |
---|
| 0 | + | @@ -771,11 +787,15 @@ |
---|
| 0 | + | static VALUE |
---|
| 0 | + | recursive_equal(VALUE s, VALUE s2, int recur) |
---|
| 0 | + | { |
---|
| 0 | + | - long i; |
---|
| 0 | + | + VALUE *ptr, *ptr2; |
---|
| 0 | + | + long i, len; |
---|
| 0 | + | |
---|
| 0 | + | if (recur) return Qtrue; /* Subtle! */ |
---|
| 0 | + | - for (i=0; i<RSTRUCT_LEN(s); i++) { |
---|
| 0 | + | - if (!rb_equal(RSTRUCT_PTR(s)[i], RSTRUCT_PTR(s2)[i])) return Qfalse; |
---|
| 0 | + | + ptr = RSTRUCT_PTR(s); |
---|
| 0 | + | + ptr2 = RSTRUCT_PTR(s2); |
---|
| 0 | + | + len = RSTRUCT_LEN(s); |
---|
| 0 | + | + for (i=0; i<len; i++) { |
---|
| 0 | + | + if (!rb_equal(ptr[i], ptr2[i])) return Qfalse; |
---|
| 0 | + | } |
---|
| 0 | + | return Qtrue; |
---|
| 0 | + | } |
---|
| 0 | + | @@ -813,14 +833,16 @@ |
---|
| 0 | + | static VALUE |
---|
| 0 | + | recursive_hash(VALUE s, VALUE dummy, int recur) |
---|
| 0 | + | { |
---|
| 0 | + | - long i; |
---|
| 0 | + | + long i, len; |
---|
| 0 | + | st_index_t h; |
---|
| 0 | + | - VALUE n; |
---|
| 0 | + | + VALUE n, *ptr; |
---|
| 0 | + | |
---|
| 0 | + | h = rb_hash_start(rb_hash(rb_obj_class(s))); |
---|
| 0 | + | if (!recur) { |
---|
| 0 | + | - for (i = 0; i < RSTRUCT_LEN(s); i++) { |
---|
| 0 | + | - n = rb_hash(RSTRUCT_PTR(s)[i]); |
---|
| 0 | + | + ptr = RSTRUCT_PTR(s); |
---|
| 0 | + | + len = RSTRUCT_LEN(s); |
---|
| 0 | + | + for (i = 0; i < len; i++) { |
---|
| 0 | + | + n = rb_hash(ptr[i]); |
---|
| 0 | + | h = rb_hash_uint(h, NUM2LONG(n)); |
---|
| 0 | + | } |
---|
| 0 | + | } |
---|
| 0 | + | @@ -844,11 +866,15 @@ |
---|
| 0 | + | static VALUE |
---|
| 0 | + | recursive_eql(VALUE s, VALUE s2, int recur) |
---|
| 0 | + | { |
---|
| 0 | + | - long i; |
---|
| 0 | + | + VALUE *ptr, *ptr2; |
---|
| 0 | + | + long i, len; |
---|
| 0 | + | |
---|
| 0 | + | if (recur) return Qtrue; /* Subtle! */ |
---|
| 0 | + | - for (i=0; i<RSTRUCT_LEN(s); i++) { |
---|
| 0 | + | - if (!rb_eql(RSTRUCT_PTR(s)[i], RSTRUCT_PTR(s2)[i])) return Qfalse; |
---|
| 0 | + | + ptr = RSTRUCT_PTR(s); |
---|
| 0 | + | + ptr2 = RSTRUCT_PTR(s2); |
---|
| 0 | + | + len = RSTRUCT_LEN(s); |
---|
| 0 | + | + for (i=0; i<len; i++) { |
---|
| 0 | + | + if (!rb_eql(ptr[i], ptr2[i])) return Qfalse; |
---|
| 0 | + | } |
---|
| 0 | + | return Qtrue; |
---|
| 0 | + | } |
---|
... | |
---|