[前][次][番号順一覧][スレッド一覧]

ruby-changes:57648

From: Yusuke <ko1@a...>
Date: Sat, 7 Sep 2019 20:25:28 +0900 (JST)
Subject: [ruby-changes:57648] 07876bf6db (master): compile.c (compile_hash): refactoring

https://git.ruby-lang.org/ruby.git/commit/?id=07876bf6db

From 07876bf6dbdab5a8a633173f91ee1603d617afb0 Mon Sep 17 00:00:00 2001
From: Yusuke Endoh <mame@r...>
Date: Sat, 7 Sep 2019 20:24:24 +0900
Subject: compile.c (compile_hash): refactoring

The same refactoring as to b601b13c7267889bf394146353c5f2b0eb488278.

diff --git a/compile.c b/compile.c
index b4a49b1..ac035bd 100644
--- a/compile.c
+++ b/compile.c
@@ -4012,149 +4012,139 @@ static int https://github.com/ruby/ruby/blob/trunk/compile.c#L4012
 compile_hash(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, int popped)
 {
     int line = (int)nd_line(node);
-    int len = 0;
 
     if (nd_type(node) == NODE_ZLIST) {
 	if (!popped) {
 	    ADD_INSN1(ret, line, newhash, INT2FIX(0));
 	}
+        return 0;
     }
-    else {
-	int opt_p = 1;
-	int first = 1, i;
-        int single_kw = 0;
-        int num_kw = 0;
 
-	while (node) {
-	    const NODE *start_node = node, *end_node;
-	    const NODE *kw = 0;
-	    const int max = 0x100;
-	    DECL_ANCHOR(anchor);
-	    INIT_ANCHOR(anchor);
-
-	    for (i=0; i<max && node; i++, len++, node = node->nd_next) {
-		if (CPDEBUG > 0) {
-		    EXPECT_NODE("compile_hash", node, NODE_LIST, -1);
-		}
+    EXPECT_NODE("compile_hash", node, NODE_LIST, -1);
 
-                if (!node->nd_head) {
-		    kw = node->nd_next;
-                    num_kw++;
-		    node = 0;
-		    if (kw) {
-			opt_p = 0;
-			node = kw->nd_next;
-			kw = kw->nd_head;
-                        if (!single_kw && !node) {
-                            single_kw = 1;
-                        }
-		    }
-		    break;
-		}
-                if (opt_p && !static_literal_node_p(node, iseq)) {
-		    opt_p = 0;
-		}
+    if (popped) {
+        for (; node; node = node->nd_next) {
+            NO_CHECK(COMPILE_(ret, "hash element", node->nd_head, popped));
+        }
+        return 1;
+    }
 
-                NO_CHECK(COMPILE_(anchor, "array element", node->nd_head, popped));
-	    }
+    int opt_p = 1;
+    int first = 1, i;
+    int single_kw = 0;
+    int num_kw = 0;
 
-            if (opt_p) {
-		if (!popped) {
-		    VALUE ary = rb_ary_tmp_new(i);
+    while (node) {
+        const NODE *start_node = node, *end_node;
+        const NODE *kw = 0;
+        const int max = 0x100;
+        DECL_ANCHOR(anchor);
+        INIT_ANCHOR(anchor);
 
-		    end_node = node;
-		    node = start_node;
+        for (i=0; i<max && node; i++, node = node->nd_next) {
+            if (CPDEBUG > 0) {
+                EXPECT_NODE("compile_hash", node, NODE_LIST, -1);
+            }
 
-		    while (node != end_node) {
-                        rb_ary_push(ary, static_literal_value(node, iseq));
-			node = node->nd_next;
-		    }
-                    while (node && node->nd_next &&
-                           static_literal_node_p(node, iseq) &&
-                           static_literal_node_p(node->nd_next, iseq)) {
-                        VALUE elem[2];
-                        elem[0] = static_literal_value(node, iseq);
-                        elem[1] = static_literal_value(node->nd_next, iseq);
-                        rb_ary_cat(ary, elem, 2);
-                        node = node->nd_next->nd_next;
-                        len++;
+            if (!node->nd_head) {
+                kw = node->nd_next;
+                num_kw++;
+                node = 0;
+                if (kw) {
+                    opt_p = 0;
+                    node = kw->nd_next;
+                    kw = kw->nd_head;
+                    if (!single_kw && !node) {
+                        single_kw = 1;
                     }
+                }
+                break;
+            }
+            if (opt_p && !static_literal_node_p(node, iseq)) {
+                opt_p = 0;
+            }
 
-		    OBJ_FREEZE(ary);
+            NO_CHECK(COMPILE_(anchor, "hash element", node->nd_head, 0));
+        }
 
-		    iseq_add_mark_object_compile_time(iseq, ary);
+        if (opt_p) {
+            VALUE ary = rb_ary_tmp_new(i);
 
-		    if (first) {
-			first = 0;
-                        VALUE hash;
+            end_node = node;
+            node = start_node;
 
-                        hash = rb_hash_new_with_size(RARRAY_LEN(ary) / 2);
-                        rb_hash_bulk_insert(RARRAY_LEN(ary), RARRAY_CONST_PTR_TRANSIENT(ary), hash);
-                        iseq_add_mark_object_compile_time(iseq, rb_obj_hide(hash));
-                        ADD_INSN1(ret, line, duphash, hash);
-		    }
-		    else {
-                        COMPILE_ERROR(ERROR_ARGS "core#hash_merge_ary");
-                        return -1;
-		    }
-		}
-	    }
-	    else {
-                if (!popped || kw) {
-                    if (i > 0) {
-                        num_kw++;
-                        if (first) {
-                            if (!popped) {
-                                ADD_INSN1(anchor, line, newhash, INT2FIX(i));
-                            }
-                            APPEND_LIST(ret, anchor);
-                        }
-                        else {
-                            if (!popped) {
-                                ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
-                                ADD_INSN(ret, line, swap);
-                            }
-                            APPEND_LIST(ret, anchor);
-                            if (!popped) {
-                                ADD_SEND(ret, line, id_core_hash_merge_ptr, INT2FIX(i + 1));
-                            }
-                        }
-                    }
-                    if (kw) {
-                        int empty_kw = nd_type(kw) == NODE_LIT;
-                        int first_kw = num_kw == 1;
-                        int only_kw = single_kw && first_kw;
-
-                        if (!popped && !empty_kw) {
-                            ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
-                            if (i > 0 || !first) ADD_INSN(ret, line, swap);
-                            else ADD_INSN1(ret, line, newhash, INT2FIX(0));
-                        }
+            while (node != end_node) {
+                rb_ary_push(ary, static_literal_value(node, iseq));
+                node = node->nd_next;
+            }
+            while (node && node->nd_next &&
+                   static_literal_node_p(node, iseq) &&
+                   static_literal_node_p(node->nd_next, iseq)) {
+                VALUE elem[2];
+                elem[0] = static_literal_value(node, iseq);
+                elem[1] = static_literal_value(node->nd_next, iseq);
+                rb_ary_cat(ary, elem, 2);
+                node = node->nd_next->nd_next;
+            }
 
-                        if (empty_kw && first_kw && !only_kw) {
-                            ADD_INSN1(ret, line, newhash, INT2FIX(0));
-                        }
-                        else if (!empty_kw || only_kw) {
-                            NO_CHECK(COMPILE(ret, "keyword splat", kw));
-                        }
+            OBJ_FREEZE(ary);
 
-                        if (popped) {
-                            ADD_INSN(ret, line, pop);
-                        }
-                        else if (!empty_kw) {
-                            ADD_SEND(ret, line, id_core_hash_merge_kwd, INT2FIX(2));
-                        }
-                    }
-                    first = 0;
+            iseq_add_mark_object_compile_time(iseq, ary);
+
+            if (first) {
+                first = 0;
+                VALUE hash;
+
+                hash = rb_hash_new_with_size(RARRAY_LEN(ary) / 2);
+                rb_hash_bulk_insert(RARRAY_LEN(ary), RARRAY_CONST_PTR_TRANSIENT(ary), hash);
+                iseq_add_mark_object_compile_time(iseq, rb_obj_hide(hash));
+                ADD_INSN1(ret, line, duphash, hash);
+            }
+            else {
+                COMPILE_ERROR(ERROR_ARGS "core#hash_merge_ary");
+                return -1;
+            }
+        }
+        else {
+            if (i > 0) {
+                num_kw++;
+                if (first) {
+                    ADD_INSN1(anchor, line, newhash, INT2FIX(i));
+                    APPEND_LIST(ret, anchor);
                 }
-		else {
-		    /* popped */
-		    APPEND_LIST(ret, anchor);
-		}
-	    }
-	}
+                else {
+                    ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
+                    ADD_INSN(ret, line, swap);
+                    APPEND_LIST(ret, anchor);
+                    ADD_SEND(ret, line, id_core_hash_merge_ptr, INT2FIX(i + 1));
+                }
+            }
+            if (kw) {
+                int empty_kw = nd_type(kw) == NODE_LIT;
+                int first_kw = num_kw == 1;
+                int only_kw = single_kw && first_kw;
+
+                if (!empty_kw) {
+                    ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
+                    if (i > 0 || !first) ADD_INSN(ret, line, swap);
+                    else ADD_INSN1(ret, line, newhash, INT2FIX(0));
+                }
+
+                if (empty_kw && first_kw && !only_kw) {
+                    ADD_INSN1(ret, line, newhash, INT2FIX(0));
+                }
+                else if (!empty_kw || only_kw) {
+                    NO_CHECK(COMPILE(ret, "keyword splat", kw));
+                }
+
+                if (!empty_kw) {
+                    ADD_SEND(ret, line, id_core_hash_merge_kwd, INT2FIX(2));
+                }
+            }
+            first = 0;
+        }
     }
-    return len;
+    return 1;
 }
 
 VALUE
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]