[#41531] [Bug #3385] ext/dbm: accept various version of db — Takahiro Kambe <redmine@...>
Bug #3385: ext/dbm: accept various version of db
2010年6月3日23:38 Takahiro Kambe <redmine@ruby-lang.org>:
2011年11月12日8:14 Tanaka Akira <akr@fsij.org>:
[#41536] RUBY_DEBUG=gc_stress [FATAL] failed to allocate memory — Tanaka Akira <akr@...>
コンパイル時に RUBY_DEBUG_ENV というマクロを定義しておくと、
[#41543] [Bug #3398] 1.9.2 SEGV during test-all — Yuki Sonoda <redmine@...>
Bug #3398: 1.9.2 SEGV during test-all
[#41597] [Bug #3433] Error that occurs by BasicSocket#sendmsg — Masaya Tarui <redmine@...>
Bug #3433: Error that occurs by BasicSocket#sendmsg
[#41600] 質問・提案:cgi.rbの後継となるライブラリについて — Dice <tetradice@...>
Diceです。cgi.rbの後継ライブラリについて質問させてください。
藤岡です。
かくたにです。
藤岡さん、かくたにさん、返信ありがとうございます。
藤岡です。
Diceです。藤岡さん、返信ありがとうございます。
[#41610] [Bug #3443] requireが遅くなる — Yusuke Endoh <redmine@...>
Bug #3443: requireが遅くなる
[#41623] [Feature:trunk] argument delegation — Nobuyoshi Nakada <nobu@...>
なかだです。
遠藤です。
まつもと ゆきひろです
前田です。
[#41672] [Bug #3463] 1.9.2-preview3 で [BUG] gc_sweep(): unknown data type 0x0 — Tomoyuki Chikanaga <redmine@...>
チケット #3463 が更新されました。 (by Tomoyuki Chikanaga)
[#41674] [Bug #3464] win32ole failure load TYPELIB on mswin64 vista — sakiyama shin <redmine@...>
Bug #3464: win32ole failure load TYPELIB on mswin64 vista
[#41702] WIN32OLE_METHOD offset_vtbl — kuwamoto shintaro <beuniv@...>
こんばんわ
助田です。
こんにちは、なかむら(う)です。
助田です。
artonです。
2010/6/24 arton <artonx@yahoo.co.jp>:
[#41705] [Bug #3471][Rejected] ./miniruby sample/test.rbで1NotOK — Shyouhei Urabe <redmine@...>
チケット #3471 が更新されました。 (by Shyouhei Urabe)
2010年6月24日16:53 Shyouhei Urabe <redmine@ruby-lang.org>:
[#41711] [Bug #3473] make clear-installed-list — Usaku NAKAMURA <redmine@...>
Bug #3473: make clear-installed-list
[#41730] (ruby/tk) ruby_1_9_2 への backport — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
[#41752] [Bug #3490][Assigned] test_pack_utf8 failure on mswin64 — Yusuke Endoh <redmine@...>
チケット #3490 が更新されました。 (by Yusuke Endoh)
[#41760] Hash[] の引数が Array の場合の振る舞い — とみたまさひろ <tommy@...>
とみたです。
[ruby-dev:41620] [Feature:trunk] unused variable warning
なかだです。
http://d.hatena.ne.jp/kwatch/20100616/1276650107 にある、未使用
変数に対する警告を実装してみました。
diff --git i/parse.y w/parse.y
index ebe9fef..8dbbacf 100644
--- i/parse.y
+++ w/parse.y
@@ -99,6 +99,7 @@ struct vtable {
struct local_vars {
struct vtable *args;
struct vtable *vars;
+ struct vtable *used;
struct local_vars *prev;
};
@@ -167,7 +168,7 @@ vtable_included(const struct vtable * tbl, ID id)
if (POINTER_P(tbl)) {
for (i = 0; i < tbl->pos; i++) {
if (tbl->tbl[i] == id) {
- return 1;
+ return i+1;
}
}
}
@@ -8916,6 +8917,27 @@ new_args_gen(struct parser_params *parser, NODE *m, NODE *o, ID r, NODE *p, ID b
ruby_sourceline = saved_line;
return node;
}
+
+#define LVAR_USED (1UL << (sizeof(ID) * CHAR_BIT - 1))
+
+static void
+warn_unused_var(struct parser_params *parser, struct local_vars *local)
+{
+ int i, cnt;
+ ID *v, *u;
+
+ if (!local->used) return;
+ v = local->vars->tbl;
+ u = local->used->tbl;
+ cnt = local->used->pos;
+ if (cnt != local->vars->pos) {
+ rb_bug("local->used->pos != local->vars->pos");
+ }
+ for (i = 0; i < cnt; ++i) {
+ if (!v[i] || (u[i] & LVAR_USED)) continue;
+ rb_compile_warn(ruby_sourcefile, (int)u[i], "assigned but unused variable %s", rb_id2name(v[i]));
+ }
+}
#endif /* !RIPPER */
static void
@@ -8927,6 +8949,7 @@ local_push_gen(struct parser_params *parser, int inherit_dvars)
local->prev = lvtbl;
local->args = vtable_alloc(0);
local->vars = vtable_alloc(inherit_dvars ? DVARS_INHERIT : DVARS_TOPSCOPE);
+ local->used = RTEST(ruby_verbose) ? vtable_alloc(0) : 0;
lvtbl = local;
}
@@ -8934,6 +8957,10 @@ static void
local_pop_gen(struct parser_params *parser)
{
struct local_vars *local = lvtbl->prev;
+ if (lvtbl->used) {
+ warn_unused_var(parser, lvtbl);
+ vtable_free(lvtbl->used);
+ }
vtable_free(lvtbl->args);
vtable_free(lvtbl->vars);
xfree(lvtbl);
@@ -8982,28 +9009,37 @@ static int
local_var_gen(struct parser_params *parser, ID id)
{
vtable_add(lvtbl->vars, id);
+ if (lvtbl->used) {
+ vtable_add(lvtbl->used, (ID)ruby_sourceline);
+ }
return vtable_size(lvtbl->vars) - 1;
}
static int
local_id_gen(struct parser_params *parser, ID id)
{
- struct vtable *vars, *args;
+ struct vtable *vars, *args, *used;
vars = lvtbl->vars;
args = lvtbl->args;
+ used = lvtbl->used;
while (vars && POINTER_P(vars->prev)) {
vars = vars->prev;
args = args->prev;
+ if (used) used = used->prev;
}
if (vars && vars->prev == DVARS_INHERIT) {
return rb_local_defined(id);
}
+ else if (vtable_included(args, id)) {
+ return 1;
+ }
else {
- return (vtable_included(args, id) ||
- vtable_included(vars, id));
+ int i = vtable_included(vars, id);
+ if (i && used) used->tbl[i-1] |= LVAR_USED;
+ return i != 0;
}
}
@@ -9012,6 +9048,9 @@ dyna_push_gen(struct parser_params *parser)
{
lvtbl->args = vtable_alloc(lvtbl->args);
lvtbl->vars = vtable_alloc(lvtbl->vars);
+ if (lvtbl->used) {
+ lvtbl->used = vtable_alloc(lvtbl->used);
+ }
return lvtbl->args;
}
@@ -9020,6 +9059,11 @@ dyna_pop_1(struct parser_params *parser)
{
struct vtable *tmp;
+ if ((tmp = lvtbl->used) != 0) {
+ warn_unused_var(parser, lvtbl);
+ lvtbl->used = lvtbl->used->prev;
+ vtable_free(tmp);
+ }
tmp = lvtbl->args;
lvtbl->args = lvtbl->args->prev;
vtable_free(tmp);
@@ -9051,20 +9095,24 @@ dyna_in_block_gen(struct parser_params *parser)
static int
dvar_defined_gen(struct parser_params *parser, ID id)
{
- struct vtable *vars, *args;
+ struct vtable *vars, *args, *used;
+ int i;
args = lvtbl->args;
vars = lvtbl->vars;
+ used = lvtbl->used;
while (POINTER_P(vars)) {
if (vtable_included(args, id)) {
return 1;
}
- if (vtable_included(vars, id)) {
+ if ((i = vtable_included(vars, id)) != 0) {
+ if (used) used->tbl[i-1] |= LVAR_USED;
return 1;
}
args = args->prev;
vars = vars->prev;
+ if (used) used = used->prev;
}
if (vars == DVARS_INHERIT) {
diff --git i/test/ruby/test_rubyoptions.rb w/test/ruby/test_rubyoptions.rb
index 683677c..0d70357 100644
--- i/test/ruby/test_rubyoptions.rb
+++ w/test/ruby/test_rubyoptions.rb
@@ -415,4 +415,9 @@ class TestRubyOptions < Test::Unit::TestCase
ensure
t.close(true) if t
end
+
+ def test_unused_variable
+ assert_in_out_err(["-we", "a=1"], "", [], ["-e:1: warning: assigned but unused variable a"])
+ assert_in_out_err(["-we", "1.times do\n a=1\nend"], "", [], ["-e:2: warning: assigned but unused variable a"])
+ end
end
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦