まつもと ゆきひろです
In message "[ruby-dev:19984] Re: ""*n"
on 03/04/10, Tadayoshi Funaba <tadf / rc5.so-net.ne.jp> writes:
|> if (len < 0) {
|> rb_raise(rb_eArgError, "negative argument");
|> }
|> if (LONG_MAX/len < RSTRING(str)->len) {
|> rb_raise(rb_eArgError, "argument too big");
|> }
|>
|> のコストはほとんどゼロだと思うんですが。
|
|いや、それは違います。無駄に感じるのは、その後にループがあるからです。
それを含めても
1 str2 = rb_str_new5(str,0, RSTRING(str)->len*len);
2 for (i=0; i<len; i++) {
3 memcpy(RSTRING(str2)->ptr+(i*RSTRING(str)->len),
4 RSTRING(str)->ptr, RSTRING(str)->len);
5 }
6 RSTRING(str2)->ptr[RSTRING(str2)->len] = '\0';
7
8 OBJ_INFECT(str2, str);
9
10 return str2;
1でstrのdereference
2でi<lenの比較1回(loopの中身は実行しない)
6でdereferenceが2回、代入が1回
8でフラグのコピー
ですから、差は無視できるのではないかと思います。むしろ、負の
数を通しちゃったりするほうがまずいように思えるのですが。
taintの伝搬は長さ0なんだから気にしなくてもよいと思いますが。
まつもと ゆきひろ /:|)