[#33948] Schedule for the 1.8.7 release — "Akinori MUSHA" <knu@...>
Hi, developers,
[#33955] --encoding affects script encoding — sheepman <sheepman@...>
こんばんは sheepman です。
なかだです。
[#33962] Ruby1.9.0でのインタプリタ組み込みについての質問 — Masayuki Yamaguchi <Yamaguchi.Masayuki@...>
山口と申します。
[#33966] Re: [ruby-cvs:22881] Ruby:r15644 (trunk): * test/ruby/test_m17n_comb.rb (TestM17NComb::test_str_chomp): test — Tanaka Akira <akr@...>
In article <200802291457.m1TEv6nh008515@ci.ruby-lang.org>,
まつもと ゆきひろです
[#33974] Test::Unit::Collector::Dirがtest_*.rb以外集めてくれない — "Ken Date" <itacchi@...>
こんにちは、伊達です。
[#33983] Re: [ruby-cvs:22913] Re: Ruby:r15674 (trunk): * gc.c (add_heap): sort heaps array in ascending order to use — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
In article <E1JWAV5-0001MG-9W@x61.netlab.jp>,
[#34011] Should --verbose be equal to -v ? — Yugui <yugui@...>
Yuguiです。
まつもと ゆきひろです
西山和広です。
Yuguiです。
[#34020] MurmurHash problem — Nobuyoshi Nakada <nobu@...>
なかだです。
[#34030] uint32_t — KIMURA Koichi <kimura.koichi@...>
木村です。
[#34037] Ruby performance gains on SPARC — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
[#34067] Array#take,take_while,drop,drop_whlie — "Yusuke ENDOH" <mame@...>
遠藤と申します。
[#34068] lgamma_r requires _REENTRANT on Solaris — "Yusuke ENDOH" <mame@...>
遠藤と申します。
[#34077] 異なるエンコーディングだと同じバイト列でも==にならない件 — rubikitch@...
るびきちです。
[#34086] extend spawn to change attributes of child process. — Tanaka Akira <akr@...>
spaen, system, exec, IO.popen で、起動する子プロセスの属性を
[#34093] 拡張ライブラリ初期化中でのmodule_eval — Kouhei Sutou <kou@...>
須藤です。
[#34095] (再送) Cygwin で Resolv.getaddress が失敗する — Kouhei Yanagita <yanagi@...>
こんにちは。柳田です。
こんばんは、植田と申します。
柳田です。
[#34105] rational.rb, complex.rb and mathn.rb — Tadayoshi Funaba <tadf@...>
rational と complex が組み込みになったことで、lib/mathn.rb の意義は薄
現時点で rational.rb と complex.rb を残しているのは、それが無難だから
で、かなり選択肢を絞った叩き台です。
けいじゅ@いしつかです.
原です。
> 私も Complex の組み込みは Rational とは比較にならないくらい、仕様が決め
まつもと ゆきひろです
> Mathモジュールは伝統的にlibmのラッパーであったので、それを逸
原です。
> (1) (-8)**Rational(1,2) は複素数1.0+1.7320508*i
[#34109] LP64: date.rb:321:in `convert': integer 86400000000000 too big to convert to `int' (RangeError) — Tanaka Akira <akr@...>
LP64 なマシンで test-all が動かなくなっています。
[#34144] [質問2点] C からの定数参照 & thread switching コストの低減 — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
[#34158] Complex組み込み — Masahiro TANAKA <masa16.tanaka@...>
Complexが組み込みになるそうですが、これはcomplex.rbを踏襲して、
原です。
> 今までの Complex は、complex.rb にほぼ残して、たとえば Rational 成分
原です。
> そうです。Complex が難しい、という話を書いておくと、
まつもと ゆきひろです
> |僕としては、/ 演算子の振舞いについて前向きに検討してほしいです。
まつもと ゆきひろです
> ふむ。では、/ のふるまいを
まつもと ゆきひろです
> |僕は、quo がいいと思います。
まつもと ゆきひろです
> となるようですが、別の実装として、
田中です。
> 最初に言っておきますが、気を悪くされたのならすみません。
村田です.
[#34159] ruby-trunk Marshal.dump bug — nagachika <rucila@...>
nagachika と申します。
[#34163] Array#shift/unshift の高速化 — wanabe <s.wanabe@...>
ワナベと申します。
[#34189] Re: [ruby-cvs:23106] Re: Ruby:r15866 (trunk): * numeric.c (num_quo): should convert its operand to Rational. — Tadayoshi Funaba <tadf@...>
間違って送ったので、再送。
> > > Log:
[ruby-dev:34173] Re: Array#shift/unshift の高速化
ワナベです。
08/03/28 に Nobuyoshi Nakada<nobu@ruby-lang.org> さんは書きました:
> RArrayにはもう空きがないので、全オブジェクトのサイズが1word増え
> てしまう、というのは悩ましいですね。
元のパッチと同じく、前方に空きメモリがあるかどうかのフラグを新設して
空きがあるときだけRARRAY_PTR(ary)[-1]にサイズを書き込むようにしてみました。
Index: array.c
===================================================================
--- array.c (revision 15844)
+++ array.c (working copy)
@@ -20,6 +20,7 @@
static ID id_cmp;
#define ARY_DEFAULT_SIZE 16
+#define ARY_DEFAULT_LCAPA 4
void
rb_mem_clear(register VALUE *mem, register long size)
@@ -45,11 +46,65 @@
#define ARY_CAPA(ary) RARRAY(ary)->aux.capa
#define RESIZE_CAPA(ary,capacity) do {\
- REALLOC_N(RARRAY(ary)->ptr, VALUE, (capacity));\
+ long lcapacity = ARY_LCAPA(ary);\
+ RARRAY(ary)->ptr -= lcapacity;\
+ REALLOC_N(RARRAY(ary)->ptr, VALUE, (capacity) + lcapacity);\
+ RARRAY(ary)->ptr += lcapacity;\
RARRAY(ary)->aux.capa = (capacity);\
} while (0)
+#define ARY_LCAPA(ary)\
+ (FL_TEST(ary, RARRAY_LFREE) ? (long)RARRAY_PTR(ary)[-1] : 0)
+#define RARRAY_TOP_PTR(ary) (RARRAY_PTR(ary) - ARY_LCAPA(ary))
+
static inline void
+rb_ary_copy_lcapa(VALUE dst, VALUE src)
+{
+ if (FL_TEST(src, RARRAY_LFREE)) {
+ FL_SET(dst, RARRAY_LFREE);
+ RARRAY_PTR(dst)[-1] = RARRAY_PTR(src)[-1];
+ } else {
+ FL_UNSET(dst, RARRAY_LFREE);
+ }
+}
+
+static inline void
+rb_ary_set_lcapa_val(VALUE ary, long lcapacity)
+{
+ if (lcapacity != 0) {
+ FL_SET(ary, RARRAY_LFREE);
+ RARRAY_PTR(ary)[-1] = lcapacity;
+ } else {
+ FL_UNSET(ary, RARRAY_LFREE);
+ }
+}
+
+static inline void
+rb_ary_slide_capa_vals(VALUE ary, long offset)
+{
+ if (offset < 0) {
+ rb_raise(rb_eNotImpError, "[BUG] array negative shift"); /* todo? */
+ } else {
+ RARRAY_PTR(ary)[offset - 1] = offset + ARY_LCAPA(ary);
+ FL_SET(ary, RARRAY_LFREE);
+ }
+ RARRAY(ary)->aux.capa -= offset;
+}
+
+static inline void
+rb_ary_resize_lcapa(VALUE ary, long lcapacity)
+{
+ long offset = lcapacity - ARY_LCAPA(ary);
+ if (lcapacity < 0 || offset > RARRAY(ary)->aux.capa - RARRAY_LEN(ary)) {
+ rb_raise(rb_eIndexError, "[BUG] invalid left-capacity");
+ }
+ RARRAY_PTR(ary) += offset;
+ MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary) - offset, VALUE, RARRAY_LEN(ary));
+ RARRAY(ary)->aux.capa -= offset;
+ rb_ary_set_lcapa_val(ary,lcapacity);
+}
+
+static inline void
rb_ary_modify_check(VALUE ary)
{
if (OBJ_FROZEN(ary)) rb_error_frozen("array");
@@ -67,6 +122,7 @@
ptr = ALLOC_N(VALUE, RARRAY_LEN(ary));
FL_UNSET(ary, ELTS_SHARED);
RARRAY(ary)->aux.capa = RARRAY_LEN(ary);
+ FL_UNSET(ary, RARRAY_LFREE);
MEMCPY(ptr, RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary));
RARRAY(ary)->ptr = ptr;
}
@@ -102,6 +158,7 @@
ary->len = 0;
ary->ptr = 0;
ary->aux.capa = 0;
+ FL_UNSET(ary, RARRAY_LFREE);
return (VALUE)ary;
}
@@ -121,6 +178,7 @@
if (len == 0) len++;
RARRAY(ary)->ptr = ALLOC_N(VALUE, len);
RARRAY(ary)->aux.capa = len;
+ FL_UNSET(RARRAY(ary), RARRAY_LFREE);
return ary;
}
@@ -135,7 +193,14 @@
VALUE
rb_ary_new(void)
{
- return rb_ary_new2(ARY_DEFAULT_SIZE);
+ VALUE ary = rb_ary_new2(ARY_DEFAULT_SIZE + ARY_DEFAULT_LCAPA);
+#if ARY_DEFAULT_LCAPA != 0
+ FL_SET(ary, RARRAY_LFREE);
+ RARRAY(ary)->ptr += ARY_DEFAULT_LCAPA;
+ RARRAY_PTR(ary)[-1] = ARY_DEFAULT_LCAPA;
+#endif
+ RARRAY(ary)->aux.capa = ARY_DEFAULT_SIZE;
+ return ary;
}
#include <stdarg.h>
@@ -177,7 +242,7 @@
rb_ary_free(VALUE ary)
{
if (!ARY_SHARED_P(ary)) {
- xfree(RARRAY(ary)->ptr);
+ xfree(RARRAY_TOP_PTR(ary));
}
}
@@ -194,6 +259,9 @@
shared->len = RARRAY(ary)->len;
shared->ptr = RARRAY(ary)->ptr;
shared->aux.capa = RARRAY(ary)->aux.capa;
+ if(FL_TEST(shared, RARRAY_LFREE)) {
+ FL_SET(ary, RARRAY_LFREE);
+ }
RARRAY(ary)->aux.shared = (VALUE)shared;
FL_SET(ary, ELTS_SHARED);
OBJ_FREEZE(shared);
@@ -292,7 +360,7 @@
rb_ary_modify(ary);
if (argc == 0) {
if (RARRAY_PTR(ary) && !ARY_SHARED_P(ary)) {
- free(RARRAY(ary)->ptr);
+ free(RARRAY_TOP_PTR(ary));
}
RARRAY(ary)->len = 0;
if (rb_block_given_p()) {
@@ -355,6 +423,7 @@
}
RARRAY(ary)->ptr = ALLOC_N(VALUE, argc);
RARRAY(ary)->aux.capa = argc;
+ FL_UNSET(RARRAY(ary), RARRAY_LFREE);
MEMCPY(RARRAY_PTR(ary), argv, VALUE, argc);
RARRAY(ary)->len = argc;
@@ -533,13 +602,10 @@
if (RARRAY_LEN(ary) == 0) return Qnil;
top = RARRAY_PTR(ary)[0];
if (!ARY_SHARED_P(ary)) {
- if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
- MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+1, VALUE, RARRAY_LEN(ary)-1);
- RARRAY(ary)->len--;
- return top;
+ if (RARRAY_LEN(ary) * 2 < ARY_LCAPA(ary)) {
+ rb_ary_resize_lcapa(ary, RARRAY_LEN(ary));
}
- RARRAY_PTR(ary)[0] = Qnil;
- ary_make_shared(ary);
+ rb_ary_slide_capa_vals(ary, 1);
}
RARRAY(ary)->ptr++; /* shift ptr */
RARRAY(ary)->len--;
@@ -577,14 +643,11 @@
rb_ary_modify_check(ary);
result = ary_shared_first(argc, argv, ary, Qfalse);
n = RARRAY_LEN(result);
- if (ARY_SHARED_P(ary)) {
- RARRAY(ary)->ptr += n;
- RARRAY(ary)->len -= n;
- }
- else {
- MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+n, VALUE, RARRAY_LEN(ary)-n);
- RARRAY(ary)->len -= n;
+ if (!ARY_SHARED_P(ary)) {
+ rb_ary_slide_capa_vals(ary, n);
}
+ RARRAY(ary)->ptr += n;
+ RARRAY(ary)->len -= n;
return result;
}
@@ -605,16 +668,25 @@
rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
{
long len;
+ long lcapa;
if (argc == 0) return ary;
rb_ary_modify(ary);
- if (RARRAY(ary)->aux.capa <= (len = RARRAY(ary)->len) + argc) {
- RESIZE_CAPA(ary, len + argc + ARY_DEFAULT_SIZE);
+ lcapa = ARY_LCAPA(ary);
+ if (lcapa < argc) {
+ long add_capa = ARY_DEFAULT_SIZE;
+ long add_lcapa = argc + ARY_DEFAULT_LCAPA;
+ if (RARRAY(ary)->aux.capa <= (len = RARRAY(ary)->len) + add_lcapa) {
+ RESIZE_CAPA(ary, len + add_capa + add_lcapa);
+ }
+ lcapa += add_lcapa;
+ rb_ary_resize_lcapa(ary, lcapa);
}
- /* sliding items */
- MEMMOVE(RARRAY(ary)->ptr + argc, RARRAY(ary)->ptr, VALUE, len);
+ RARRAY(ary)->ptr -= argc;
+ RARRAY(ary)->aux.capa += argc;
MEMCPY(RARRAY(ary)->ptr, argv, VALUE, argc);
+ rb_ary_set_lcapa_val(ary, lcapa - argc);
RARRAY(ary)->len += argc;
return ary;
@@ -1494,6 +1566,7 @@
RARRAY(ary)->ptr = RARRAY(tmp)->ptr;
RARRAY(ary)->len = RARRAY(tmp)->len;
RARRAY(ary)->aux.capa = RARRAY(tmp)->aux.capa;
+ rb_ary_copy_lcapa(ary, tmp);
FL_UNSET(ary, ELTS_SHARED);
rb_gc_force_recycle(tmp);
}
@@ -2019,7 +2092,7 @@
if (copy == orig) return copy;
shared = ary_make_shared(orig);
if (!ARY_SHARED_P(copy)) {
- ptr = RARRAY(copy)->ptr;
+ ptr = RARRAY_TOP_PTR(copy);
xfree(ptr);
}
RARRAY(copy)->ptr = RARRAY(orig)->ptr;
Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h (revision 15844)
+++ include/ruby/ruby.h (working copy)
@@ -499,6 +499,8 @@
} aux;
VALUE *ptr;
};
+
+#define RARRAY_LFREE FL_USER3
#define RARRAY_LEN(a) RARRAY(a)->len
#define RARRAY_PTR(a) RARRAY(a)->ptr
--
ワナベ