[#34261] ComplexFloat — "Kenta Murata" <muraken@...>

村田です.

117 messages 2008/04/06
[#34280] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/10

村田です.

[#34286] Re: ComplexFloat — Nobuyoshi Nakada <nobu@...> 2008/04/10

なかだです。

[#34288] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/10

むらたです.

[#34290] Re: ComplexFloat — "U.Nakamura" <usa@...> 2008/04/10

こんにちは、なかむら(う)です。

[#34293] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/10

むらたです.

[#34296] Re: ComplexFloat — "U.Nakamura" <usa@...> 2008/04/10

こんにちは、なかむら(う)です。

[#34298] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/10

むらたです.

[#34300] Re: ComplexFloat — Tanaka Akira <akr@...> 2008/04/10

In article <761216ce0804100221x67f10f12iab12b0e35b6f50e4@mail.gmail.com>,

[#34301] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/10

むらたです.

[#34303] Re: ComplexFloat — Yukihiro Matsumoto <matz@...> 2008/04/10

まつもと ゆきひろです

[#34314] Re: ComplexFloat — Tadayoshi Funaba <tadf@...> 2008/04/10

利点としては、拡張ライブラリが書きやすい、ということ。正当化の理由とし

[#34316] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/10

むらたです.

[#34317] Re: ComplexFloat — Tadayoshi Funaba <tadf@...> 2008/04/10

> 私にはいびつな進化という感じはしません.むしろ,せっかく C で実装できるのに

[#34318] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/10

むらたです.

[#34322] Re: ComplexFloat — Yukihiro Matsumoto <matz@...> 2008/04/10

まつもと ゆきひろです

[#34328] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/11

むらたです.

[#34331] Re: ComplexFloat — Yukihiro Matsumoto <matz@...> 2008/04/11

まつもと ゆきひろです

[#34340] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/11

むらたです.

[#34341] Re: ComplexFloat — Yukihiro Matsumoto <matz@...> 2008/04/11

まつもと ゆきひろです

[#34362] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/12

むらたです.

[#34363] Re: ComplexFloat — Tanaka Akira <akr@...> 2008/04/12

In article <761216ce0804120723n16bfbad7qdae90f142978d256@mail.gmail.com>,

[#34367] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/12

むらたです.

[#34368] Re: ComplexFloat — Tanaka Akira <akr@...> 2008/04/12

In article <761216ce0804121011h6132d58fh4916ecbb29d58690@mail.gmail.com>,

[#34369] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/12

むらたです.

[#34364] Re: ComplexFloat — Yukihiro Matsumoto <matz@...> 2008/04/12

まつもと ゆきひろです

[#34366] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/12

むらたです.

[#34386] Re: ComplexFloat — Yukihiro Matsumoto <matz@...> 2008/04/13

まつもと ゆきひろです

[#34415] Re: ComplexFloat — "Kenta Murata" <muraken@...> 2008/04/15

むらたです.

[#34439] Re: ComplexFloat — Shin-ichiro HARA <sinara@...> 2008/04/17

原です。

[#34442] Re: ComplexFloat — Yukihiro Matsumoto <matz@...> 2008/04/17

まつもと ゆきひろです

[#34451] Re: ComplexFloat — Shin-ichiro HARA <sinara@...> 2008/04/18

原です。

[#34455] Re: ComplexFloat — Tadayoshi Funaba <tadf@...> 2008/04/18

> 1. ComplexFloat を組込みにし、Complex を標準ライブラリとして提供する。

[#34457] Re: ComplexFloat — Shin-ichiro HARA <sinara@...> 2008/04/20

原です。

[#34458] Re: ComplexFloat — Tadayoshi Funaba <tadf@...> 2008/04/20

> 分かりににくかったですが、これは、ComplexFloat を含めた組込みの数体系が

[#34502] Re: ComplexFloat — sheepman <sh@...> 2008/04/24

こんばんは sheepman です。

[#34601] Re: ComplexFloat — Yukihiro Matsumoto <matz@...> 2008/05/07

まつもと ゆきひろです

[#34603] Re: ComplexFloat — keiju@... (石塚圭樹) 2008/05/07

けいじゅ@いしつかです.

[#34614] Re: ComplexFloat — Yukihiro Matsumoto <matz@...> 2008/05/08

まつもと ゆきひろです

[#34621] Re: ComplexFloat — keiju@... (石塚圭樹) 2008/05/08

けいじゅ@いしつかです.

[ruby-dev:34431] patch for ruby-core:14813

From: wanabe <s.wanabe@...>
Date: 2008-04-16 11:55:53 UTC
List: ruby-dev #34431
ワナベと申します。

[ruby-core:14813] に対するパッチを書きました。
ブロック引数が与えられたブロック、および define_method のブロック中での
given_block? と yield の挙動が変わります。
ブロックフレームの bp を押し上げ、できた隙間に強引にブロック引数を持たせています。

Index: vm_core.h
===================================================================
--- vm_core.h	(revision 15984)
+++ vm_core.h	(working copy)
@@ -608,6 +608,7 @@
 VALUE vm_yield(rb_thread_t *th, int argc, VALUE *argv);
 VALUE vm_call0(rb_thread_t *th, VALUE klass, VALUE recv, VALUE id, ID oid,
 	       int argc, const VALUE *argv, NODE *body, int nosuper);
+rb_block_t *vm_get_block(rb_control_frame_t *cfp);

 int vm_get_sourceline(rb_control_frame_t *);

Index: eval.c
===================================================================
--- eval.c	(revision 15984)
+++ eval.c	(working copy)
@@ -837,11 +837,10 @@
     JUMP_TAG(tag);
 }

-int
-rb_block_given_p(void)
+static inline VALUE
+block_given_p(rb_control_frame_t *cfp)
 {
-    rb_thread_t *th = GET_THREAD();
-    if (GC_GUARDED_PTR_REF(th->cfp->lfp[0])) {
+    if (vm_get_block(cfp)) {
 	return Qtrue;
     }
     else {
@@ -850,6 +849,12 @@
 }

 int
+rb_block_given_p(void)
+{
+    return block_given_p(GET_THREAD()->cfp);
+}
+
+int
 rb_iterator_p()
 {
     return rb_block_given_p();
@@ -882,13 +887,9 @@
 {
     rb_thread_t *th = GET_THREAD();
     rb_control_frame_t *cfp = th->cfp;
+
     cfp = vm_get_ruby_level_cfp(th, RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp));
-    if (GC_GUARDED_PTR_REF(cfp->lfp[0])) {
-	return Qtrue;
-    }
-    else {
-	return Qfalse;
-    }
+    return block_given_p(cfp);
 }

 VALUE rb_eThreadError;
Index: vm.c
===================================================================
--- vm.c	(revision 15984)
+++ vm.c	(working copy)
@@ -539,6 +539,30 @@
     return vm_call_super(GET_THREAD(), argc, argv);
 }

+rb_block_t *
+vm_get_block(rb_control_frame_t *cfp) {
+    rb_block_t *block = 0;
+
+    if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq)) {
+	if (cfp->iseq->type == ISEQ_TYPE_BLOCK) {
+	    block = ((rb_block_t *)(GC_GUARDED_PTR_REF(cfp->dfp[1])));
+	    if (cfp->iseq->defined_method_id) {
+		return block;
+	    }
+	}
+	else if (RUBY_VM_NORMAL_ISEQ_P(cfp->iseq->local_iseq)) {
+	    if (cfp->iseq->local_iseq->type != ISEQ_TYPE_METHOD) {
+		return 0;
+	    }
+	}
+    }
+    if (!block) {
+	block = ((rb_block_t *)(GC_GUARDED_PTR_REF(cfp->lfp[0])));
+    }
+
+    return block;
+}
+
 /* C -> Ruby: block */

 static VALUE
@@ -568,6 +592,7 @@
 		      self, GC_GUARDED_PTR(block->dfp),
 		      iseq->iseq_encoded + opt_pc, cfp->sp + arg_size, block->lfp,
 		      iseq->local_size - arg_size);
+	vm_add_specval(th, GC_GUARDED_PTR(blockptr));

 	val = vm_eval_body(th);
     }
@@ -1316,6 +1341,7 @@
 	    vm_push_frame(th, catch_iseq, FRAME_MAGIC_BLOCK,
 			  cfp->self, (VALUE)cfp->dfp, catch_iseq->iseq_encoded,
 			  cfp->sp + 1, cfp->lfp, catch_iseq->local_size - 1);
+	    vm_add_specval(th, 0);

 	    state = 0;
 	    th->errinfo = Qnil;
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 15984)
+++ vm_insnhelper.c	(working copy)
@@ -68,6 +68,14 @@
 }

 static inline void
+vm_add_specval(rb_thread_t *th, VALUE specval)
+{
+    *th->cfp->bp = specval;
+    th->cfp->sp++;
+    th->cfp->bp++;
+}
+
+static inline void
 vm_pop_frame(rb_thread_t *th)
 {
 #if COLLECT_PROFILE
@@ -792,11 +800,12 @@
 vm_invoke_block(rb_thread_t *th, rb_control_frame_t *reg_cfp,
rb_num_t num, rb_num_t flag)
 {
     VALUE val;
-    rb_block_t *block = GET_BLOCK_PTR();
+    rb_block_t *block = 0;
     rb_iseq_t *iseq;
     int argc = num;

-    if (GET_ISEQ()->local_iseq->type != ISEQ_TYPE_METHOD || block == 0) {
+    block = vm_get_block(reg_cfp);
+    if (block == 0) {
 	vm_localjump_error("no block given (yield)", Qnil, 0);
     }
     iseq = block->iseq;
@@ -817,6 +826,7 @@
 		      FRAME_MAGIC_BLOCK, block->self, (VALUE) block->dfp,
 		      iseq->iseq_encoded + opt_pc, rsp + arg_size, block->lfp,
 		      iseq->local_size - arg_size);
+	vm_add_specval(th, 0);

 	return Qundef;
     }


-- 
ワナベ

In This Thread

Prev Next