Cut off an array at C level

$B$U$H!"(Bsort_by $B$G%F%s%]%i%j%*%V%8%’%/%H$r8:$i$9J}K!$r;W$$$D$$$F!"(B
$B$d$C$F$_$?$i(B (r30439) $B9bB.2=$7$F$h$+$C$?$N$G$9$,!"(B
$B$=$NCf$GG[Ns$N:G8e$N$[$&$r@Z$jMn$H$94X?t$,8+Ev$?$i$J$/$F!"(B
$BG[Ns$NCf?H(B (RARRAY_EMBED_FLAG) $B$K%"%/%;%9$9$kI,MW$,$"$j$^$7$?!#(B

$BD9$5$rJQ$($k$N$OG[Ns$KBP$9$k4pK\E*$JA`:n$J5$$,$9$k$s$G$9$,!"(B
$B$J$s$G$J$$$s$G$7$?$C$1(B? $B8+Mn$H$7$F$k(B?

$B$`$i$?$G$9!#(B

2010$BG/(B12$B7n(B31$BF|(B18:55 Tanaka A. [email protected]:

$BD9$5$rJQ$($k$N$OG[Ns$KBP$9$k4pK\E*$JA`:n$J5$$,$9$k$s$G$9$,!"(B
$B$J$s$G$J$$$s$G$7$?$C$1(B? $B8+Mn$H$7$F$k(B?

ary_resize_capa $B$O0c$$$^$9$+!)(B


Kenta M.
OpenPGP FP = 1D69 ADDE 081C 9CC2 2E54 98C1 CEFE 8AFB 6081 B062

$BK$r=q$-$^$7$?(B!!
$B!X(BRuby $B5U0z$-%l%7%T!Y(B

E-mail: [email protected]
twitter: http://twitter.com/mrkn/
blog: ドレッシングのような

2010$BG/(B12$B7n(B31$BF|(B21:36 Kenta M. [email protected]:

$BD9$5$rJQ$($k$N$OG[Ns$KBP$9$k4pK\E*$JA`:n$J5$$,$9$k$s$G$9$,!"(B
$B$J$s$G$J$$$s$G$7$?$C$1(B? $B8+Mn$H$7$F$k(B?

ary_resize_capa $B$O0c$$$^$9$+!)(B

sort_by $B$,Dj5A$5$l$F$$$k(B enum.c $B$G;H$$$?$$$N$G$9!#(B

$B$G$b(B ary_resize_capa $B$O(B array.c $B$G$7$+;H$($J$$$N$G$9!#(B

$B$J$+$@$G$9!#(B

At Fri, 31 Dec 2010 18:55:19 +0900,
Tanaka A. wrote in [ruby-dev:42912]:

$B$U$H!"(Bsort_by $B$G%F%s%]%i%j%*%V%8%’%/%H$r8:$i$9J}K!$r;W$$$D$$$F!"(B
$B$d$C$F$_$?$i(B (r30439) $B9bB.2=$7$F$h$+$C$?$N$G$9$,!"(B
$B$=$NCf$GG[Ns$N:G8e$N$[$&$r@Z$jMn$H$94X?t$,8+Ev$?$i$J$/$F!"(B
$BG[Ns$NCf?H(B (RARRAY_EMBED_FLAG) $B$K%"%/%;%9$9$kI,MW$,$"$j$^$7$?!#(B

$BD9$5$rJQ$($k$N$OG[Ns$KBP$9$k4pK\E*$JA`:n$J5$$,$9$k$s$G$9$,!"(B
$B$J$s$G$J$$$s$G$7$?$C$1(B? $B8+Mn$H$7$F$k(B?

$B$"$C$?$h$&$J5$$,$7$?$s$G$9$,$J$$$G$9$M$’!#(B

Index: include/ruby/intern.h

— include/ruby/intern.h (revision 30444)
+++ include/ruby/intern.h (working copy)
@@ -83,6 +83,7 @@
VALUE rb_ary_cmp(VALUE, VALUE);
VALUE rb_ary_replace(VALUE copy, VALUE orig);
VALUE rb_get_values_at(VALUE, long, int, VALUE*, VALUE()(VALUE,long));
+VALUE rb_ary_resize(VALUE ary, long len);
/
bignum.c */
VALUE rb_big_new(long, int);
int rb_bigzero_p(VALUE x);
Index: array.c

— array.c (revision 30444)
+++ array.c (working copy)
@@ -1308,6 +1308,43 @@
}
}

+VALUE
+rb_ary_resize(VALUE ary, long len)
+{

  • long olen;
  • VALUE *ptr;
  • rb_ary_modify(ary);
  • olen = RARRAY_LEN(ary);
  • if (len == olen) return ary;
  • if (len > ARY_MAX_SIZE) {
  • rb_raise(rb_eIndexError, “index %ld too big”, len);
  • }
  • if (len > olen) {
  • if (len >= ARY_CAPA(ary)) {
  •  ary_double_capa(ary, len);
    
  • }
  • rb_mem_clear(RARRAY_PTR(ary) + olen, len - olen);
  •    ARY_SET_HEAP_LEN(ary, len);
    
  • }
  • else if (ARY_EMBED_P(ary)) {
  •    ARY_SET_EMBED_LEN(ary, len);
    
  • }
  • else if (len <= RARRAY_EMBED_LEN_MAX) {
  • VALUE tmp[RARRAY_EMBED_LEN_MAX];
  • memcpy(tmp, ARY_HEAP_PTR(ary), ARY_HEAP_LEN(ary));
  • ary_discard(ary);
  • memcpy(ARY_EMBED_PTR(ary), tmp, len);
  •    ARY_SET_EMBED_LEN(ary, len);
    
  • }
  • else {
  • if (olen > len + ARY_DEFAULT_SIZE) {
  •  REALLOC_N(RARRAY(ary)->as.heap.ptr, VALUE, len);
    
  • }
  • ARY_SET_HEAP_LEN(ary, len);
  • }
  • return ary;
    +}

/*

  • call-seq:
  • ary[index]         = obj                      ->  obj

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message “Re: [ruby-dev:42917] Re: cut off an array at C level”
on Sat, 1 Jan 2011 11:08:52 +0900, Nobuyoshi N.
[email protected] writes:
|
|$B$J$+$@$G$9!#(B
|
|At Fri, 31 Dec 2010 18:55:19 +0900,
|Tanaka A. wrote in [ruby-dev:42912]:
|> $B$U$H!“(Bsort_by $B$G%F%s%]%i%j%%V%8%'%/%H$r8:$i$9J}K!$r;W$$$D$$$F!“(B
|> $B$d$C$F$_$?$i(B (r30439) $B9bB.2=$7$F$h$+$C$?$N$G$9$,!”(B
|> $B$=$NCf$GG[Ns$N:G8e$N$[$&$r@Z$jMn$H$94X?t$,8+Ev$?$i$J$/$F!“(B
|> $BG[Ns$NCf?H(B (RARRAY_EMBED_FLAG) $B$K%”%/%;%9$9$kI,MW$,$"$j$^$7$?!#(B
|>
|> $BD9$5$rJQ$($k$N$OG[Ns$KBP$9$k4pK\E
$JA`:n$J5$$,$9$k$s$G$9$,!”(B
|> $B$J$s$G$J$$$s$G$7$?$C$1(B? $B8+Mn$H$7$F$k(B?
|
|$B$"$C$?$h$&$J5$$,$7$?$s$G$9$,$J$$$G$9$M$'!#(B

$B$$$$$s$8$c$J$$$G$7$g$&$+!#(B