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

ruby-changes:50311

From: naruse <ko1@a...>
Date: Fri, 16 Feb 2018 17:28:54 +0900 (JST)
Subject: [ruby-changes:50311] naruse:r62426 (ruby_2_5): merge revision(s) 61617, 61618: [Backport #14273]

naruse	2018-02-16 17:28:48 +0900 (Fri, 16 Feb 2018)

  New Revision: 62426

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62426

  Log:
    merge revision(s) 61617,61618: [Backport #14273]
    
    compile.c: remove more unreachable chunk
    
    * compile.c (remove_unreachable_chunk): remove beyond labels to be
      removed.
    
    compile.c: fix stack consistency error
    
    * compile.c (iseq_peephole_optimize): fix stack consistency error
      from return in loop, by adding extra `pop` when replacing `jump`
      with `leave`, which is never reached but needed to adjust sp
      calculation.  [ruby-core:84589] [Bug #14273]

  Modified directories:
    branches/ruby_2_5/
  Modified files:
    branches/ruby_2_5/compile.c
    branches/ruby_2_5/test/ruby/test_syntax.rb
    branches/ruby_2_5/version.h
Index: ruby_2_5/version.h
===================================================================
--- ruby_2_5/version.h	(revision 62425)
+++ ruby_2_5/version.h	(revision 62426)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_5/version.h#L1
 #define RUBY_VERSION "2.5.0"
 #define RUBY_RELEASE_DATE "2018-02-16"
-#define RUBY_PATCHLEVEL 16
+#define RUBY_PATCHLEVEL 17
 
 #define RUBY_RELEASE_YEAR 2018
 #define RUBY_RELEASE_MONTH 2
Index: ruby_2_5/test/ruby/test_syntax.rb
===================================================================
--- ruby_2_5/test/ruby/test_syntax.rb	(revision 62425)
+++ ruby_2_5/test/ruby/test_syntax.rb	(revision 62426)
@@ -1128,6 +1128,15 @@ eom https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/ruby/test_syntax.rb#L1128
     assert_equal(:begin, result)
   end
 
+  def test_return_in_loop
+    obj = Object.new
+    def obj.test
+      x = nil
+      return until x unless x
+    end
+    assert_nil obj.test
+  end
+
   private
 
   def not_label(x) @result = x; @not_label ||= nil end
Index: ruby_2_5/compile.c
===================================================================
--- ruby_2_5/compile.c	(revision 62425)
+++ ruby_2_5/compile.c	(revision 62426)
@@ -2295,33 +2295,55 @@ replace_destination(INSN *dobj, INSN *no https://github.com/ruby/ruby/blob/trunk/ruby_2_5/compile.c#L2295
     if (!dl->refcnt) ELEM_REMOVE(&dl->link);
 }
 
+static LABEL*
+find_destination(INSN *i)
+{
+    int pos, len = insn_len(i->insn_id);
+    for (pos = 0; pos < len; ++pos) {
+	if (insn_op_types(i->insn_id)[pos] == TS_OFFSET) {
+	    return (LABEL *)OPERAND_AT(i, pos);
+	}
+    }
+    return 0;
+}
+
 static int
 remove_unreachable_chunk(rb_iseq_t *iseq, LINK_ELEMENT *i)
 {
     LINK_ELEMENT *first = i, *end;
+    int *unref_counts = 0, nlabels = ISEQ_COMPILE_DATA(iseq)->label_no;
 
     if (!i) return 0;
-    while (i) {
+    unref_counts = ALLOCA_N(int, nlabels);
+    MEMZERO(unref_counts, int, nlabels);
+    end = i;
+    do {
+	LABEL *lab;
 	if (IS_INSN(i)) {
-	    if (IS_INSN_ID(i, jump) || IS_INSN_ID(i, leave)) {
+	    if (IS_INSN_ID(i, leave)) {
+		end = i;
 		break;
 	    }
+	    else if ((lab = find_destination((INSN *)i)) != 0) {
+		if (lab->unremovable) break;
+		unref_counts[lab->label_no]++;
+	    }
 	}
 	else if (IS_LABEL(i)) {
-	    if (((LABEL *)i)->unremovable) return 0;
-	    if (((LABEL *)i)->refcnt > 0) {
+	    lab = (LABEL *)i;
+	    if (lab->unremovable) return 0;
+	    if (lab->refcnt > unref_counts[lab->label_no]) {
 		if (i == first) return 0;
-		i = i->prev;
 		break;
 	    }
+	    continue;
 	}
 	else if (IS_TRACE(i)) {
 	    /* do nothing */
 	}
 	else return 0;
-	i = i->next;
-    }
-    end = i;
+	end = i;
+    } while ((i = i->next) != 0);
     i = first;
     do {
 	if (IS_INSN(i)) {
@@ -2416,6 +2438,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/ruby_2_5/compile.c#L2438
 	    goto again;
 	}
 	else if (IS_INSN_ID(diobj, leave)) {
+	    INSN *pop;
 	    /*
 	     *  jump LABEL
 	     *  ...
@@ -2423,6 +2446,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/ruby_2_5/compile.c#L2446
 	     *  leave
 	     * =>
 	     *  leave
+	     *  pop
 	     *  ...
 	     * LABEL:
 	     *  leave
@@ -2432,6 +2456,9 @@ iseq_peephole_optimize(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/ruby_2_5/compile.c#L2456
 	    iobj->insn_id = BIN(leave);
 	    iobj->operand_size = 0;
 	    iobj->insn_info = diobj->insn_info;
+	    /* adjust stack depth */
+	    pop = new_insn_body(iseq, diobj->insn_info.line_no, BIN(pop), 0);
+	    ELEM_INSERT_NEXT(&iobj->link, &pop->link);
 	    goto again;
 	}
 	else if ((piobj = (INSN *)get_prev_insn(iobj)) != 0 &&
Index: ruby_2_5
===================================================================
--- ruby_2_5	(revision 62425)
+++ ruby_2_5	(revision 62426)

Property changes on: ruby_2_5
___________________________________________________________________
Modified: svn:mergeinfo
## -0,0 +0,1 ##
   Merged /trunk:r61617-61618

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

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