[#31320] Import RubyGems to Ruby 1.9 — "NAKAMURA, Hiroshi" <nakahiro@...>
-----BEGIN PGP SIGNED MESSAGE-----
なかだです。
-----BEGIN PGP SIGNED MESSAGE-----
-----BEGIN PGP SIGNED MESSAGE-----
-----BEGIN PGP SIGNED MESSAGE-----
-----BEGIN PGP SIGNED MESSAGE-----
まつもと ゆきひろです
-----BEGIN PGP SIGNED MESSAGE-----
-----BEGIN PGP SIGNED MESSAGE-----
まつもと ゆきひろです
-----BEGIN PGP SIGNED MESSAGE-----
まつもと ゆきひろです
-----BEGIN PGP SIGNED MESSAGE-----
まつもと ゆきひろです
-----BEGIN PGP SIGNED MESSAGE-----
まつもと ゆきひろです
-----BEGIN PGP SIGNED MESSAGE-----
まつもと ゆきひろです
In article <E1Ika5D-0007fc-GG@x31>,
-----BEGIN PGP SIGNED MESSAGE-----
まつもと ゆきひろです
-----BEGIN PGP SIGNED MESSAGE-----
In message <471447D5.5050902@sarion.co.jp>
咳といいます。
Rubygems は、基本的に他のパッケージシステムから包みやすい作り
In message <868x62huhe.knu@iDaemons.org>
At Wed, 17 Oct 2007 22:04:23 +0900,
Tuesday 16 October 2007 14:09:13 に NAKAMURA, Hiroshi さんは書きました:
-----BEGIN PGP SIGNED MESSAGE-----
押田です。
Sunday 21 October 2007 00:17:43 に NAKAMURA, Hiroshi さんは書きました:
> ちなみに「ruby/1.9.1の標準添付からどのライブラリを外すか?」という議論も
-----BEGIN PGP SIGNED MESSAGE-----
-----BEGIN PGP SIGNED MESSAGE-----
ささだです。
-----BEGIN PGP SIGNED MESSAGE-----
まつもと ゆきひろです
-----BEGIN PGP SIGNED MESSAGE-----
> U parsearg, tadf
まつもと ゆきひろです
-----BEGIN PGP SIGNED MESSAGE-----
[#31323] Bignum#to_s の Karatsuba 基数変換による高速化 — "Kenta Murata" <muraken@...>
むらけんです.
まつもと ゆきひろです
むらけんです.
まつもと ゆきひろです
遠藤です。
むらたです.
遠藤です。
むらたです.
[#31333] Invalid error message by illegal regexp — KIMURA Koichi <kimura.koichi@...>
木村です。
[#31351] set_trace_func NULL pointer given — eklerni <eklerni@...>
From:eklerni
[#31357] invalid string for Date.parse — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
> となります。どうも、junではじまっているので6月とみなしている
なかだです。
[#31371] simultaneous exceptions dump core — "Yusuke ENDOH" <mame@...>
遠藤と申します。
ささだです。
遠藤です。
[#31376] Re: [ ruby-Bugs-9490 ] Date module, step method, infinite loop if +step+ is 0 should raise an exception? — Urabe Shyouhei <shyouhei@...>
rubyforgeで表題の件が卜部にassignされてるのですが、どうしましょう。
Date のほうで、合せたらいいというのなら、それでいいと思います。
[#31377] Re: [ ruby-Patches-11719 ] add a :passive option to open-uri's open method — Urabe Shyouhei <shyouhei@...>
rubyforgeで表題の件が卜部にassignされてるのですが、どうしましょう。
In article <46BE0E9B.70309@ruby-lang.org>,
[#31397] File exists - /tmp/bootstraptest.tmpwd — Tanaka Akira <akr@...>
ひとつのマシンで、あるユーザが btest した後、他のユーザが
ささだです。
In article <46C18A65.7030209@atdot.net>,
[#31407] [BUG] Stack consistency error (sp: 11, bp: 12) — Tanaka Akira <akr@...>
以下のようにすると Stack consistency error になります。
[#31448] Ruby's (new) Bizarre Operator(s) — Nobuyoshi Nakada <nobu@...>
なかだです。
まつもと ゆきひろです
バンサンです。
[#31462] Dir.mktmpdir for 1.8 — Tanaka Akira <akr@...>
Dir.mktmpdir を 1.8 に入れたいんですが、どうでしょう?
まつもと ゆきひろです
In article <E1IMCUq-00083X-Uo@x31>,
[#31470] nested fiber invocation — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
[#31473] setter of $! — SASADA Koichi <ko1@...>
ささだです。
[#31475] lambda {|(v0,v1),v2|}.call([1],2) — Tanaka Akira <akr@...>
以下の例は ArgumentError になりません。
ささだです。
[#31502] {|(a,a)|} — Tanaka Akira <akr@...>
以下がエラーになりません。
[#31522] a, a = 1, 2 — Tanaka Akira <akr@...>
ふと気がついたんですが、a, a = 1, 2 とすると、1.8 と 1.9 で
こんにちは、なかむら(う)です。
[#31525] いくつかのバグ報告と提案(5点) — eklerni <eklerni@...>
From:eklerni
なかだです。
まつもと ゆきひろです
[#31539] strtod の精度 — Satoshi Nakagawa <snakagawa@...>
中川といいます。
まつもと ゆきひろです
中川です。
中川です。
まつもと ゆきひろです
中川です。
中川です。
まつもと ゆきひろです
In article <EEC70971-AED4-4830-801B-A507561AEDCD@infoteria.co.jp>,
[#31576] test/win32ole — SASADA Koichi <ko1@...>
ささだです.
[#31583] Fiber reviesed — SASADA Koichi <ko1@...>
ささだです.
遠藤です。
ささだです.
遠藤です。
ささだです.
[#31625] IO.sysdup2, IO.sysdup, IO.sysclose — Tanaka Akira <akr@...>
redirect の処理をちょっと書いてみたところ、
まつもと ゆきひろです
In article <E1IOaVr-0001Yu-4H@x31>,
In article <87d4xc97ml.fsf@fsij.org>,
[#31646] Re: [ruby-cvs:20498] Ruby:r13261 (trunk): * encoding.c: provide basic features for M17N. — Tanaka Akira <akr@...>
In article <200708250329.l7P3TjNP004245@ci.ruby-lang.org>,
まつもと ゆきひろです
[#31651] rb_enc_mbclen — Tanaka Akira <akr@...>
rb_enc_mbclen のインターフェースは GB18030 などで困るんじゃ
[ruby-dev:31615] Re: catch without a tag argument
なかだです。
At Thu, 23 Aug 2007 00:34:12 +0900,
Tanaka Akira wrote in [ruby-dev:31609]:
> matzruby にある、引数なしで catch が呼べる機能は 1.9 には入
> らないのでしょうか。
いろいろと変わってるようでそのままでは動きませんでした。
Index: eval_jump.ci
===================================================================
--- eval_jump.ci (revision 13128)
+++ eval_jump.ci (working copy)
@@ -6,5 +6,6 @@
#include "eval_intern.h"
-NORETURN(static VALUE rb_f_throw _((int, VALUE *)));
+NORETURN(static VALUE rb_f_throw(int, VALUE *));
+int rb_vm_catch_p(VALUE dst, VALUE tag);
/*
@@ -24,25 +25,8 @@ rb_f_throw(int argc, VALUE *argv)
{
VALUE tag, value;
- rb_thread_t *th = GET_THREAD();
- struct rb_vm_tag *tt = th->tag;
rb_scan_args(argc, argv, "11", &tag, &value);
- tag = ID2SYM(rb_to_id(tag));
-
- while (tt) {
- if (tt->tag == tag) {
- tt->retval = value;
- break;
- }
- tt = tt->prev;
- }
- if (!tt) {
- rb_name_error(SYM2ID(tag), "uncaught throw `%s'",
- rb_id2name(SYM2ID(tag)));
- }
- rb_trap_restore_mask();
- th->errinfo = tag;
- JUMP_TAG(TAG_THROW);
+ rb_throw_obj(tag, value);
#ifndef __GNUC__
return Qnil; /* not reached */
@@ -53,14 +37,11 @@ void
rb_throw(const char *tag, VALUE val)
{
- VALUE argv[2];
-
- argv[0] = ID2SYM(rb_intern(tag));
- argv[1] = val;
- rb_f_throw(2, argv);
+ rb_throw_obj(ID2SYM(rb_intern(tag)), val);
}
/*
* call-seq:
- * catch(symbol) {| | block } > obj
+ * catch(symbol) { block } => obj
+ * catch() {|tag| block } => obj
*
* +catch+ executes its block. If a +throw+ is
@@ -92,41 +73,22 @@ rb_throw(const char *tag, VALUE val)
static VALUE
-rb_f_catch(VALUE dmy, VALUE tag)
+rb_f_catch(int argc, VALUE *argv)
{
- int state;
- VALUE val = Qnil; /* OK */
- rb_thread_t *th = GET_THREAD();
-
- tag = ID2SYM(rb_to_id(tag));
- PUSH_TAG();
+ VALUE tag;
- th->tag->tag = tag;
-
- if ((state = EXEC_TAG()) == 0) {
- val = rb_yield_0(1, &tag);
- }
- else if (state == TAG_THROW && th->errinfo == tag) {
- val = th->tag->retval;
- th->errinfo = Qnil;
- state = 0;
+ rb_scan_args(argc, argv, "01", &tag);
+ if (argc == 0) {
+ tag = Qundef;
}
- POP_TAG();
- if (state)
- JUMP_TAG(state);
-
- return val;
-}
-
-static VALUE
-catch_i(VALUE tag)
-{
- return rb_funcall(Qnil, rb_intern("catch"), 1, tag);
+ return rb_catch_obj(tag, rb_yield, Qnil);
}
VALUE
-rb_catch(const char *tag, VALUE (*func)(), VALUE data)
+rb_catch(const char *tag, VALUE (*func)(ANYARGS), VALUE data)
{
- return rb_iterate((VALUE (*)_((VALUE)))catch_i, ID2SYM(rb_intern(tag)),
- func, data);
+ if (!tag) {
+ return rb_catch_obj(Qundef, func, data);
+ }
+ return rb_catch_obj(ID2SYM(rb_intern(tag)), func, data);
}
@@ -277,5 +239,5 @@ void
Init_jump(void)
{
- rb_define_global_function("catch", rb_f_catch, 1);
+ rb_define_global_function("catch", rb_f_catch, -1);
rb_define_global_function("throw", rb_f_throw, -1);
rb_define_global_function("at_exit", rb_f_at_exit, 0);
Index: vm.c
===================================================================
--- vm.c (revision 13128)
+++ vm.c (working copy)
@@ -982,4 +995,76 @@ rb_iter_break()
}
+static inline int
+catching_p(VALUE dst, VALUE tag)
+{
+ if (dst == tag) return Qtrue;
+ if (SPECIAL_CONST_P(dst)) return Qfalse;
+ if (BUILTIN_TYPE(dst) != T_NODE) return Qfalse;
+ if (GET_THROWOBJ_STATE(dst) != TAG_THROW) return Qfalse;
+ if (GET_THROWOBJ_VAL(dst) != tag) return Qfalse;
+ return Qtrue;
+}
+
+void
+rb_throw_obj(VALUE tag, VALUE value)
+{
+ rb_thread_t *th = GET_THREAD();
+ struct rb_vm_tag *tt = th->tag;
+
+ while (tt) {
+ if (catching_p(tt->tag, tag)) {
+ tag = tt->tag;
+ tt->retval = value;
+ break;
+ }
+ tt = tt->prev;
+ }
+ if (!tt) {
+ VALUE argv[2];
+ argv[0] = rb_sprintf("uncaught throw `%s'", RSTRING_PTR(rb_obj_as_string(tag)));
+ argv[1] = tag;
+ rb_exc_raise(rb_class_new_instance(2, argv, rb_eNameError));
+ }
+ rb_trap_restore_mask();
+ th->errinfo = tag;
+ TH_JUMP_TAG(th, TAG_THROW);
+#ifndef __GNUC__
+ return Qnil; /* not reached */
+#endif
+}
+
+VALUE
+rb_catch_obj(VALUE tag, VALUE (*func)(ANYARGS), VALUE data)
+{
+ int state;
+ VALUE val = Qnil; /* OK */
+ VALUE dest = tag;
+ rb_thread_t *th = GET_THREAD();
+
+ if (tag == Qundef) {
+ tag = rb_obj_alloc(rb_cObject);
+ dest = (VALUE)NEW_THROW_OBJECT(tag, GC_GUARDED_PTR_REF(*th->cfp->dfp),
+ TAG_THROW);
+ }
+
+ TH_PUSH_TAG(th);
+
+ th->tag->tag = dest;
+
+ if ((state = EXEC_TAG()) == 0) {
+ val = (*func)(tag, data);
+ }
+ else if (state == TAG_THROW && th->errinfo == dest) {
+ val = th->tag->retval;
+ th->errinfo = Qnil;
+ state = 0;
+ }
+ TH_POP_TAG();
+ if (state)
+ JUMP_TAG(state);
+
+ return val;
+}
+
/* optimization: redefine management */
Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h (revision 13128)
+++ include/ruby/ruby.h (working copy)
@@ -723,5 +723,7 @@ VALUE rb_rescue2(VALUE(*)(ANYARGS),VALUE
VALUE rb_ensure(VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE);
VALUE rb_catch(const char*,VALUE(*)(ANYARGS),VALUE);
+VALUE rb_catch_obj(VALUE,VALUE(*)(ANYARGS),VALUE);
NORETURN(void rb_throw(const char*,VALUE));
+NORETURN(void rb_throw_obj(VALUE,VALUE));
VALUE rb_require(const char*);
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦