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

ruby-changes:40809

From: nobu <ko1@a...>
Date: Sat, 5 Dec 2015 02:27:02 +0900 (JST)
Subject: [ruby-changes:40809] nobu:r52888 (trunk): compile.c: just append compile error message

nobu	2015-12-05 02:26:38 +0900 (Sat, 05 Dec 2015)

  New Revision: 52888

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

  Log:
    compile.c: just append compile error message
    
    * compile.c (append_compile_error, prepare_compile_error): simply
      append messages to the same SyntaxError exception.

  Modified files:
    trunk/compile.c
Index: compile.c
===================================================================
--- compile.c	(revision 52887)
+++ compile.c	(revision 52888)
@@ -292,16 +292,42 @@ r_value(VALUE value) https://github.com/ruby/ruby/blob/trunk/compile.c#L292
   (((INSN*)(insn))->insn_id)
 
 /* error */
-#define COMPILE_ERROR(strs)                        \
-do {                                               \
-  rb_thread_t *th = GET_THREAD();                  \
-  VALUE tmp = th->errinfo;                         \
-  if (compile_debug) rb_compile_bug strs;          \
-  th->errinfo = ISEQ_COMPILE_DATA(iseq)->err_info;      \
-  rb_compile_error strs;                           \
-  RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->err_info, th->errinfo); \
-  th->errinfo = tmp;                               \
-} while (0)
+typedef void (*compile_error_func)(const char *, int, const char *, ...);
+
+static void
+append_compile_error(const char *file, int line, const char *fmt, ...)
+{
+    VALUE err_info = rb_errinfo();
+    VALUE str = rb_attr_get(err_info, idMesg);
+    va_list args;
+
+    if (RSTRING_LEN(str)) rb_str_cat2(str, "\n");
+    if (file) {
+	rb_str_cat2(str, file);
+	if (line) rb_str_catf(str, ":%d", line);
+	rb_str_cat2(str, ": ");
+    }
+    va_start(args, fmt);
+    rb_str_vcatf(str, fmt, args);
+    va_end(args);
+}
+
+NOINLINE(static compile_error_func prepare_compile_error(rb_iseq_t *iseq));
+
+static compile_error_func
+prepare_compile_error(rb_iseq_t *iseq)
+{
+    VALUE err_info = ISEQ_COMPILE_DATA(iseq)->err_info;
+    if (compile_debug) return rb_compile_bug;
+    if (NIL_P(err_info)) {
+	err_info = rb_exc_new_cstr(rb_eSyntaxError, "");
+	RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->err_info, err_info);
+    }
+    rb_set_errinfo(err_info);
+    return append_compile_error;
+}
+
+#define COMPILE_ERROR(strs) prepare_compile_error(iseq)strs
 
 #define ERROR_ARGS_AT(n) ruby_sourcefile, nd_line(n),
 #define ERROR_ARGS ERROR_ARGS_AT(node)

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

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