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

ruby-changes:54780

From: ko1 <ko1@a...>
Date: Mon, 4 Feb 2019 16:10:10 +0900 (JST)
Subject: [ruby-changes:54780] ko1:r66999 (trunk): check and show a warning for incorrect yield.

ko1	2019-02-04 16:10:05 +0900 (Mon, 04 Feb 2019)

  New Revision: 66999

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

  Log:
    check and show a warning for incorrect yield.
    
    * compile.c (check_yield_place): this function check the yield location.
      * show a warning if yield in `class` syntax. [Feature #15575]
    
      * do strict check for toplevel `yield`. Without this patch,
        `1.times{ yield }` in toplevel is valid-syntax (raise LocalJumpError
        at runtime) although toplevel simple `yield` is not valid syntax.
        This patch make them syntax error.

  Modified files:
    trunk/compile.c
Index: compile.c
===================================================================
--- compile.c	(revision 66998)
+++ compile.c	(revision 66999)
@@ -5922,6 +5922,21 @@ qcall_branch_end(rb_iseq_t *iseq, LINK_A https://github.com/ruby/ruby/blob/trunk/compile.c#L5922
 }
 
 static int
+check_yield_place(const rb_iseq_t *iseq)
+{
+    switch (iseq->body->local_iseq->body->type) {
+      case ISEQ_TYPE_TOP:
+      case ISEQ_TYPE_MAIN:
+        return FALSE;
+      case ISEQ_TYPE_CLASS:
+        rb_warn("`yield' in class syntax will not be supported from Ruby 3.0. [Feature #15575]");
+        return TRUE;
+      default:
+        return TRUE;
+    }
+}
+
+static int
 iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, int popped)
 {
     const int line = (int)nd_line(node);
@@ -6827,11 +6842,11 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L6842
 	struct rb_call_info_kw_arg *keywords = NULL;
 
 	INIT_ANCHOR(args);
-	if (body->type == ISEQ_TYPE_TOP ||
-	    body->type == ISEQ_TYPE_MAIN) {
+
+        if (check_yield_place(iseq) == FALSE) {
 	    COMPILE_ERROR(ERROR_ARGS "Invalid yield");
-	    goto ng;
-	}
+            goto ng;
+        }
 
 	if (node->nd_head) {
 	    argc = setup_args(iseq, args, node->nd_head, &flag, &keywords);

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

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