[#12387] reducing logical operation — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

17 messages 2001/03/07
[#12388] Re: reducing logical operation — EGUCHI Osamu <eguchi@...> 2001/03/07

えぐち@エスアンドイー です。

[#12389] Re: reducing logical operation — nobu.nakada@... 2001/03/07

なかだです。

[#12391] Re: reducing logical operation — EGUCHI Osamu <eguchi@...> 2001/03/07

えぐち@エスアンドイー です。

[#12404] fork in threads — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

14 messages 2001/03/09

[#12405] at_exit — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

15 messages 2001/03/09
[#12409] Re: at_exit — matz@... (Yukihiro Matsumoto) 2001/03/10

まつもと ゆきひろです

[#12411] Re: at_exit — keiju@... (石塚圭樹) 2001/03/10

けいじゅ@日本ラショナルソフトウェアです.

[#12425] bignum % の結果が負数になることがある — Hisayasu Nakao <h-nakao@...>

最近、ruby-1.6.2を使い出したばかりの中尾です。

39 messages 2001/03/12
[#12427] Re: bignum % の結果が負数になることがある — WATANABE Hirofumi <eban@...> 2001/03/12

わたなべです。

[#12463] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/13

In message <4518-Mon12Mar2001145434+0900-eban@os.rim.or.jp>

[#12464] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/13

まつもと ゆきひろです

[#12466] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/13

In message <984469222.234203.1007.nullmailer@ev.netlab.zetabits.com>

[#12475] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/14

まつもと ゆきひろです

[#12476] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/14

In message <984550885.417146.3670.nullmailer@ev.netlab.zetabits.com>

[#12480] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/14

まつもと ゆきひろです

[#12481] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/14

In message <984553493.009507.3747.nullmailer@ev.netlab.zetabits.com>

[#12488] Re: bignum % の結果が負数になることがある — matz@... (Yukihiro Matsumoto) 2001/03/14

まつもと ゆきひろです

[#12493] Re: bignum % の結果が負数になることがある — Takahiro Kambe <taca@...> 2001/03/14

In message <984579430.080967.5569.nullmailer@ev.netlab.zetabits.com>

[#12578] require 'win32api' — Kazuhiro NISHIYAMA <zn@...>

require 'win32api'のエラーメッセージがわかりにくいと

21 messages 2001/03/20
[#12579] Re: require 'win32api' — nobu.nakada@... 2001/03/20

なかだです。

[#12598] Re: require 'win32api' — nobu.nakada@... 2001/03/21

なかだです。

[#12582] finalizer problem — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

20 messages 2001/03/20
[#12583] Re: finalizer problem — matz@... (Yukihiro Matsumoto) 2001/03/20

まつもと ゆきひろです

[#12585] Re: finalizer problem — keiju@... (石塚圭樹) 2001/03/20

けいじゅ@日本ラショナルソフトウェアです.

[#12591] Re: finalizer problem — matz@... (Yukihiro Matsumoto) 2001/03/20

まつもと ゆきひろです

[#12619] Re: finalizer problem — keiju@... (石塚圭樹) 2001/03/22

けいじゅ@日本ラショナルソフトウェアです.

[#12605] extern inline (ruby.h) ruby-1.6.3 — WATANABE Tetsuya <tetsu@...>

渡辺哲也です。

17 messages 2001/03/22
[#12606] Re: extern inline (ruby.h) ruby-1.6.3 — matz@... (Yukihiro Matsumoto) 2001/03/22

まつもと ゆきひろです

[#12607] Re: extern inline (ruby.h) ruby-1.6.3 — WATANABE Tetsuya <tetsu@...> 2001/03/22

渡辺哲也です。

[#12608] Re: extern inline (ruby.h) ruby-1.6.3 — matz@... (Yukihiro Matsumoto) 2001/03/22

まつもと ゆきひろです

[#12674] Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp>

21 messages 2001/03/25
[#12675] Re: Was: [rubyist:0454] Re: to_str — matz@... (Yukihiro Matsumoto) 2001/03/26

まつもと ゆきひろです

[#12678] Re: Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp> 2001/03/26

[#12681] Re: Was: [rubyist:0454] Re: to_str — matz@... (Yukihiro Matsumoto) 2001/03/26

まつもと ゆきひろです

[#12687] Re: Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp> 2001/03/27

[#12688] Re: Was: [rubyist:0454] Re: to_str — matz@... (Yukihiro Matsumoto) 2001/03/28

まつもと ゆきひろです

[#12710] Re: Was: [rubyist:0454] Re: to_str — Kenichi Komiya <kom@...1.accsnet.ne.jp> 2001/03/31

[ruby-dev:12387] reducing logical operation

From: "Nobuyoshi.Nakada" <nobu.nakada@...>
Date: 2001-03-07 10:42:17 UTC
List: ruby-dev #12387
なかだです。

  せっかく構文木があるんだからと思っても、なかなか最適化は難し
いです。とりあえず論理式の簡略化だけしてみましたが、あんまり違
いはなさそうな気も。


Index: parse.y
===================================================================
RCS file: /home/cvs/ruby/src/ruby/parse.y,v
retrieving revision 1.90
diff -u -2 -p -r1.90 parse.y
--- parse.y	2001/03/06 08:17:16	1.90
+++ parse.y	2001/03/07 02:07:33
@@ -113,4 +113,9 @@ static NODE *new_call();
 static NODE *new_fcall();
 static NODE *new_super();
+static NODE *new_if _((NODE* cond, NODE* t, NODE* f));
+#define new_unless(c, t, f) new_if(c, f, t)
+static NODE *new_loop _((enum node_type t, NODE *c, NODE *b, int state));
+#define new_while(c, b, p) new_loop(NODE_WHILE, c, b, p)
+#define new_until(c, b, p) new_loop(NODE_UNTIL, c, b, p)
 
 static NODE *gettable();
@@ -349,5 +354,5 @@ stmt		: kALIAS fitem {lex_state = EXPR_F
 		    {
 			value_expr($3);
-			$$ = NEW_IF(cond($3), $1, 0);
+			$$ = new_if(cond($3), $1, 0);
 		        fixpos($$, $3);
 		    }
@@ -355,5 +360,5 @@ stmt		: kALIAS fitem {lex_state = EXPR_F
 		    {
 			value_expr($3);
-			$$ = NEW_UNLESS(cond($3), $1, 0);
+			$$ = new_unless(cond($3), $1, 0);
 		        fixpos($$, $3);
 		    }
@@ -361,14 +366,9 @@ stmt		: kALIAS fitem {lex_state = EXPR_F
 		    {
 			value_expr($3);
-			if ($1) {
-			    if (nd_type($1) == NODE_BEGIN) {
-				$$ = NEW_WHILE(cond($3), $1->nd_body, 0);
-			    }
-			    else {
-				$$ = NEW_WHILE(cond($3), $1, 1);
-			    }
+			if ($1 && nd_type($1) == NODE_BEGIN) {
+			    $$ = new_while(cond($3), $1->nd_body, 0);
 			}
 			else {
-			    $$ = 0;
+			    $$ = new_while(cond($3), $1, 1);
 			}
 		    }
@@ -376,14 +376,9 @@ stmt		: kALIAS fitem {lex_state = EXPR_F
 		    {
 			value_expr($3);
-			if ($1) {
-			    if (nd_type($1) == NODE_BEGIN) {
-				$$ = NEW_UNTIL(cond($3), $1->nd_body, 0);
-			    }
-			    else {
-				$$ = NEW_UNTIL(cond($3), $1, 1);
-			    }
+			if ($1 && nd_type($1) == NODE_BEGIN) {
+			    $$ = new_until(cond($3), $1->nd_body, 0);
 			}
 			else {
-			    $$ = 0;
+			    $$ = new_until(cond($3), $1, 1);
 			}
 		    }
@@ -912,5 +907,5 @@ arg		: lhs '=' arg
 		    {
 			value_expr($1);
-			$$ = NEW_IF(cond($1), $3, $5);
+			$$ = new_if(cond($1), $3, $5);
 		        fixpos($$, $1);
 		    }
@@ -1206,5 +1201,5 @@ primary		: literal
 		    {
 			value_expr($2);
-			$$ = NEW_IF(cond($2), $4, $5);
+			$$ = new_if(cond($2), $4, $5);
 		        fixpos($$, $2);
 		    }
@@ -1215,5 +1210,5 @@ primary		: literal
 		    {
 			value_expr($2);
-			$$ = NEW_UNLESS(cond($2), $4, $5);
+			$$ = new_unless(cond($2), $4, $5);
 		        fixpos($$, $2);
 		    }
@@ -1223,5 +1218,5 @@ primary		: literal
 		    {
 			value_expr($3);
-			$$ = NEW_WHILE(cond($3), $6, 1);
+			$$ = new_while(cond($3), $6, 1);
 		        fixpos($$, $3);
 		    }
@@ -1231,5 +1226,5 @@ primary		: literal
 		    {
 			value_expr($3);
-			$$ = NEW_UNTIL(cond($3), $6, 1);
+			$$ = new_until(cond($3), $6, 1);
 		        fixpos($$, $3);
 		    }
@@ -1401,5 +1396,5 @@ if_tail		: opt_else
 		    {
 			value_expr($2);
-			$$ = NEW_IF(cond($2), $4, $5);
+			$$ = new_if(cond($2), $4, $5);
 		        fixpos($$, $2);
 		    }
@@ -4580,5 +4575,14 @@ logop(type, left, right)
 {
     value_expr(left);
-    return rb_node_newnode(type, cond1(left, 1), cond1(right, 1), 0);
+    left = cond1(left, 1);
+    right = cond1(right, 1);
+    if (nd_type(left) == NODE_NOT && nd_type(right) == NODE_NOT) {
+	right->nd_2nd = right->nd_body;
+	right->nd_1st = left->nd_body;
+	left->nd_body = right;
+	nd_set_type(right, type ^ (NODE_OR ^ NODE_AND));
+	return left;
+    }
+    return rb_node_newnode(type, left, right, 0);
 }
 
@@ -4629,4 +4633,34 @@ new_super(a)
     }
     return NEW_SUPER(a);
+}
+
+static NODE*
+new_if(cond, iftrue, iffalse)
+    NODE *cond, *iftrue, *iffalse;
+{
+    if (nd_type(cond) != NODE_NOT) {
+	return NEW_IF(cond, iftrue, iffalse);
+    }
+    cond->nd_cond = cond->nd_body;
+    cond->nd_body = iffalse;
+    cond->nd_else = iftrue;
+    nd_set_type(cond, NODE_IF);
+    return cond;
+}
+
+static NODE*
+new_loop(type, cond, body, state)
+    enum node_type type;
+    NODE *cond, *body;
+    int state;
+{
+    if (nd_type(cond) != NODE_NOT) {
+	return rb_node_newnode(type, cond, body, state);
+    }
+    cond->nd_cond = cond->nd_body;
+    cond->nd_body = body;
+    cond->nd_state = state;
+    nd_set_type(cond, type ^ (NODE_WHILE ^ NODE_UNTIL));
+    return cond;
 }
 


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next