summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--error.c115
-rw-r--r--parse.y20
-rw-r--r--ruby.h3
4 files changed, 106 insertions, 38 deletions
diff --git a/ChangeLog b/ChangeLog
index 47a18263ea..3a822fbb4d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed May 2 06:46:43 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c, parse.y, ruby.h (rb_compile_warn, rb_compile_warning): warn
+ for compilation. the parser should no longer use rb_warn() and
+ rb_warning(). [ruby-dev:30121]
+
Wed May 2 05:45:21 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* parse.y (assoc): result of assoc_new needs to be an assoc.
diff --git a/error.c b/error.c
index b80afa881d..c50668a69c 100644
--- a/error.c
+++ b/error.c
@@ -30,20 +30,32 @@ const char *rb_sourcefile(void);
int rb_sourceline(void);
static int
-err_position(char *buf, long len)
+err_position_0(char *buf, long len, const char *file, long line)
{
- ruby_set_current_source();
- if (!rb_sourcefile()) {
+ if (!file) {
return 0;
}
- else if (rb_sourceline() == 0) {
- return snprintf(buf, len, "%s: ", rb_sourcefile());
+ else if (line == 0) {
+ return snprintf(buf, len, "%s: ", file);
}
else {
- return snprintf(buf, len, "%s:%d: ", rb_sourcefile(), rb_sourceline());
+ return snprintf(buf, len, "%s:%d: ", file, line);
}
}
+static int
+err_position(char *buf, long len)
+{
+ return err_position_0(buf, len, rb_sourcefile(), rb_sourceline());
+}
+
+static int
+compile_position(char *buf, long len)
+{
+ ruby_set_current_source();
+ return err_position_0(buf, len, ruby_sourcefile, ruby_sourceline);
+}
+
static void
err_snprintf(char *buf, long len, const char *fmt, va_list args)
{
@@ -55,23 +67,29 @@ err_snprintf(char *buf, long len, const char *fmt, va_list args)
}
}
-static void err_append(const char*);
static void
-err_print(const char *fmt, va_list args)
+compile_snprintf(char *buf, long len, const char *fmt, va_list args)
{
- char buf[BUFSIZ];
+ long n;
- err_snprintf(buf, BUFSIZ, fmt, args);
- err_append(buf);
+ n = compile_position(buf, len);
+ if (len > n) {
+ vsnprintf((char*)buf+n, len-n, fmt, args);
+ }
}
+static void err_append(const char*);
+
void
rb_compile_error(const char *fmt, ...)
{
va_list args;
+ char buf[BUFSIZ];
+
va_start(args, fmt);
- err_print(fmt, args);
+ compile_snprintf(buf, BUFSIZ, fmt, args);
va_end(args);
+ err_append(buf);
ruby_nerrs++;
}
@@ -88,6 +106,49 @@ rb_compile_error_append(const char *fmt, ...)
}
static void
+compile_warn_print(const char *fmt, va_list args)
+{
+ char buf[BUFSIZ];
+ int len;
+
+ compile_snprintf(buf, BUFSIZ, fmt, args);
+ len = strlen(buf);
+ buf[len++] = '\n';
+ rb_write_error2(buf, len);
+}
+
+void
+rb_compile_warn(const char *fmt, ...)
+{
+ char buf[BUFSIZ];
+ va_list args;
+
+ if (NIL_P(ruby_verbose)) return;
+
+ snprintf(buf, BUFSIZ, "warning: %s", fmt);
+
+ va_start(args, fmt);
+ compile_warn_print(buf, args);
+ va_end(args);
+}
+
+/* rb_compile_warning() reports only in verbose mode */
+void
+rb_compile_warning(const char *fmt, ...)
+{
+ char buf[BUFSIZ];
+ va_list args;
+
+ if (!RTEST(ruby_verbose)) return;
+
+ snprintf(buf, BUFSIZ, "warning: %s", fmt);
+
+ va_start(args, fmt);
+ compile_warn_print(buf, args);
+ va_end(args);
+}
+
+static void
warn_print(const char *fmt, va_list args)
{
char buf[BUFSIZ];
@@ -1063,21 +1124,21 @@ rb_sys_fail(const char *mesg)
void
rb_sys_warning(const char *fmt, ...)
{
- char buf[BUFSIZ];
- va_list args;
- int errno_save;
-
- errno_save = errno;
-
- if (!RTEST(ruby_verbose)) return;
-
- snprintf(buf, BUFSIZ, "warning: %s", fmt);
- snprintf(buf+strlen(buf), BUFSIZ-strlen(buf), ": %s", strerror(errno_save));
-
- va_start(args, fmt);
- warn_print(buf, args);
- va_end(args);
- errno = errno_save;
+ char buf[BUFSIZ];
+ va_list args;
+ int errno_save;
+
+ errno_save = errno;
+
+ if (!RTEST(ruby_verbose)) return;
+
+ snprintf(buf, BUFSIZ, "warning: %s", fmt);
+ snprintf(buf+strlen(buf), BUFSIZ-strlen(buf), ": %s", strerror(errno_save));
+
+ va_start(args, fmt);
+ warn_print(buf, args);
+ va_end(args);
+ errno = errno_save;
}
void
diff --git a/parse.y b/parse.y
index d8da199539..12265a8b35 100644
--- a/parse.y
+++ b/parse.y
@@ -491,11 +491,11 @@ static VALUE ripper_id2sym(ID);
#endif
#ifndef RIPPER
-# define rb_warn0(fmt) rb_warn(fmt)
-# define rb_warnI(fmt,a) rb_warn(fmt,a)
-# define rb_warnS(fmt,a) rb_warn(fmt,a)
-# define rb_warning0(fmt) rb_warning(fmt)
-# define rb_warningS(fmt,a) rb_warning(fmt,a)
+# define rb_warn0(fmt) rb_compile_warn(fmt)
+# define rb_warnI(fmt,a) rb_compile_warn(fmt,a)
+# define rb_warnS(fmt,a) rb_compile_warn(fmt,a)
+# define rb_warning0(fmt) rb_compile_warning(fmt)
+# define rb_warningS(fmt,a) rb_compile_warning(fmt,a)
#else
# define rb_warn0(fmt) ripper_warn0(parser, fmt)
# define rb_warnI(fmt,a) ripper_warnI(parser, fmt, a)
@@ -735,7 +735,7 @@ bodystmt : compstmt
$$ = NEW_RESCUE($1, $2, $3);
}
else if ($3) {
- rb_warn("else without rescue is useless");
+ rb_warn0("else without rescue is useless");
$$ = block_append($$, $3);
}
if ($4) {
@@ -2231,7 +2231,7 @@ opt_call_args : none
call_args : command
{
- rb_warn("parenthesize argument(s) for future version");
+ rb_warn0("parenthesize argument(s) for future version");
/*%%%*/
$$ = NEW_LIST($1);
/*%
@@ -6927,7 +6927,7 @@ parser_warn(NODE *node, const char *mesg)
{
int line = ruby_sourceline;
ruby_sourceline = nd_line(node);
- rb_warn("%s", mesg);
+ rb_warnS("%s", mesg);
ruby_sourceline = line;
}
@@ -7547,7 +7547,7 @@ void_expr_gen(struct parser_params *parser, NODE *node)
int line = ruby_sourceline;
ruby_sourceline = nd_line(node);
- rb_warn("useless use of %s in void context", useless);
+ rb_warnS("useless use of %s in void context", useless);
ruby_sourceline = line;
}
}
@@ -7742,7 +7742,7 @@ cond0(struct parser_params *parser, NODE *node)
case NODE_DSTR:
case NODE_EVSTR:
case NODE_STR:
- rb_warn("string literal in condition");
+ rb_warn0("string literal in condition");
break;
case NODE_DREGX:
diff --git a/ruby.h b/ruby.h
index 99bc98d722..c54d445e58 100644
--- a/ruby.h
+++ b/ruby.h
@@ -650,10 +650,11 @@ NORETURN(void rb_notimplement(void));
/* reports if `-w' specified */
PRINTF_ARGS(void rb_warning(const char*, ...), 1, 2);
-/* reports if `-w' specified */
+PRINTF_ARGS(void rb_compile_warning(const char*, ...), 1, 2);
PRINTF_ARGS(void rb_sys_warning(const char*, ...), 1, 2);
/* reports always */
PRINTF_ARGS(void rb_warn(const char*, ...), 1, 2);
+PRINTF_ARGS(void rb_compile_warn(const char*, ...), 1, 2);
VALUE rb_each(VALUE);
VALUE rb_yield(VALUE);