[#32171] autoload_delete — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
[#32185] Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...>
こんにちは、山本と申します。
> Dateオブジェクトに+で大きな数字を与えるとおかしくなるようです。
山本です。
> アルゴリズムの意味がわからないで書いた、表層的なパッチなので
Hi,
> 1.9ではRationalとComplexを組み込みに、という話はありましたが、
原です。
ささだです.
[#32192] test-all results - ruby 1.9.0 (2007-11-09 patchlevel 0) [i686-linux] — SASADA Koichi <ko1@...>
ささだです.
[#32198] [提案] Array#tail — "Yusuke ENDOH" <mame@...>
遠藤と申します。
まつもと ゆきひろです
西山と申します
遠藤です。
[#32204] yydebug — Nobuyoshi Nakada <nobu@...>
なかだです。
[#32205] Use two pipes for duplex IO.popen — Tanaka Akira <akr@...>
改心して duplex な IO.popen で socketpair を使うのはやめよう
なかだです。
In article <20071111120021.7f0592e5.nobu@ruby-lang.org>,
[#32206] Integer#ord for 1.8 — Tanaka Akira <akr@...>
1.9 と 1.8 の両方で ?a.ord で 97 が得られるように、1.8 に
[#32219] trunkでビルド失敗 — KIMURA Koichi <kimura.koichi@...>
木村です。
[#32247] round missing (mswin32) — KIMURA Koichi <kimura.koichi@...>
木村です。
[#32263] toplevel irb method — SASADA Koichi <ko1@...>
ささだです.
まつもと ゆきひろです
[#32266] version string — SASADA Koichi <ko1@...>
ささだです.
[#32268] RFLOAT_VALUE(val), DOUBLE2NUM(dbl) — SASADA Koichi <ko1@...>
ささだです.
SASADA Koichi wrote:
[#32306] nanosecond Time and stat — Tanaka Akira <akr@...>
最近、nanosecond 単位な timestamp があるようです。
In article <874pflntd5.fsf@fsij.org>,
まつもと ゆきひろです
In article <E1Iu2GD-0004Wh-1I@x31>,
[#32308] core dump with undef/alias using dynamic symbols — Tadashi Saito <shiba@...2.accsnet.ne.jp>
斎藤と申します。
遠藤と申します。
ささだです.
遠藤です。
ささだです.
[#32329] enumerator with single array and multiple arguments. — Tanaka Akira <akr@...>
enumerator を通すとひとつの配列と複数の引数が区別できません。
[#32330] defined?($&) — Tanaka Akira <akr@...>
ふと気がついたんですが、defined?($&) が "expression" になり
まつもと ゆきひろです
まつもと ゆきひろです
ささだです.
[#32333] test/ruby/test_eval.rb — SASADA Koichi <ko1@...>
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
[#32348] DRb test leaves ut_eval.rb process — Tanaka Akira <akr@...>
DRb のテストをすると、(テストがいろいろと失敗する他に) プロ
[#32352] 1.9.1のリリース時期について — KIMURA Koichi <hogemuta@...>
木村です。
まつもと ゆきひろです
木村です。
まつもと ゆきひろです
[#32403] Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Takahiro Kambe <taca@...>
こんばんは。
卜部です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
成瀬です。
卜部です。
遠藤と申します。
遠藤です。
ささだです.
まつもと ゆきひろです
[#32404] SEGV on child process by fork on GC.stress. — Tanaka Akira <akr@...>
GC.stress = true 下で fork すると子プロセスが SEGV します。
まつもと ゆきひろです
In article <E1Iy7HA-0006zn-37@x31>,
まつもと ゆきひろです
ささだです.
[#32409] Re: [ruby-cvs:21293] Ruby:r14056 (trunk): * signal.c (trap_signm): SIGVTALRM no longer used for green — SASADA Koichi <ko1@...>
ささだです.
さとうふみやす @ OSS テクノロジです。
ささだです.
まつもと ゆきひろです
[ruby-dev:32171] autoload_delete
永井@知能.九工大です.
現状の 1.9 では,autoload 登録しているファイルを
明示的に require しようとすると例外が発生します.
# 1.8 でこれをやると,対象ファイルを2回読んでしまうらしいことに
# 初めて気が付きました.(^_^;
この仕様の場合,「利便性のために autoload 登録はしているものの,
直接 require する人もいる」というケースで困ってしまいます.
要は,対象ファイル中の定数定義に対して autoload が起動してしまうのが
問題ですから,対象ファイルの頭で autoload 定義を殺してやれば
利用者の利便性を阻害することなく回避できるはずです.
しかし,現状では明示的に autoload 定義を取り除くメソッドが
存在しないように見受けられます.
そこで Kernel#autoload_delete, Module#autoload_delete を
追加するというのはいかがでしょうか?
これを用いれば,例えば
----<zzz.rb>-----------------------------------------
autoload_delete(:ZZZ)
class ZZZ
$XXX ||= 0
$XXX += 1
p $XXX
# ... defs ...
end
-----------------------------------------------------
に対して,
-----------------------------------------------------
autoload(:ZZZ, 'zzz')
ZZZ.new
-----------------------------------------------------
でも
-----------------------------------------------------
require 'zzz'
ZZZ.new
-----------------------------------------------------
でも
-----------------------------------------------------
autoload(:ZZZ, 'zzz')
require 'zzz'
ZZZ.new
-----------------------------------------------------
でもエラーにならずに動いてくれます.
# ついでに,1.8 のように $XXX が 2 になったりすることもなく.(^_^)
パッチを以下に添付します.
なお,autoload(name, nil) で削除というのも考えましたが,
登録抹消時に以前に登録されていたファイルを返した方が便利と
思われましたので,戻り値の性格の違いから別メソッドとしています.
------------------------------------------------------------------------
Index: eval_load.c
===================================================================
--- eval_load.c (revision 13825)
+++ eval_load.c (working copy)
@@ -512,6 +512,27 @@
}
/*
+ * call-seq:
+ * mod.autoload_delete(name) => filename or nil
+ *
+ * Unregisters the autoload definition about _name_.
+ * Returns the unregisterd _filename_ (when registered by autoload) or
+ * nil (when no registered).
+ *
+ * module A
+ * end
+ * A.autoload(:B, "b")
+ * A.autoload_delete(:B) # returns "b"
+ * A.autoload_delete(:C) # returns nil
+ */
+
+static VALUE
+rb_mod_autoload_delete(VALUE mod, VALUE sym)
+{
+ return rb_autoload_delete(mod, rb_to_id(sym));
+}
+
+/*
* MISSING: documentation
*/
@@ -543,6 +564,31 @@
}
/*
+ * call-seq:
+ * autoload_delete(module) => filename or nil
+ *
+ * Unregisters the autoload definition about _module_.
+ * the first time that _module_ (which may be a <code>String</code> or
+ * a symbol) is accessed.
+ * Returns the unregisterd _filename_ (when registered by autoload) or
+ * nil (when no registered).
+ *
+ * autoload(:MyModule, "/foo/modules/my_module.rb")
+ * autoload_delete(:MyModule) # returns "/foo/modules/my_module.rb"
+ * autoload_delete(:MyNoModule) # returns nil
+ */
+
+static VALUE
+rb_f_autoload_delete(VALUE mod, VALUE sym)
+{
+ VALUE klass = ruby_cbase();
+ if (NIL_P(klass)) {
+ rb_raise(rb_eTypeError, "Can not set autoload on singleton class");
+ }
+ return rb_mod_autoload_delete(klass, sym);
+}
+
+/*
* MISSING: documentation
*/
@@ -572,8 +618,10 @@
rb_define_global_function("load", rb_f_load, -1);
rb_define_global_function("require", rb_f_require, 1);
rb_define_method(rb_cModule, "autoload", rb_mod_autoload, 2);
+ rb_define_method(rb_cModule, "autoload_delete", rb_mod_autoload_delete, 1);
rb_define_method(rb_cModule, "autoload?", rb_mod_autoload_p, 1);
rb_define_global_function("autoload", rb_f_autoload, 2);
+ rb_define_global_function("autoload_delete", rb_f_autoload_delete, 1);
rb_define_global_function("autoload?", rb_f_autoload_p, 1);
ruby_dln_librefs = rb_ary_new();
Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h (revision 13825)
+++ include/ruby/intern.h (working copy)
@@ -570,6 +570,7 @@
VALUE rb_class_name(VALUE);
void rb_autoload(VALUE, ID, const char*);
VALUE rb_autoload_load(VALUE, ID);
+VALUE rb_autoload_delete(VALUE, ID);
VALUE rb_autoload_p(VALUE, ID);
void rb_gc_mark_global_tbl(void);
VALUE rb_f_trace_var(int, VALUE*);
Index: variable.c
===================================================================
--- variable.c (revision 13825)
+++ variable.c (working copy)
@@ -1398,6 +1398,18 @@
}
VALUE
+rb_autoload_delete(VALUE klass, ID id)
+{
+ VALUE file;
+ NODE *load = autoload_delete(klass, id);
+
+ if (!load || !(file = load->nd_lit) || rb_provided(RSTRING_PTR(file))) {
+ return Qnil;
+ }
+ return file;
+}
+
+VALUE
rb_autoload_p(VALUE mod, ID id)
{
struct st_table *tbl = RCLASS_IV_TBL(mod);
------------------------------------------------------------------------
--
永井 秀利 (九工大 知能情報)
nagai@ai.kyutech.ac.jp