aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-06-12 16:56:06 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-06-12 16:56:06 +0000
commit8db3dc39d60870e07cbdfec5e594e0f49b0733c7 (patch)
tree356b9a30124e0d1344837717aba71d50ed4b49f3
parent4169e76d14556864dca6bdef05d54f89651efc0b (diff)
downloadruby-8db3dc39d60870e07cbdfec5e594e0f49b0733c7.tar.gz
* signal.c (sigexit): call rb_thread_signal_exit() instead of
rb_exit(). [ruby-dev:26347] * eval.c (rb_thread_signal_exit): a new function to exit on main thread. * eval.c (rb_thread_switch): exit status should be retrieved from ruby_errinfo. * eval.c (rb_f_exit): ensure exit(0) should call exit(EXIT_SUCCESS). * missing/mkdir.c: remove. [ruby-core:05177] * hash.c (env_aset): do not treat nil as key-removing value. [ruby-list:40865] * parse.y (method_call): allow aref expression ([]) to take a block. * parse.y (block_dup_check): a function to check duplication of a block argument and an actual block. * lib/delegate.rb (SimpleDelegator::__setobj__): need check for recursive delegation. [ruby-core:04940] * lib/cgi.rb: add underscore aliases CGI::escape_html, CGI::unescape_html, CGI::escape_element, CGI::unescape_element. [ruby-core:05058] * misc/ruby-mode.el (ruby-expr-beg): fix looking point drift. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8613 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog47
-rw-r--r--configure.in2
-rw-r--r--eval.c39
-rw-r--r--ext/readline/readline.c3
-rw-r--r--hash.c23
-rw-r--r--intern.h1
-rw-r--r--lib/cgi.rb14
-rw-r--r--lib/delegate.rb2
-rw-r--r--misc/ruby-mode.el14
-rw-r--r--missing.h4
-rw-r--r--missing/mkdir.c104
-rw-r--r--parse.y60
-rw-r--r--signal.c3
13 files changed, 146 insertions, 170 deletions
diff --git a/ChangeLog b/ChangeLog
index 7072cb35ef..260960950e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,21 @@
+Mon Jun 13 01:54:20 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * signal.c (sigexit): call rb_thread_signal_exit() instead of
+ rb_exit(). [ruby-dev:26347]
+
+ * eval.c (rb_thread_signal_exit): a new function to exit on main
+ thread.
+
+ * eval.c (rb_thread_switch): exit status should be retrieved from
+ ruby_errinfo.
+
+ * eval.c (rb_f_exit): ensure exit(0) should call
+ exit(EXIT_SUCCESS).
+
Mon Jun 13 01:20:02 2005 Tanaka Akira <akr@m17n.org>
* eval.c (rb_gc_mark_threads): curr_thread may not be part of the
- thread list.
- [ruby-dev:26312]
+ thread list. [ruby-dev:26312]
Sat Jun 11 22:34:44 2005 Minero Aoki <aamine@loveruby.net>
@@ -13,6 +26,10 @@ Fri Jun 10 23:55:17 2005 Tanaka Akira <akr@m17n.org>
* eval.c (unknown_node): show more information. [ruby-dev:26196]
+Fri Jun 10 23:35:34 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * missing/mkdir.c: remove. [ruby-core:05177]
+
Fri Jun 10 22:54:18 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
* missing.h: fd_set stuffs need sys/types.h. fixed: [ruby-core:05179]
@@ -42,6 +59,32 @@ Thu Jun 9 18:24:16 2005 Tanaka Akira <akr@m17n.org>
* configure.in, eval.c, gc.c: use libunwind only on HP-UX.
[ruby-dev:26297]
+Thu Jun 9 14:46:32 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * hash.c (env_aset): do not treat nil as key-removing value.
+ [ruby-list:40865]
+
+ * parse.y (method_call): allow aref expression ([]) to take a
+ block.
+
+ * parse.y (block_dup_check): a function to check duplication of
+ a block argument and an actual block.
+
+Thu Jun 9 11:55:34 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * lib/delegate.rb (SimpleDelegator::__setobj__): need check for
+ recursive delegation. [ruby-core:04940]
+
+Thu Jun 9 11:50:43 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * lib/cgi.rb: add underscore aliases CGI::escape_html,
+ CGI::unescape_html, CGI::escape_element, CGI::unescape_element.
+ [ruby-core:05058]
+
+Wed Jun 8 18:47:10 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * misc/ruby-mode.el (ruby-expr-beg): fix looking point drift.
+
Wed Jun 8 12:25:59 2005 Yukihiro Matsumoto <matz@ruby-lang.org>
* array.c (rb_ary_nitems): add the block feature to Array#nitems.
diff --git a/configure.in b/configure.in
index 00e4eb0f1d..eab3a824ac 100644
--- a/configure.in
+++ b/configure.in
@@ -481,7 +481,7 @@ AC_TYPE_GETGROUPS
AC_TYPE_SIGNAL
AC_FUNC_ALLOCA
AC_FUNC_MEMCMP
-AC_REPLACE_FUNCS(dup2 memmove mkdir strcasecmp strncasecmp strerror strftime\
+AC_REPLACE_FUNCS(dup2 memmove strcasecmp strncasecmp strerror strftime\
strchr strstr strtoul crypt flock vsnprintf\
isnan finite isinf hypot acosh erf)
AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall chroot fsync getcwd\
diff --git a/eval.c b/eval.c
index ce82e6c8eb..0fbc538c74 100644
--- a/eval.c
+++ b/eval.c
@@ -1393,6 +1393,14 @@ static VALUE exception_error;
static VALUE sysstack_error;
static int
+sysexit_status(err)
+ VALUE err;
+{
+ VALUE st = rb_iv_get(err, "status");
+ return NUM2INT(st);
+}
+
+static int
error_handle(ex)
int ex;
{
@@ -1438,8 +1446,7 @@ error_handle(ex)
case TAG_RAISE:
case TAG_FATAL:
if (rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) {
- VALUE st = rb_iv_get(ruby_errinfo, "status");
- status = NUM2INT(st);
+ status = sysexit_status(ruby_errinfo);
}
else {
error_print();
@@ -4386,6 +4393,9 @@ rb_f_exit(argc, argv)
break;
default:
istatus = NUM2INT(status);
+#if EXIT_SUCCESS != 0
+ if (istatus == 0) istatus = EXIT_SUCCESS;
+#endif
break;
}
}
@@ -10383,8 +10393,7 @@ rb_thread_switch(n)
case RESTORE_EXIT:
ruby_errinfo = th_raise_exception;
ruby_current_node = th_raise_node;
- error_print();
- terminate_process(EXIT_FAILURE, 0, 0);
+ terminate_process(sysexit_status(ruby_errinfo), 0, 0);
break;
case RESTORE_NORMAL:
default:
@@ -12464,6 +12473,28 @@ rb_thread_trap_eval(cmd, sig, safe)
rb_thread_restore_context(curr_thread, RESTORE_TRAP);
}
+void
+rb_thread_signal_exit()
+{
+ VALUE args[2];
+
+ rb_thread_critical = 0;
+ if (curr_thread == main_thread) {
+ rb_thread_ready(curr_thread);
+ rb_exit(EXIT_SUCCESS);
+ }
+ args[0] = INT2NUM(EXIT_SUCCESS);
+ args[1] = rb_str_new2("exit");
+ rb_thread_ready(main_thread);
+ if (!rb_thread_dead(curr_thread)) {
+ if (THREAD_SAVE_CONTEXT(curr_thread)) {
+ return;
+ }
+ }
+ rb_thread_main_jump(rb_class_new_instance(2, args, rb_eSystemExit),
+ RESTORE_EXIT);
+}
+
static VALUE
rb_thread_raise(argc, argv, th)
int argc;
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index d5c2324d8e..970a4afa26 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -801,8 +801,7 @@ Init_readline()
#if defined HAVE_RL_LIBRARY_VERSION
rb_define_const(mReadline, "VERSION", rb_str_new2(rl_library_version));
#else
- rb_define_const(mReadline, "VERSION",
- rb_str_new2("2.0 or before version"));
+ rb_define_const(mReadline, "VERSION", rb_str_new2("2.0 or prior version"));
#endif
rl_attempted_completion_function = readline_attempted_completion_function;
diff --git a/hash.c b/hash.c
index d0c95720a8..88b060f11a 100644
--- a/hash.c
+++ b/hash.c
@@ -1826,17 +1826,17 @@ ruby_setenv(name, value)
}
if (!value) {
if (environ != origenviron) {
- char **envp = origenviron;
- while (*envp && *envp != environ[i]) envp++;
- if (!*envp)
- free(environ[i]);
+ char **envp = origenviron;
+ while (*envp && *envp != environ[i]) envp++;
+ if (!*envp)
+ free(environ[i]);
}
- while (environ[i]) {
- environ[i] = environ[i+1];
- i++;
+ while (environ[i]) {
+ environ[i] = environ[i+1];
+ i++;
+ }
+ return;
}
- return;
- }
if (!environ[i]) { /* does not exist yet */
REALLOC_N(environ, char*, i+2); /* just expand it a bit */
environ[i+1] = 0; /* make sure it's null terminated */
@@ -1878,11 +1878,6 @@ env_aset(obj, nm, val)
rb_raise(rb_eSecurityError, "can't change environment variable");
}
- if (NIL_P(val)) {
- env_delete(obj, nm);
- return Qnil;
- }
-
StringValue(nm);
StringValue(val);
name = RSTRING(nm)->ptr;
diff --git a/intern.h b/intern.h
index d4b5d8bff3..82b1349ecb 100644
--- a/intern.h
+++ b/intern.h
@@ -252,6 +252,7 @@ VALUE rb_thread_create _((VALUE (*)(ANYARGS), void*));
void rb_thread_interrupt _((void));
void rb_thread_trap_eval _((VALUE, int, int));
void rb_thread_signal_raise _((char*));
+void rb_thread_signal_exit _((void));
int rb_thread_select _((int, fd_set *, fd_set *, fd_set *, struct timeval *));
void rb_thread_wait_for _((struct timeval));
VALUE rb_thread_current _((void));
diff --git a/lib/cgi.rb b/lib/cgi.rb
index 22544d9059..bcc3dd9001 100644
--- a/lib/cgi.rb
+++ b/lib/cgi.rb
@@ -399,7 +399,12 @@ class CGI
end
end
end
-
+ def CGI::escape_html(str)
+ escapeHTML(str)
+ end
+ def CGI::unescape_html(str)
+ unescapeHTML(str)
+ end
# Escape only the tags of certain HTML elements in +string+.
#
@@ -445,7 +450,12 @@ class CGI
string
end
end
-
+ def CGI::escape_element(str)
+ escapeElement(str)
+ end
+ def CGI::unescape_element(str)
+ unescapeElement(str)
+ end
# Format a +Time+ object as a String using the format specified by RFC 1123.
#
diff --git a/lib/delegate.rb b/lib/delegate.rb
index bc200d212b..9c89a8cc1a 100644
--- a/lib/delegate.rb
+++ b/lib/delegate.rb
@@ -73,6 +73,7 @@ class SimpleDelegator<Delegator
end
def __setobj__(obj)
+ raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
@_sd_obj = obj
end
@@ -110,6 +111,7 @@ def DelegateClass(superclass)
@_dc_obj
end
def __setobj__(obj)
+ raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
@_dc_obj = obj
end
def clone
diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el
index 4a93054e99..87015bbf50 100644
--- a/misc/ruby-mode.el
+++ b/misc/ruby-mode.el
@@ -61,13 +61,13 @@
(defconst ruby-delimiter
(concat "[?$/%(){}#\"'`.:]\\|<<\\|\\[\\|\\]\\|\\<\\("
ruby-block-beg-re
- "\\>\\|" ruby-block-end-re
- "\\)\\|^=begin\\|" ruby-here-doc-beg-re)
+ "\\)\\>\\|" ruby-block-end-re
+ "\\|^=begin\\|" ruby-here-doc-beg-re)
)
(defconst ruby-negative
- (concat "^[ \t]*\\(\\(" ruby-block-mid-re "\\)\\>\\|\\("
- ruby-block-end-re "\\)\\|}\\|\\]\\)")
+ (concat "^[ \t]*\\(\\(" ruby-block-mid-re "\\)\\>\\|"
+ ruby-block-end-re "\\|}\\|\\]\\)")
)
(defconst ruby-operator-chars "-,.+*/%&|^~=<>:")
@@ -302,8 +302,8 @@ The variable ruby-indent-level controls the amount of indentation.
(defun ruby-expr-beg (&optional option)
(save-excursion
(store-match-data nil)
- (let ((start (point))
- (space (skip-chars-backward " \t")))
+ (let ((space (skip-chars-backward " \t"))
+ (start (point)))
(cond
((bolp) t)
((progn
@@ -327,7 +327,7 @@ The variable ruby-indent-level controls the amount of indentation.
"|" ruby-block-op-re
"|" ruby-block-mid-re "\\)\\>")))
(goto-char (match-end 0))
- (not (looking-at "\\s_")))
+ (not (looking-at "\\s_")))
((eq option 'expr-qstr)
(looking-at "[a-zA-Z][a-zA-z0-9_]* +%[^ \t]"))
((eq option 'expr-re)
diff --git a/missing.h b/missing.h
index ecd357ef7d..a4616950e3 100644
--- a/missing.h
+++ b/missing.h
@@ -84,10 +84,6 @@ extern int memcmp _((char *, char *, int));
extern void *memmove _((void *, void *, int));
#endif
-#ifndef HAVE_MKDIR
-extern int mkdir _((char *, int));
-#endif
-
/*
#ifndef HAVE_MODF
extern double modf _((double, double *));
diff --git a/missing/mkdir.c b/missing/mkdir.c
deleted file mode 100644
index ed1476db9a..0000000000
--- a/missing/mkdir.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Written by Robert Rother, Mariah Corporation, August 1985.
- *
- * If you want it, it's yours. All I ask in return is that if you
- * figure out how to do this in a Bourne Shell script you send me
- * a copy.
- * sdcsvax!rmr or rmr@uscd
- *
- * Severely hacked over by John Gilmore to make a 4.2BSD compatible
- * subroutine. 11Mar86; hoptoad!gnu
- *
- * Modified by rmtodd@uokmax 6-28-87 -- when making an already existing dir,
- * subroutine didn't return EEXIST. It does now.
- */
-
-#include <sys/stat.h>
-#include <errno.h>
-/*
- * Make a directory.
- */
-int
-mkdir (dpath, dmode)
- char *dpath;
- int dmode;
-{
- int cpid, status;
- struct stat statbuf;
-
- if (stat (dpath, &statbuf) == 0)
- {
- errno = EEXIST; /* Stat worked, so it already exists */
- return -1;
- }
-
- /* If stat fails for a reason other than non-existence, return error */
- if (errno != ENOENT)
- return -1;
-
- switch (cpid = fork ())
- {
-
- case -1: /* Error in fork() */
- return (-1); /* Errno is set already */
-
- case 0: /* Child process */
- /*
- * Cheap hack to set mode of new directory. Since this
- * child process is going away anyway, we zap its umask.
- * FIXME, this won't suffice to set SUID, SGID, etc. on this
- * directory. Does anybody care?
- */
- status = umask (0); /* Get current umask */
- status = umask (status | (0777 & ~dmode)); /* Set for mkdir */
- execl ("/bin/mkdir", "mkdir", dpath, (char *) 0);
- _exit (-1); /* Can't exec /bin/mkdir */
-
- default: /* Parent process */
- while (cpid != wait (&status)); /* Wait for kid to finish */
- }
-
- if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0)
- {
- errno = EIO; /* We don't know why, but */
- return -1; /* /bin/mkdir failed */
- }
-
- return 0;
-}
-
-int
-rmdir (dpath)
- char *dpath;
-{
- int cpid, status;
- struct stat statbuf;
-
- if (stat (dpath, &statbuf) != 0)
- {
- /* Stat just set errno. We don't have to */
- return -1;
- }
-
- switch (cpid = fork ())
- {
-
- case -1: /* Error in fork() */
- return (-1); /* Errno is set already */
-
- case 0: /* Child process */
- execl ("/bin/rmdir", "rmdir", dpath, (char *) 0);
- _exit (-1); /* Can't exec /bin/mkdir */
-
- default: /* Parent process */
- while (cpid != wait (&status)); /* Wait for kid to finish */
- }
-
- if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0)
- {
- errno = EIO; /* We don't know why, but */
- return -1; /* /bin/rmdir failed */
- }
-
- return 0;
-}
diff --git a/parse.y b/parse.y
index 238a1a5abf..0a193cbe57 100644
--- a/parse.y
+++ b/parse.y
@@ -230,6 +230,7 @@ static NODE *remove_begin _((NODE*));
static void void_stmts_gen _((struct parser_params*,NODE*));
#define void_stmts(node) void_stmts_gen(parser, node)
static void reduce_nodes _((NODE**));
+static void block_dup_check _((NODE*));
static NODE *block_append _((NODE*,NODE*));
static NODE *list_append _((NODE*,NODE*));
@@ -1136,9 +1137,7 @@ command : operation command_args %prec tLOWEST
/*%%%*/
$$ = new_fcall($1, $2);
if ($3) {
- if (nd_type($$) == NODE_BLOCK_PASS) {
- compile_error(PARSER_ARG "both block arg and actual block given");
- }
+ block_dup_check($$);
$3->nd_iter = $$;
$$ = $3;
}
@@ -1162,9 +1161,7 @@ command : operation command_args %prec tLOWEST
/*%%%*/
$$ = new_call($1, $3, $4);
if ($5) {
- if (nd_type($$) == NODE_BLOCK_PASS) {
- compile_error(PARSER_ARG "both block arg and actual block given");
- }
+ block_dup_check($$);
$5->nd_iter = $$;
$$ = $5;
}
@@ -1188,9 +1185,7 @@ command : operation command_args %prec tLOWEST
/*%%%*/
$$ = new_call($1, $3, $4);
if ($5) {
- if (nd_type($$) == NODE_BLOCK_PASS) {
- compile_error(PARSER_ARG "both block arg and actual block given");
- }
+ block_dup_check($$);
$5->nd_iter = $$;
$$ = $5;
}
@@ -2513,18 +2508,6 @@ primary : literal
$$ = dispatch1(topconst_ref, $2);
%*/
}
- | primary_value '[' aref_args ']'
- {
- /*%%%*/
- if ($1 && nd_type($1) == NODE_SELF)
- $$ = NEW_FCALL(tAREF, $3);
- else
- $$ = NEW_CALL($1, tAREF, $3);
- fixpos($$, $1);
- /*%
- $$ = dispatch2(aref, $1, $3);
- %*/
- }
| tLBRACK aref_args ']'
{
/*%%%*/
@@ -2626,9 +2609,7 @@ primary : literal
| method_call brace_block
{
/*%%%*/
- if ($1 && nd_type($1) == NODE_BLOCK_PASS) {
- compile_error(PARSER_ARG "both block arg and actual block given");
- }
+ block_dup_check($$);
$2->nd_iter = $1;
$$ = $2;
fixpos($$, $1);
@@ -3233,9 +3214,7 @@ do_block : kDO_BLOCK
block_call : command do_block
{
/*%%%*/
- if ($1 && nd_type($1) == NODE_BLOCK_PASS) {
- compile_error(PARSER_ARG "both block arg and actual block given");
- }
+ block_dup_check($1);
$2->nd_iter = $1;
$$ = $2;
fixpos($$, $1);
@@ -3328,6 +3307,18 @@ method_call : operation paren_args
$$ = method_optarg($$, $4);
%*/
}
+ | primary_value '[' aref_args ']'
+ {
+ /*%%%*/
+ if ($1 && nd_type($1) == NODE_SELF)
+ $$ = NEW_FCALL(tAREF, $3);
+ else
+ $$ = NEW_CALL($1, tAREF, $3);
+ fixpos($$, $1);
+ /*%
+ $$ = dispatch2(aref, $1, $3);
+ %*/
+ }
;
brace_block : '{'
@@ -6309,11 +6300,13 @@ parser_yylex(parser)
return kEND;
}
pushback(c);
- c = ';';
+ lex_state = EXPR_BEG;
command_start = Qtrue;
+ return ';';
+
case ',':
lex_state = EXPR_BEG;
- return c;
+ return ',';
case '~':
if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
@@ -7218,6 +7211,15 @@ aryset_gen(parser, recv, idx)
return NEW_ATTRASGN(recv, tASET, idx);
}
+static void
+block_dup_check(node)
+ NODE *node;
+{
+ if (node && nd_type(node) == NODE_BLOCK_PASS) {
+ compile_error(PARSER_ARG "both block arg and actual block given");
+ }
+}
+
ID
rb_id_attrset(id)
ID id;
diff --git a/signal.c b/signal.c
index 844adfc684..3cb49cc0f5 100644
--- a/signal.c
+++ b/signal.c
@@ -33,6 +33,7 @@ static struct signals {
char *signm;
int signo;
} siglist [] = {
+ {"EXIT", 0},
#ifdef SIGHUP
{"HUP", SIGHUP},
#endif
@@ -592,7 +593,7 @@ sigexit(sig)
}
#endif
- rb_exit(0);
+ rb_thread_signal_exit();
}
static VALUE