Feature #490

relayouting struct RNode

Added by yugui (Yuki Sonoda) over 3 years ago. Updated 4 months ago.

[ruby-dev:35947]
Status:Closed Start date:
Priority:Low Due date:
Assignee:matz (Yukihiro Matsumoto) % Done:

0%

Category:core
Target version:2.0.0

Description

Yuguiです。

「第7回RHGの逆襲」(http://qwik.jp/rhg-strikes-back/78.html )の結果とし
て、RNode::nd_fileは誰も利用していないことが分かりました。

よって、RNodeのレイアウトにおいてポインタ長だけ空間が余っています。添付
のパッチでは、とりあえずこの空間をvoid *reservedとして、YARVに残っている
無駄なNULL pointer代入を削除してみました。

さて、この空間を何らかの形で有益に活用したいと思います。関係者に聞いてみ
たところでは次のような案が出てきました。

1) 行番号に使う
  行番号のMAXが15bit増えます。現状では32bit環境でも2**17あるので現実的に
特に困ることはないと思いますが、もう少し増えても悪くはないかもしれません。

2) RNodeを4分木にする
  ASTの分岐の数を増やします。笹田さんによれば、これで楽になるケースが少
しはあるとのことです。


どのようにしたら良いか、ご意見をいただければと思います。

-- 
Yugui <yugui@yugui.jp>
http://yugui.jp
私は私をDumpする

diff --git a/include/ruby/node.h b/include/ruby/node.h
index d83f550..6621ac1 100644
--- a/include/ruby/node.h
+++ b/include/ruby/node.h
@@ -242,7 +242,7 @@ enum node_type {

 typedef struct RNode {
     unsigned long flags;
-    char *nd_file;
+    void *reserved;
     union {
 	struct RNode *node;
 	ID id;
diff --git a/iseq.c b/iseq.c
index b964176..9de648b 100644
--- a/iseq.c
+++ b/iseq.c
@@ -118,12 +118,10 @@ set_relation(rb_iseq_t *iseq, const VALUE parent)
     if (type == ISEQ_TYPE_TOP) {
 	/* toplevel is private */
 	iseq->cref_stack = NEW_BLOCK(th->top_wrapper ? th->top_wrapper : rb_cObject);
-	iseq->cref_stack->nd_file = 0;
 	iseq->cref_stack->nd_visi = NOEX_PRIVATE;
     }
     else if (type == ISEQ_TYPE_METHOD || type == ISEQ_TYPE_CLASS) {
 	iseq->cref_stack = NEW_BLOCK(0); /* place holder */
-	iseq->cref_stack->nd_file = 0;
     }
     else if (RTEST(parent)) {
 	rb_iseq_t *piseq;
diff --git a/vm.c b/vm.c
index 730d89c..b1b67d8 100644
--- a/vm.c
+++ b/vm.c
@@ -748,7 +748,6 @@ vm_cref_push(rb_thread_t *th, VALUE klass, int noex)
 {
     rb_control_frame_t *cfp = vm_get_ruby_level_caller_cfp(th, th->cfp);
     NODE *cref = NEW_BLOCK(klass);
-    cref->nd_file = 0;
     cref->nd_visi = noex;

     if (cfp) {

History

Updated by matz (Yukihiro Matsumoto) over 3 years ago

まつもと ゆきひろです

In message "Re: [ruby-dev:35947] [Feature: trunk] relayouting struct RNode"
    on Mon, 25 Aug 2008 15:03:10 +0900, "Yugui (Yuki Sonoda)" <yugui@yugui.jp> writes:

|「第7回RHGの逆襲」(http://qwik.jp/rhg-strikes-back/78.html )の結果とし
|て、RNode::nd_fileは誰も利用していないことが分かりました。

1.9では使っていないんですねえ。

|よって、RNodeのレイアウトにおいてポインタ長だけ空間が余っています。添付
|のパッチでは、とりあえずこの空間をvoid *reservedとして、YARVに残っている
|無駄なNULL pointer代入を削除してみました。

使ってないなら削ってもよいのではないでしょうか。

|さて、この空間を何らかの形で有益に活用したいと思います。関係者に聞いてみ
|たところでは次のような案が出てきました。
|
|1) 行番号に使う
|  行番号のMAXが15bit増えます。現状では32bit環境でも2**17あるので現実的に
|特に困ることはないと思いますが、もう少し増えても悪くはないかもしれません。
|
|2) RNodeを4分木にする
|  ASTの分岐の数を増やします。笹田さんによれば、これで楽になるケースが少
|しはあるとのことです。
|
|どのようにしたら良いか、ご意見をいただければと思います。

4分木にするのはちょっとだけ魅力的ですねえ。

Updated by ko1 (Koichi Sasada) over 3 years ago

 ささだです.

nagachika wrote:
> ですので nd_line を拡張するのは意味解析/コンパイルエラーのメッセージには有効ですが、
> 実行時のバックトレースの情報はこの構造体の定義も拡張しないといけません。

 この話は把握しています.

> コンパイル後の構造はよく調べていませんけど、使用メモリ量が増えそうですし、
> 行番号に使うのはもったいないかなぁと思います。

 結局,RValue のデータサイズは変わらないので,使用メモリ量は変わり
ません.

-- 
// SASADA Koichi at atdot dot net

Updated by ko1 (Koichi Sasada) over 3 years ago

  • Assignee set to matz (Yukihiro Matsumoto)

Updated by yugui (Yuki Sonoda) over 3 years ago

  • Category set to core
  • Target version set to 2.0.0

Updated by shyouhei (Shyouhei Urabe) over 1 year ago

  • Status changed from Open to Assigned

Updated by kosaki (Motohiro KOSAKI) 4 months ago

  • Status changed from Assigned to Closed
ええと nd_file を reservedに変える変更はすでに入ってるので、これ閉じていいですよね? 魅力的な新機能を思いついた人がチケットを切り直してください

Also available in: Atom PDF