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

ruby-changes:47273

From: nobu <ko1@a...>
Date: Sat, 22 Jul 2017 15:01:47 +0900 (JST)
Subject: [ruby-changes:47273] nobu:r59388 (trunk): compile.c: COMPILE_ERROR

nobu	2017-07-22 15:01:38 +0900 (Sat, 22 Jul 2017)

  New Revision: 59388

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

  Log:
    compile.c: COMPILE_ERROR
    
    * compile.c: raise COMPILE_ERROR instead of compile_bug which is
      very rarely (or never, actually) useful to debug instruction
      sequence.  COMPILE_ERROR is usually SyntaxError, or fatal error
      if compile_debug is enabled,

  Modified files:
    trunk/compile.c
Index: compile.c
===================================================================
--- compile.c	(revision 59387)
+++ compile.c	(revision 59388)
@@ -346,6 +346,7 @@ append_compile_error(rb_iseq_t *iseq, in https://github.com/ruby/ruby/blob/trunk/compile.c#L346
     if (compile_debug) rb_exc_fatal(err);
 }
 
+#if 0
 static void
 compile_bug(rb_iseq_t *iseq, int line, const char *fmt, ...)
 {
@@ -355,34 +356,38 @@ compile_bug(rb_iseq_t *iseq, int line, c https://github.com/ruby/ruby/blob/trunk/compile.c#L356
     va_end(args);
     abort();
 }
+#endif
 
 #define COMPILE_ERROR append_compile_error
 
 #define ERROR_ARGS_AT(n) iseq, nd_line(n),
 #define ERROR_ARGS ERROR_ARGS_AT(node)
 
-#define EXPECT_NODE(prefix, node, ndtype) \
+#define EXPECT_NODE(prefix, node, ndtype, errval) \
 do { \
     NODE *error_node = (node); \
     enum node_type error_type = nd_type(error_node); \
     if (error_type != (ndtype)) { \
-	compile_bug(ERROR_ARGS_AT(error_node) \
-		    prefix ": " #ndtype " is expected, but %s", \
-		    ruby_node_name(error_type)); \
+	COMPILE_ERROR(ERROR_ARGS_AT(error_node) \
+		      prefix ": " #ndtype " is expected, but %s", \
+		      ruby_node_name(error_type)); \
+	return errval; \
     } \
 } while (0)
 
-#define EXPECT_NODE_NONULL(prefix, parent, ndtype) \
+#define EXPECT_NODE_NONULL(prefix, parent, ndtype, errval) \
 do { \
-    compile_bug(ERROR_ARGS_AT(parent) \
-		prefix ": must be " #ndtype ", but 0"); \
+    COMPILE_ERROR(ERROR_ARGS_AT(parent) \
+		  prefix ": must be " #ndtype ", but 0"); \
+    return errval; \
 } while (0)
 
-#define UNKNOWN_NODE(prefix, node) \
+#define UNKNOWN_NODE(prefix, node, errval) \
 do { \
     NODE *error_node = (node); \
-    compile_bug(ERROR_ARGS_AT(error_node) prefix ": unknown node (%s)", \
-		ruby_node_name(nd_type(error_node))); \
+    COMPILE_ERROR(ERROR_ARGS_AT(error_node) prefix ": unknown node (%s)", \
+		  ruby_node_name(nd_type(error_node))); \
+    return errval; \
 } while (0)
 
 #define COMPILE_OK 1
@@ -640,7 +645,8 @@ rb_iseq_compile_node(rb_iseq_t *iseq, NO https://github.com/ruby/ruby/blob/trunk/compile.c#L645
 	    CHECK(COMPILE(ret, "defined guard", node));
 	    break;
 	  default:
-	    compile_bug(ERROR_ARGS "unknown scope");
+	    COMPILE_ERROR(ERROR_ARGS "unknown scope");
+	    return COMPILE_NG;
 	}
     }
 
@@ -1362,7 +1368,7 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L1368
 	int last_comma = 0;
 	ID block_id = 0;
 
-	EXPECT_NODE("iseq_set_arguments", node_args, NODE_ARGS);
+	EXPECT_NODE("iseq_set_arguments", node_args, NODE_ARGS, COMPILE_NG);
 
 	iseq->body->param.lead_num = (int)args->pre_args_num;
 	if (iseq->body->param.lead_num > 0) iseq->body->param.flags.has_lead = TRUE;
@@ -1659,9 +1665,10 @@ fix_sp_depth(rb_iseq_t *iseq, LINK_ANCHO https://github.com/ruby/ruby/blob/trunk/compile.c#L1665
 		sp = adjust->label ? adjust->label->sp : 0;
 		if (adjust->line_no != -1 && orig_sp - sp < 0) {
 		    BADINSN_DUMP(anchor, list, NULL);
-		    compile_bug(iseq, adjust->line_no,
-				"iseq_set_sequence: adjust bug %d < %d",
-				orig_sp, sp);
+		    COMPILE_ERROR(iseq, adjust->line_no,
+				  "iseq_set_sequence: adjust bug %d < %d",
+				  orig_sp, sp);
+		    return -1;
 		}
 		break;
 	    }
@@ -1903,9 +1910,10 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ https://github.com/ruby/ruby/blob/trunk/compile.c#L1910
 			generated_iseq[code_index++] = BIN(nop);
 		    }
 		    else {
-			compile_bug(iseq, adjust->line_no,
-				    "iseq_set_sequence: adjust bug %d < %d",
-				    orig_sp, sp);
+			COMPILE_ERROR(iseq, adjust->line_no,
+				      "iseq_set_sequence: adjust bug %d < %d",
+				      orig_sp, sp);
+			return COMPILE_NG;
 		    }
 		}
 		break;
@@ -2885,8 +2893,9 @@ compile_dstr_fragments(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/compile.c#L2893
     if (!NIL_P(lit)) {
 	cnt++;
 	if (!RB_TYPE_P(lit, T_STRING)) {
-	    compile_bug(ERROR_ARGS "dstr: must be string: %s",
-			rb_builtin_type_name(TYPE(lit)));
+	    COMPILE_ERROR(ERROR_ARGS "dstr: must be string: %s",
+			  rb_builtin_type_name(TYPE(lit)));
+	    return COMPILE_NG;
 	}
 	lit = node->nd_lit = rb_fstring(lit);
 	ADD_INSN1(ret, nd_line(node), putobject, lit);
@@ -3110,8 +3119,8 @@ static_literal_value(NODE *node) https://github.com/ruby/ruby/blob/trunk/compile.c#L3119
 }
 
 static int
-compile_array_(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE* node_root,
-	       enum compile_array_type_t type, struct rb_call_info_kw_arg **keywords_ptr, int popped)
+compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE* node_root,
+	      enum compile_array_type_t type, struct rb_call_info_kw_arg **keywords_ptr, int popped)
 {
     NODE *node = node_root;
     int line = (int)nd_line(node);
@@ -3139,7 +3148,7 @@ compile_array_(rb_iseq_t *iseq, LINK_ANC https://github.com/ruby/ruby/blob/trunk/compile.c#L3148
 
 	    for (i=0; i<max && node; i++, len++, node = node->nd_next) {
 		if (CPDEBUG > 0) {
-		    EXPECT_NODE("compile_array", node, NODE_ARRAY);
+		    EXPECT_NODE("compile_array", node, NODE_ARRAY, -1);
 		}
 
 		if (type != COMPILE_ARRAY_TYPE_ARRAY && !node->nd_head) {
@@ -3213,7 +3222,8 @@ compile_array_(rb_iseq_t *iseq, LINK_ANC https://github.com/ruby/ruby/blob/trunk/compile.c#L3222
 			    ADD_SEND(ret, line, id_core_hash_merge_ary, INT2FIX(1));
 			    /* wrong number of arguments -----------------------^ */
 #else
-			    compile_bug(ERROR_ARGS "core#hash_merge_ary");
+			    COMPILE_ERROR(ERROR_ARGS "core#hash_merge_ary");
+			    return -1;
 #endif
 			}
 		    }
@@ -3273,12 +3283,6 @@ compile_array_(rb_iseq_t *iseq, LINK_ANC https://github.com/ruby/ruby/blob/trunk/compile.c#L3283
 }
 
 static VALUE
-compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE* node_root, enum compile_array_type_t type)
-{
-    return compile_array_(iseq, ret, node_root, type, NULL, 0);
-}
-
-static VALUE
 case_when_optimizable_literal(NODE *node)
 {
     switch (nd_type(node)) {
@@ -3973,7 +3977,9 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR https://github.com/ruby/ruby/blob/trunk/compile.c#L3977
 	    *flag |= VM_CALL_ARGS_SPLAT;
 
 	    if (next_is_array) {
-		argc = INT2FIX(compile_array(iseq, args, argn->nd_head, COMPILE_ARRAY_TYPE_ARGS) + 1);
+		int len = compile_array(iseq, args, argn->nd_head, COMPILE_ARRAY_TYPE_ARGS, NULL, FALSE);
+		if (len < 0) return Qnil;
+		argc = INT2FIX(len + 1);
 	    }
 	    else {
 		argn = argn->nd_head;
@@ -3983,11 +3989,13 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR https://github.com/ruby/ruby/blob/trunk/compile.c#L3989
 	  }
 	  case NODE_ARRAY:
 	    {
-		argc = INT2FIX(compile_array_(iseq, args, argn, COMPILE_ARRAY_TYPE_ARGS, keywords, FALSE));
+		int len = compile_array(iseq, args, argn, COMPILE_ARRAY_TYPE_ARGS, keywords, FALSE);
+		if (len < 0) return Qnil;
+		argc = INT2FIX(len);
 		break;
 	    }
 	  default: {
-	    UNKNOWN_NODE("setup_arg", argn);
+	    UNKNOWN_NODE("setup_arg", argn, Qnil);
 	  }
 	}
     }
@@ -4152,11 +4160,11 @@ compile_case(rb_iseq_t *iseq, LINK_ANCHO https://github.com/ruby/ruby/blob/trunk/compile.c#L4160
 		ADD_INSNL(cond_seq, nd_line(vals), branchif, l1);
 		break;
 	      default:
-		UNKNOWN_NODE("NODE_CASE", vals);
+		UNKNOWN_NODE("NODE_CASE", vals, COMPILE_NG);
 	    }
 	}
 	else {
-	    EXPECT_NODE_NONULL("NODE_CASE", node, NODE_ARRAY);
+	    EXPECT_NODE_NONULL("NODE_CASE", node, NODE_ARRAY, COMPILE_NG);
 	}
 
 	node = node->nd_next;
@@ -4218,7 +4226,8 @@ compile_when(rb_iseq_t *iseq, LINK_ANCHO https://github.com/ruby/ruby/blob/trunk/compile.c#L4226
 
 	vals = node->nd_head;
 	if (!vals) {
-	    compile_bug(ERROR_ARGS "NODE_WHEN: must be NODE_ARRAY, but 0");
+	    COMPILE_ERROR(ERROR_ARGS "NODE_WHEN: must be NODE_ARRAY, but 0");
+	    return COMPILE_NG;
 	}
 	switch (nd_type(vals)) {
 	  case NODE_ARRAY:
@@ -4238,7 +4247,7 @@ compile_when(rb_iseq_t *iseq, LINK_ANCHO https://github.com/ruby/ruby/blob/trunk/compile.c#L4247
 	    ADD_INSNL(ret, nd_line(vals), branchif, l1);
 	    break;
 	  default:
-	    UNKNOWN_NODE("NODE_WHEN", vals);
+	    UNKNOWN_NODE("NODE_WHEN", vals, COMPILE_NG);
 	}
 	node = node->nd_next;
     }
@@ -4412,7 +4421,8 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L4421
 
 	if (node->nd_state == Qundef) {
 	    /* ADD_INSN(ret, line, putundef); */
-	    compile_bug(ERROR_ARGS "unsupported: putundef");
+	    COMPILE_ERROR(ERROR_ARGS "unsupported: putundef");
+	    goto ng;
 	}
 	else {
 	    ADD_INSN(ret, line, putnil);
@@ -4778,7 +4788,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L4788
 		    ADD_INSNL(ret, line, branchif, label_hit);
 		    break;
 		  default:
-		    UNKNOWN_NODE("NODE_RESBODY", narg);
+		    UNKNOWN_NODE("NODE_RESBODY", narg, COMPILE_NG);
 		}
 	    }
 	    else {
@@ -4903,8 +4913,9 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L4913
 	idx = get_dyna_var_idx(iseq, node->nd_vid, &lv, &ls);
 
 	if (idx < 0) {
-	    compile_bug(ERROR_ARGS "NODE_DASGN(_CURR): unknown id (%"PRIsVALUE")",
-			rb_id2str(node->nd_vid));
+	    COMPILE_ERROR(ERROR_ARGS "NODE_DASGN(_CURR): unknown id (%"PRIsVALUE")",
+			  rb_id2str(node->nd_vid));
+	    goto ng;
 	}
 	ADD_SETLOCAL(ret, line, ls - idx, lv);
 	break;
@@ -5001,6 +5012,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L5012
 	  default:
 	    INIT_ANCHOR(args);
 	    argc = setup_args(iseq, args, node->nd_args->nd_head, &flag, NULL);
+	    CHECK(!NIL_P(argc));
 	    ADD_SEQ(ret, args);
 	}
 	ADD_INSN1(ret, line, dupn, FIXNUM_INC(argc, 1 + boff));
@@ -5446,6 +5458,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L5458
 	/* args */
 	if (type != NODE_VCALL) {
 	    argc = setup_args(iseq, args, node->nd_args, &flag, &keywords);
+	    CHECK(!NIL_P(argc));
 	}
 	else {
 	    argc = INT2FIX(0);
@@ -5487,6 +5500,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L5500
 	ISEQ_COMPILE_DATA(iseq)->current_block = NULL;
 	if (type == NODE_SUPER) {
 	    VALUE vargc = setup_args(iseq, args, node->nd_args, &flag, &keywords);
+	    CHECK(!NIL_P(vargc));
 	    argc = FIX2INT(vargc);
 	}
 	else {
@@ -5602,7 +5616,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L5616
 	break;
       }
       case NODE_ARRAY:{
-	compile_array_(iseq, ret, node, COMPILE_ARRAY_TYPE_ARRAY, NULL, popped);
+	CHECK(compile_array(iseq, ret, node, COMPILE_ARRAY_TYPE_ARRAY, NULL, popped) >= 0);
 	break;
       }
       case NODE_ZARRAY:{
@@ -5630,7 +5644,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L5644
 	INIT_ANCHOR(list);
 	switch (type) {
 	  case NODE_ARRAY:
-	    compile_array_(iseq, list, node->nd_head, COMPILE_ARRAY_TYPE_HASH, NULL, popped);
+	    CHECK(compile_array(iseq, list, node->nd_head, COMPILE_ARRAY_TYPE_HASH, NULL, popped) >= 0);
 	    ADD_SEQ(ret, list);
 	    break;
 
@@ -5640,8 +5654,9 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L5654
 	    break;
 
 	  default:
-	    compile_bug(ERROR_ARGS_AT(node->nd_head) "can't make hash with this node: %s",
-			ruby_node_name(type));
+	    COMPILE_ERROR(ERROR_ARGS_AT(node->nd_head) "can't make hash with this node: %s",
+			  ruby_node_name(type));
+	    goto ng;
 	}
 	break;
       }
@@ -5717,6 +5732,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L5732
 
 	if (node->nd_head) {
 	    argc = setup_args(iseq, args, node->nd_head, &flag, &keywords);
+	    CHECK(!NIL_P(argc));
 	}
 	else {
 	    argc = INT2FIX(0);
@@ -5746,8 +5762,9 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L5762
 	if (!popped) {
 	    idx = get_dyna_var_idx(iseq, node->nd_vid, &lv, &ls);
 	    if (idx < 0) {
-		compile_bug(ERROR_ARGS "unknown dvar (%"PRIsVALUE")",
-			    rb_id2str(node->nd_vid));
+		COMPILE_ERROR(ERROR_ARGS "unknown dvar (%"PRIsVALUE")",
+			      rb_id2str(node->nd_vid));
+		goto ng;
 	    }
 	    ADD_GETLOCAL(ret, line, ls - idx, lv);
 	}
@@ -6312,13 +6329,15 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L6329
 
 	    if (default_value == (NODE *)-1) {
 		/* required argument. do nothing */
-		compile_bug(ERROR_ARGS "unreachable");
+		COMPILE_ERROR(ERROR_ARGS "unreachable");
+		goto ng;
 	    }
 	    else if (nd_type(default_value) == NODE_LIT ||
 		     nd_type(default_value) == NODE_NIL ||
 		     nd_type(default_value) == NODE_TRUE ||
 		     nd_type(default_value) == NODE_FALSE) {
-		compile_bug(ERROR_ARGS "unreachable");
+		COMPILE_ERROR(ERROR_ARGS "unreachable");
+		goto ng;
 	    }
 	    else {
 		/* if keywordcheck(_kw_bits, nth_keyword)
@@ -6382,6 +6401,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L6401
 	INIT_ANCHOR(recv);
 	INIT_ANCHOR(args);
 	argc = setup_args(iseq, args, node->nd_args, &flag, NULL);
+	CHECK(!NIL_P(argc));
 
 	flag |= COMPILE_RECV(recv, "recv", node);
 
@@ -6459,8 +6479,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L6479
 	break;
       }
       default:
-	UNKNOWN_NODE("iseq_compile_each", node);
-	return COMPILE_NG;
+	UNKNOWN_NODE("iseq_compile_each", node, COMPILE_NG);
     }
 
     /* check & remove redundant trace(line) */

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

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