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

ruby-changes:41388

From: nobu <ko1@a...>
Date: Fri, 8 Jan 2016 16:47:34 +0900 (JST)
Subject: [ruby-changes:41388] nobu:r53460 (trunk): iseq.c: make local variables volatile

nobu	2016-01-08 16:47:49 +0900 (Fri, 08 Jan 2016)

  New Revision: 53460

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

  Log:
    iseq.c: make local variables volatile
    
    * iseq.c (rb_iseq_compile_with_option): prepare arguments outside
      EXEC_TAG, and make local variables volatile not to be clobbered
      by longjmp.

  Modified files:
    trunk/iseq.c
Index: iseq.c
===================================================================
--- iseq.c	(revision 53459)
+++ iseq.c	(revision 53460)
@@ -606,21 +606,25 @@ rb_iseq_compile_with_option(VALUE src, V https://github.com/ruby/ruby/blob/trunk/iseq.c#L606
     const rb_iseq_t *const parent = base_block ? base_block->iseq : NULL;
     rb_compile_option_t option;
     const enum iseq_type type = parent ? ISEQ_TYPE_EVAL : ISEQ_TYPE_TOP;
-
-    StringValueCStr(file);
-
-    make_compile_option(&option, opt);
+#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 8
+# define INITIALIZED volatile /* suppress warnings by gcc 4.8 */
+#else
+# define INITIALIZED volatile
+#endif
+    /* safe results first */
+    const INITIALIZED int ln = (make_compile_option(&option, opt), NUM2INT(line));
+    NODE *(*const INITIALIZED parse)(VALUE vparser, VALUE fname, VALUE file, int start) =
+	(StringValueCStr(file), RB_TYPE_P(src, T_FILE)) ?
+	rb_parser_compile_file_path :
+	(StringValue(src), rb_parser_compile_string_path);
+    /* should never fail usually */
+    const INITIALIZED VALUE label = parent ?
+	parent->body->location.label :
+	rb_fstring_cstr("<compiled>");
 
     th->base_block = base_block;
     TH_PUSH_TAG(th);
     if ((state = EXEC_TAG()) == 0) {
-	VALUE label = parent ? parent->body->location.label :
-	    rb_fstring_cstr("<compiled>");
-	int ln = NUM2INT(line);
-	NODE *(*parse)(VALUE vparser, VALUE fname, VALUE file, int start) =
-	    (RB_TYPE_P(src, T_FILE) ?
-	     rb_parser_compile_file_path :
-	     (StringValue(src), rb_parser_compile_string_path));
 	NODE *node = (*parse)(rb_parser_new(), file, src, ln);
 	if (node) { /* TODO: check err */
 	    iseq = rb_iseq_new_with_opt(node, label, file, absolute_path, line,
@@ -631,10 +635,10 @@ rb_iseq_compile_with_option(VALUE src, V https://github.com/ruby/ruby/blob/trunk/iseq.c#L635
 
     th->base_block = prev_base_block;
 
-    if (!iseq) rb_exc_raise(th->errinfo);
     if (state) {
 	JUMP_TAG(state);
     }
+    if (!iseq) rb_exc_raise(th->errinfo);
 
     return iseq;
 }

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

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