summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYukihiro Matsumoto <matz@ruby-lang.org>1994-12-20 00:46:19 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2019-08-17 22:09:31 +0900
commitbd0c733b77b561f4d12daccebf06a7c71917000b (patch)
tree748e0d92722709909a25523fc5e90e4aec687a23
parentb3f9ba5a3720de81a9a14d9d906509f81abeef7a (diff)
version 0.63v0_63
https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.63.tar.gz Tue Dec 20 00:46:19 1994 Yukihiro Matsumoto (matz@dyna) * 0.63 released * eval.c(rb_call): superの呼び出しで落ちる.argc, argvの設定を忘れ ていた. * parse.y(read_escape): 展開エラー. * variable.c: 定義済みの変数のhookを変更しないように.
-rw-r--r--C-IF8
-rw-r--r--ChangeLog20
-rw-r--r--Makefile.in1
-rw-r--r--eval.c15
-rw-r--r--object.c3
-rw-r--r--parse.y52
-rw-r--r--process.c437
-rw-r--r--sample/export.rb2
-rw-r--r--signal.c444
-rw-r--r--spec24
-rw-r--r--variable.c16
-rw-r--r--version.h4
12 files changed, 551 insertions, 475 deletions
diff --git a/C-IF b/C-IF
index 98d45925af..05f6edb638 100644
--- a/C-IF
+++ b/C-IF
@@ -53,11 +53,13 @@ Ruby-C 󥿡ե
ѿ
void rb_define_variable(char *name, VALUE *var,
- VALUE (*get_hook), VALUE (*set_hook)())
+ VALUE (*get_hook), VALUE (*set_hook)(), void *data)
RubyCȤǶͭ륰Хѿ. get_hookQnilǤʤ,
- ѿȤκݤget_hook˥åȤ줿ؿƤФ. set_hookQnil
- Ǥʤˤλset_hookƤФ.
+ ѿȤκݤget_hook˥åȤ줿ؿƤФ. set_hookQnil
+ Ǥʤˤλset_hookƤФ. hookؿˤѿ̾򼨤
+ ID(set hookξ翷ͤ)ȤȤdataͿǡȤ
+ Ϥ.
ѿ̾`$'ǻϤޤʤˤϼưŪɲä. ѿ̾Ȥruby
̻ҤȤƵʤʸ(㤨` ')ޤˤrubyץफ
diff --git a/ChangeLog b/ChangeLog
index dfa5c85f51..01c06993e6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,25 @@
+Tue Dec 20 00:46:19 1994 Yukihiro Matsumoto (matz@dyna)
+
+ * 0.63 released
+
+ * eval.c(rb_call): superθƤӽФ롥argc, argv˺
+ Ƥ
+
+ * parse.y(read_escape): Ÿ顼
+
+ * variable.c: Ѥߤѿhookѹʤ褦ˡ
+
Mon Dec 19 12:01:10 1994 Yukihiro Matsumoto (matz@ix-02)
+ * parse.y(cond): P֤줿硤`-v'ץǷ
+ 𤬽Ф褦ˡ
+
+ * parse.y(**): Ѿ黻`**'̤ͥñ黻Ҥ⤯
+
+ * parse.y(and,or): ̤ͥ㤤黻`and', `or'.
+
+ * 0.62 released.
+
* eval.c: ɬפˤʤäPUSH_ENV, POP_ENV򸺤餷
* env.h: ENVIONselfϤPUSH_ENVsuperνΤ
diff --git a/Makefile.in b/Makefile.in
index a63ee53af8..6b4543d4bf 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -70,6 +70,7 @@ OBJS = array.o \
re.o \
regex.o \
ruby.o \
+ signal.o \
socket.o \
sprintf.o \
st.o \
diff --git a/eval.c b/eval.c
index e40d78121f..952d8c2f7d 100644
--- a/eval.c
+++ b/eval.c
@@ -3,7 +3,7 @@
eval.c -
$Author: matz $
- $Date: 1994/12/19 08:39:17 $
+ $Date: 1994/12/20 05:07:05 $
created at: Thu Jun 10 14:22:17 JST 1993
Copyright (C) 1994 Yukihiro Matsumoto
@@ -548,7 +548,6 @@ rb_eval(node)
sourceline = node->line;
-#undef SAFE_SIGHANDLE
#ifdef SAFE_SIGHANDLE
{
extern int trap_pending;
@@ -1612,6 +1611,8 @@ rb_call(class, recv, mid, argc, argv, func, itr)
else {
the_env->arg_ary = Qnil;
}
+ the_env->argc = argc;
+ the_env->argv = argv;
if (nd_type(body) == NODE_CFUNC) {
int len = body->nd_argc;
@@ -2109,8 +2110,10 @@ Sblk_new(class)
if (!iterator_p() && !Fiterator_p()) {
Fail("tryed to create Block out of iterator");
}
+
if (the_block->block) return the_block->block;
- blk = obj_alloc(C_Block);
+ blk = obj_alloc(class);
+
Make_Data_Struct(blk, blkdata, struct BLOCK, Qnil, blk_free, data);
memcpy(data, the_block, sizeof(struct BLOCK));
scope = the_scope;
@@ -2141,6 +2144,12 @@ Sblk_new(class)
return blk;
}
+VALUE
+blk_new()
+{
+ return Sblk_new(C_Block);
+}
+
static VALUE
Fblk_do(blk, args)
VALUE blk, args;
diff --git a/object.c b/object.c
index 4fa7f109b0..21c71abd1b 100644
--- a/object.c
+++ b/object.c
@@ -3,7 +3,7 @@
object.c -
$Author: matz $
- $Date: 1994/12/19 08:30:07 $
+ $Date: 1994/12/20 05:01:01 $
created at: Thu Jul 15 12:01:24 JST 1993
Copyright (C) 1994 Yukihiro Matsumoto
@@ -424,6 +424,7 @@ Init_Object()
rb_define_method(C_Kernel, "_inspect", Fkrn_inspect, 0);
rb_define_private_method(C_Kernel, "defined", Fdefined, 1);
+
rb_define_private_method(C_Kernel, "sprintf", Fsprintf, -1);
rb_define_alias(C_Kernel, "format", "sprintf");
diff --git a/parse.y b/parse.y
index ec5030f1f1..4c8ef397de 100644
--- a/parse.y
+++ b/parse.y
@@ -3,7 +3,7 @@
parse.y -
$Author: matz $
- $Date: 1994/12/19 08:30:08 $
+ $Date: 1994/12/20 05:07:09 $
created at: Fri May 28 18:02:42 JST 1993
Copyright (C) 1994 Yukihiro Matsumoto
@@ -115,6 +115,8 @@ static void setup_top_local();
RETRY
SELF
NIL
+ AND
+ OR
_FILE_
_LINE_
IF_MOD
@@ -144,7 +146,7 @@ static void setup_top_local();
%token NEQ /* != <> */
%token GEQ /* >= */
%token LEQ /* <= */
-%token AND OR /* && and || */
+%token ANDOP OROP /* && and || */
%token MATCH NMATCH /* =~ and !~ */
%token DOT2 DOT3 /* .. and ... */
%token AREF ASET /* [] and []= */
@@ -158,12 +160,14 @@ static void setup_top_local();
* precedence table
*/
+%left OR
+%left AND
%left YIELD RETURN FAIL
%right '=' OP_ASGN
%right COLON2
%nonassoc DOT2 DOT3
-%left OR
-%left AND
+%left OROP
+%left ANDOP
%nonassoc CMP EQ NEQ MATCH NMATCH
%left '>' GEQ '<' LEQ
%left '|' '^'
@@ -171,8 +175,8 @@ static void setup_top_local();
%left LSHFT RSHFT
%left '+' '-'
%left '*' '/' '%'
-%right POW
%right '!' '~' UPLUS UMINUS
+%right POW
%token LAST_TOKEN
@@ -297,6 +301,14 @@ stmt : CLASS IDENTIFIER superclass
{
$$ = NEW_UNTIL2(cond($3), $1);
}
+ | stmt AND stmt
+ {
+ $$ = NEW_AND(cond($1), cond($3));
+ }
+ | stmt OR stmt
+ {
+ $$ = NEW_OR(cond($1), cond($3));
+ }
| stmt0
stmt0 : mlhs '=' args2
@@ -753,11 +765,11 @@ expr : variable '=' expr
{
$$ = call_op($1, COLON2, 1, $3);
}
- | expr AND expr
+ | expr ANDOP expr
{
$$ = NEW_AND(cond($1), cond($3));
}
- | expr OR expr
+ | expr OROP expr
{
$$ = NEW_OR(cond($1), cond($3));
}
@@ -1335,6 +1347,7 @@ static struct kwtable {
"__END__", 0, EXPR_BEG,
"__FILE__", _FILE_, EXPR_END,
"__LINE__", _LINE_, EXPR_END,
+ "and", AND, EXPR_BEG,
"break", BREAK, EXPR_END,
"case", CASE, EXPR_BEG,
"class", CLASS, EXPR_BEG,
@@ -1351,6 +1364,7 @@ static struct kwtable {
"include", INCLUDE, EXPR_BEG,
"module", MODULE, EXPR_BEG,
"nil", NIL, EXPR_END,
+ "or", OR, EXPR_BEG,
"protect", PROTECT, EXPR_BEG,
"redo", REDO, EXPR_END,
"resque", RESQUE, EXPR_BEG,
@@ -1556,7 +1570,7 @@ retry:
case '&':
lex_state = EXPR_BEG;
if ((c = nextc()) == '&') {
- return AND;
+ return ANDOP;
}
else if (c == '=') {
yylval.id = '&';
@@ -1568,7 +1582,7 @@ retry:
case '|':
lex_state = EXPR_BEG;
if ((c = nextc()) == '|') {
- return OR;
+ return OROP;
}
else if (c == '=') {
yylval.id = '|';
@@ -2080,7 +2094,7 @@ read_escape(flag)
break;
case 'f': /* form-feed */
- tokadd('\r');
+ tokadd('\f');
break;
case 'v': /* vertical tab */
@@ -2088,7 +2102,7 @@ read_escape(flag)
break;
case 'a': /* alarm(bell) */
- tokadd('\1');
+ tokadd('\007');
break;
case 'e': /* escape */
@@ -2149,11 +2163,10 @@ read_escape(flag)
case 'x': /* hex constant */
{
- register int i = c - '0';
+ register int i = 0;
register int count = 0;
- while (++count < 2) {
- c = nextc();
+ while (++count < 3) {
if ((c = nextc()) >= '0' && c <= '9') {
i *= 16;
i += c - '0';
@@ -2526,6 +2539,17 @@ cond(node)
enum node_type type = nd_type(node);
value_expr(node);
+ switch (type) {
+ case NODE_MASGN:
+ case NODE_LASGN:
+ case NODE_GASGN:
+ case NODE_IASGN:
+ case NODE_CASGN:
+ if (verbose) {
+ Warning("asignment in condition");
+ }
+ break;
+ }
node = cond0(node);
if (type == NODE_CALL && node->nd_mid == '!') {
diff --git a/process.c b/process.c
index e0eb41965c..375ca640ec 100644
--- a/process.c
+++ b/process.c
@@ -3,7 +3,7 @@
process.c -
$Author: matz $
- $Date: 1994/12/19 08:30:10 $
+ $Date: 1994/12/20 05:07:11 $
created at: Tue Aug 10 14:30:50 JST 1993
Copyright (C) 1994 Yukihiro Matsumoto
@@ -255,437 +255,6 @@ Fsystem(obj, str)
return status;
}
-static struct signals {
- char *signm;
- int signo;
-} siglist [] = {
-#ifdef SIGHUP
- "HUP", SIGHUP,
-#endif
-#ifdef SIGINT
- "INT", SIGINT,
-#endif
-#ifdef SIGQUIT
- "QUIT", SIGQUIT,
-#endif
-#ifdef SIGILL
- "ILL", SIGILL,
-#endif
-#ifdef SIGTRAP
- "TRAP", SIGTRAP,
-#endif
-#ifdef SIGIOT
- "IOT", SIGIOT,
-#endif
-#ifdef SIGABRT
- "ABRT", SIGABRT,
-#endif
-#ifdef SIGEMT
- "EMT", SIGEMT,
-#endif
-#ifdef SIGFPE
- "FPE", SIGFPE,
-#endif
-#ifdef SIGKILL
- "KILL", SIGKILL,
-#endif
-#ifdef SIGBUS
- "BUS", SIGBUS,
-#endif
-#ifdef SIGSEGV
- "SEGV", SIGSEGV,
-#endif
-#ifdef SIGSYS
- "SYS", SIGSYS,
-#endif
-#ifdef SIGPIPE
- "PIPE", SIGPIPE,
-#endif
-#ifdef SIGALRM
- "ALRM", SIGALRM,
-#endif
-#ifdef SIGTERM
- "TERM", SIGTERM,
-#endif
-#ifdef SIGURG
- "URG", SIGURG,
-#endif
-#ifdef SIGSTOP
- "STOP", SIGSTOP,
-#endif
-#ifdef SIGTSTP
- "TSTP", SIGTSTP,
-#endif
-#ifdef SIGCONT
- "CONT", SIGCONT,
-#endif
-#ifdef SIGCHLD
- "CHLD", SIGCHLD,
-#endif
-#ifdef SIGCLD
- "CLD", SIGCLD,
-#else
-# ifdef SIGCHLD
- "CLD", SIGCHLD,
-# endif
-#endif
-#ifdef SIGTTIN
- "TTIN", SIGTTIN,
-#endif
-#ifdef SIGTTOU
- "TTOU", SIGTTOU,
-#endif
-#ifdef SIGIO
- "IO", SIGIO,
-#endif
-#ifdef SIGXCPU
- "XCPU", SIGXCPU,
-#endif
-#ifdef SIGXFSZ
- "XFSZ", SIGXFSZ,
-#endif
-#ifdef SIGVTALRM
- "VTALRM", SIGVTALRM,
-#endif
-#ifdef SIGPROF
- "PROF", SIGPROF,
-#endif
-#ifdef SIGWINCH
- "WINCH", SIGWINCH,
-#endif
-#ifdef SIGUSR1
- "USR1", SIGUSR1,
-#endif
-#ifdef SIGUSR2
- "USR2", SIGUSR2,
-#endif
-#ifdef SIGLOST
- "LOST", SIGLOST,
-#endif
-#ifdef SIGMSG
- "MSG", SIGMSG,
-#endif
-#ifdef SIGPWR
- "PWR", SIGPWR,
-#endif
-#ifdef SIGPOLL
- "POLL", SIGPOLL,
-#endif
-#ifdef SIGDANGER
- "DANGER", SIGDANGER,
-#endif
-#ifdef SIGMIGRATE
- "MIGRATE", SIGMIGRATE,
-#endif
-#ifdef SIGPRE
- "PRE", SIGPRE,
-#endif
-#ifdef SIGGRANT
- "GRANT", SIGGRANT,
-#endif
-#ifdef SIGRETRACT
- "RETRACT", SIGRETRACT,
-#endif
-#ifdef SIGSOUND
- "SOUND", SIGSOUND,
-#endif
- NULL, 0,
-};
-
-static int
-signm2signo(nm)
- char *nm;
-{
- struct signals *sigs;
-
- for (sigs = siglist; sigs->signm; sigs++)
- if (strcmp(sigs->signm, nm) == 0)
- return sigs->signo;
- return 0;
-}
-
-static VALUE
-Fkill(argc, argv)
- int argc;
- VALUE *argv;
-{
- int sig;
- int i;
-
- if (argc < 2)
- Fail("wrong # of arguments -- kill(sig, pid...)");
- switch (TYPE(argv[0])) {
- case T_FIXNUM:
- sig = FIX2UINT(argv[0]);
- break;
-
- case T_STRING:
- {
- int negative = 0;
-
- char *s = RSTRING(argv[0])->ptr;
- if (*s == '-') {
- negative++;
- s++;
- }
- if (strncmp("SIG", s, 3) == 0)
- s += 3;
- if((sig = signm2signo(s)) == 0)
- Fail("Unrecognized signal name `%s'", s);
-
- if (negative)
- sig = -sig;
- }
- break;
-
- default:
- Fail("bad signal type %s", rb_class2name(CLASS_OF(argv[0])));
- break;
- }
-
- if (sig < 0) {
- sig = -sig;
- for (i=1; i<argc; i++) {
- int pid = NUM2INT(argv[i]);
-#ifdef HAS_KILLPG
- if (killpg(pid, sig) < 0)
-#else
- if (kill(-pid, sig) < 0)
-#endif
- rb_sys_fail(Qnil);
- }
- }
- else {
- for (i=1; i<argc; i++) {
- Check_Type(argv[i], T_FIXNUM);
- if (kill(FIX2UINT(argv[i]), sig) < 0)
- rb_sys_fail(Qnil);
- }
- }
- return INT2FIX(i-1);
-}
-
-static VALUE trap_list[NSIG];
-#ifdef SAFE_SIGHANDLE
-static int trap_pending_list[NSIG];
-int trap_pending;
-static int trap_immediate;
-#endif
-
-void
-gc_mark_trap_list()
-{
- int i;
-
- for (i=0; i<NSIG; i++) {
- if (trap_list[i])
- gc_mark(trap_list[i]);
- }
-}
-
-static RETSIGTYPE
-sighandle(sig)
- int sig;
-{
- if (sig >= NSIG || trap_list[sig] == Qnil)
- Fail("trap_handler: Bad signal %d", sig);
-
-#ifndef HAVE_BSD_SIGNALS
- signal(sig, sighandle);
-#endif
-
-#ifdef SAFE_SIGHANDLE
- if (trap_immediate)
- rb_trap_eval(trap_list[sig]);
- else {
- trap_pending++;
- trap_pending_list[sig]++;
- }
-#else
- rb_trap_eval(trap_list[sig]);
-#endif
-}
-
-void
-rb_trap_exit()
-{
- if (trap_list[0])
- rb_trap_eval(trap_list[0]);
-}
-
-#if defined(SAFE_SIGHANDLE)
-rb_trap_exec()
-{
- int i;
-
- trap_pending = 0;
- for (i=0; i<NSIG; i++) {
- if (trap_pending_list[i]) {
- trap_pending_list[i] = 0;
- rb_trap_eval(trap_list[i]);
- }
- }
-}
-
-#if defined(HAVE_SYSCALL) && defined(HAVE_SYSCALL_H)
-#include <syscall.h>
-
-#ifdef SYS_read
-int
-read(fd, buf, nbytes)
- int fd, nbytes;
- char *buf;
-{
- int res;
-
- trap_immediate++;
- res = syscall(SYS_read, fd, buf, nbytes);
- trap_immediate = 0;
- return res;
-}
-#endif /* SYS_read */
-
-#ifdef SYS_wait
-int
-wait(status)
- union wait *status;
-{
- int res;
-
- trap_immediate++;
- res = syscall(SYS_wait, status);
- trap_immediate =0;
- return res;
-}
-#endif /* SYS_wait */
-
-#ifdef SYS_sigpause
-int
-sigpause(mask)
- int mask;
-{
- int res;
-
- trap_immediate++;
- res = syscall(SYS_sigpause, mask);
- trap_immediate =0;
- return res;
-}
-#endif /* SYS_sigpause */
-
-/* linux syscall(select) doesn't work file. */
-#if defined(SYS_select) && !defined(linux)
-#include <sys/types.h>
-
-int
-select(nfds, readfds, writefds, exceptfds, timeout)
- int nfds;
- fd_set *readfds, *writefds, *exceptfds;
- struct timeval *timeout;
-{
- int res;
-
- trap_immediate++;
- res = syscall(SYS_select, nfds, readfds, writefds, exceptfds, timeout);
- trap_immediate =0;
- return res;
-}
-#endif /* SYS_select */
-
-#endif /* HAVE_SYSCALL_H */
-#endif /* SAFE_SIGHANDLE */
-
-static VALUE
-Ftrap(argc, argv)
- int argc;
- VALUE *argv;
-{
- RETSIGTYPE (*func)();
- VALUE command;
- int i, sig;
-#ifdef HAVE_SIGPROCMASK
- sigset_t mask;
-#else
- int mask;
-#endif
-
- if (argc < 2)
- Fail("wrong # of arguments -- kill(cmd, sig...)");
-
- /* disable interrupt */
-#ifdef HAVE_SIGPROCMASK
- sigfillset(&mask);
- sigprocmask(SIG_BLOCK, &mask, &mask);
-#else
- mask = sigblock(~0);
-#endif
-
- func = sighandle;
-
- if (argv[0] == Qnil) {
- func = SIG_IGN;
- command = Qnil;
- }
- else {
- Check_Type(argv[0], T_STRING);
- command = argv[0];
- if (RSTRING(argv[0])->len == 0) {
- func = SIG_IGN;
- }
- else if (RSTRING(argv[0])->len == 7) {
- if (strncmp(RSTRING(argv[0])->ptr, "SIG_IGN", 7) == 0) {
- func = SIG_IGN;
- }
- else if (strncmp(RSTRING(argv[0])->ptr, "SIG_DFL", 7) == 0) {
- func = SIG_DFL;
- }
- else if (strncmp(RSTRING(argv[0])->ptr, "DEFAULT", 7) == 0) {
- func = SIG_DFL;
- }
- }
- else if (RSTRING(argv[0])->len == 6) {
- if (strncmp(RSTRING(argv[0])->ptr, "IGNORE", 6) == 0) {
- func = SIG_IGN;
- }
- }
- }
- if (func == SIG_IGN || func == SIG_DFL)
- command = Qnil;
-
- for (i=1; i<argc; i++) {
- if (TYPE(argv[i]) == T_STRING) {
- char *s = RSTRING(argv[i])->ptr;
-
- if (strncmp("SIG", s, 3) == 0)
- s += 3;
- sig = signm2signo(s);
- if (sig == 0 && strcmp(s, "EXIT") != 0)
- Fail("Invalid signal SIG%s", s);
- }
- else {
- sig = NUM2INT(argv[i]);
- }
- if (sig < 0 || sig > NSIG)
- Fail("Invalid signal no %d", sig);
-
- signal(sig, sighandle);
- trap_list[sig] = command;
- /* enable at least specified signal. */
-#ifdef HAVE_SIGPROCMASK
- sigdelset(&mask, sig);
-#else
- mask &= ~sigmask(sig);
-#endif
- }
- /* disable interrupt */
-#ifdef HAVE_SIGPROCMASK
- sigprocmask(SIG_SETMASK, &mask, NULL);
-#else
- sigsetmask(mask);
-#endif
- return Qnil;
-}
-
Fsleep(argc, argv)
int argc;
VALUE *argv;
@@ -901,6 +470,8 @@ Fproc_setegid(obj, egid)
VALUE rb_readonly_hook();
VALUE M_Process;
+extern VALUE Fkill();
+
Init_process()
{
extern VALUE C_Kernel;
@@ -913,8 +484,6 @@ Init_process()
rb_define_private_method(C_Kernel, "wait", Fwait, 0);
rb_define_private_method(C_Kernel, "waitpid", Fwaitpid, 2);
rb_define_private_method(C_Kernel, "system", Fsystem, 1);
- rb_define_private_method(C_Kernel, "kill", Fkill, -1);
- rb_define_private_method(C_Kernel, "trap", Ftrap, -1);
rb_define_private_method(C_Kernel, "sleep", Fsleep, -1);
M_Process = rb_define_module("Process");
diff --git a/sample/export.rb b/sample/export.rb
index 4046a7ec49..be7b6bc797 100644
--- a/sample/export.rb
+++ b/sample/export.rb
@@ -1,4 +1,4 @@
-# methods access permission
+# method access permission
# output:
# foobar
# foo
diff --git a/signal.c b/signal.c
new file mode 100644
index 0000000000..0131941a5d
--- /dev/null
+++ b/signal.c
@@ -0,0 +1,444 @@
+/************************************************
+
+ signal.c -
+
+ $Author: matz $
+ $Date: 1994/12/20 05:15:42 $
+ created at: Tue Dec 20 10:13:44 JST 1994
+
+************************************************/
+
+#include "ruby.h"
+#include <signal.h>
+#include <stdio.h>
+
+static struct signals {
+ char *signm;
+ int signo;
+} siglist [] = {
+#ifdef SIGHUP
+ "HUP", SIGHUP,
+#endif
+#ifdef SIGINT
+ "INT", SIGINT,
+#endif
+#ifdef SIGQUIT
+ "QUIT", SIGQUIT,
+#endif
+#ifdef SIGILL
+ "ILL", SIGILL,
+#endif
+#ifdef SIGTRAP
+ "TRAP", SIGTRAP,
+#endif
+#ifdef SIGIOT
+ "IOT", SIGIOT,
+#endif
+#ifdef SIGABRT
+ "ABRT", SIGABRT,
+#endif
+#ifdef SIGEMT
+ "EMT", SIGEMT,
+#endif
+#ifdef SIGFPE
+ "FPE", SIGFPE,
+#endif
+#ifdef SIGKILL
+ "KILL", SIGKILL,
+#endif
+#ifdef SIGBUS
+ "BUS", SIGBUS,
+#endif
+#ifdef SIGSEGV
+ "SEGV", SIGSEGV,
+#endif
+#ifdef SIGSYS
+ "SYS", SIGSYS,
+#endif
+#ifdef SIGPIPE
+ "PIPE", SIGPIPE,
+#endif
+#ifdef SIGALRM
+ "ALRM", SIGALRM,
+#endif
+#ifdef SIGTERM
+ "TERM", SIGTERM,
+#endif
+#ifdef SIGURG
+ "URG", SIGURG,
+#endif
+#ifdef SIGSTOP
+ "STOP", SIGSTOP,
+#endif
+#ifdef SIGTSTP
+ "TSTP", SIGTSTP,
+#endif
+#ifdef SIGCONT
+ "CONT", SIGCONT,
+#endif
+#ifdef SIGCHLD
+ "CHLD", SIGCHLD,
+#endif
+#ifdef SIGCLD
+ "CLD", SIGCLD,
+#else
+# ifdef SIGCHLD
+ "CLD", SIGCHLD,
+# endif
+#endif
+#ifdef SIGTTIN
+ "TTIN", SIGTTIN,
+#endif
+#ifdef SIGTTOU
+ "TTOU", SIGTTOU,
+#endif
+#ifdef SIGIO
+ "IO", SIGIO,
+#endif
+#ifdef SIGXCPU
+ "XCPU", SIGXCPU,
+#endif
+#ifdef SIGXFSZ
+ "XFSZ", SIGXFSZ,
+#endif
+#ifdef SIGVTALRM
+ "VTALRM", SIGVTALRM,
+#endif
+#ifdef SIGPROF
+ "PROF", SIGPROF,
+#endif
+#ifdef SIGWINCH
+ "WINCH", SIGWINCH,
+#endif
+#ifdef SIGUSR1
+ "USR1", SIGUSR1,
+#endif
+#ifdef SIGUSR2
+ "USR2", SIGUSR2,
+#endif
+#ifdef SIGLOST
+ "LOST", SIGLOST,
+#endif
+#ifdef SIGMSG
+ "MSG", SIGMSG,
+#endif
+#ifdef SIGPWR
+ "PWR", SIGPWR,
+#endif
+#ifdef SIGPOLL
+ "POLL", SIGPOLL,
+#endif
+#ifdef SIGDANGER
+ "DANGER", SIGDANGER,
+#endif
+#ifdef SIGMIGRATE
+ "MIGRATE", SIGMIGRATE,
+#endif
+#ifdef SIGPRE
+ "PRE", SIGPRE,
+#endif
+#ifdef SIGGRANT
+ "GRANT", SIGGRANT,
+#endif
+#ifdef SIGRETRACT
+ "RETRACT", SIGRETRACT,
+#endif
+#ifdef SIGSOUND
+ "SOUND", SIGSOUND,
+#endif
+ NULL, 0,
+};
+
+static int
+signm2signo(nm)
+ char *nm;
+{
+ struct signals *sigs;
+
+ for (sigs = siglist; sigs->signm; sigs++)
+ if (strcmp(sigs->signm, nm) == 0)
+ return sigs->signo;
+ return 0;
+}
+
+VALUE
+Fkill(argc, argv)
+ int argc;
+ VALUE *argv;
+{
+ int sig;
+ int i;
+
+ if (argc < 2)
+ Fail("wrong # of arguments -- kill(sig, pid...)");
+ switch (TYPE(argv[0])) {
+ case T_FIXNUM:
+ sig = FIX2UINT(argv[0]);
+ break;
+
+ case T_STRING:
+ {
+ int negative = 0;
+
+ char *s = RSTRING(argv[0])->ptr;
+ if (*s == '-') {
+ negative++;
+ s++;
+ }
+ if (strncmp("SIG", s, 3) == 0)
+ s += 3;
+ if((sig = signm2signo(s)) == 0)
+ Fail("Unrecognized signal name `%s'", s);
+
+ if (negative)
+ sig = -sig;
+ }
+ break;
+
+ default:
+ Fail("bad signal type %s", rb_class2name(CLASS_OF(argv[0])));
+ break;
+ }
+
+ if (sig < 0) {
+ sig = -sig;
+ for (i=1; i<argc; i++) {
+ int pid = NUM2INT(argv[i]);
+#ifdef HAS_KILLPG
+ if (killpg(pid, sig) < 0)
+#else
+ if (kill(-pid, sig) < 0)
+#endif
+ rb_sys_fail(Qnil);
+ }
+ }
+ else {
+ for (i=1; i<argc; i++) {
+ Check_Type(argv[i], T_FIXNUM);
+ if (kill(FIX2UINT(argv[i]), sig) < 0)
+ rb_sys_fail(Qnil);
+ }
+ }
+ return INT2FIX(i-1);
+}
+
+static VALUE trap_list[NSIG];
+#ifdef SAFE_SIGHANDLE
+static int trap_pending_list[NSIG];
+int trap_pending;
+static int trap_immediate;
+#endif
+
+void
+gc_mark_trap_list()
+{
+ int i;
+
+ for (i=0; i<NSIG; i++) {
+ if (trap_list[i])
+ gc_mark(trap_list[i]);
+ }
+}
+
+static RETSIGTYPE
+sighandle(sig)
+ int sig;
+{
+ if (sig >= NSIG || trap_list[sig] == Qnil)
+ Fail("trap_handler: Bad signal %d", sig);
+
+#ifndef HAVE_BSD_SIGNALS
+ signal(sig, sighandle);
+#endif
+
+#ifdef SAFE_SIGHANDLE
+ if (trap_immediate)
+ rb_trap_eval(trap_list[sig]);
+ else {
+ trap_pending++;
+ trap_pending_list[sig]++;
+ }
+#else
+ rb_trap_eval(trap_list[sig]);
+#endif
+}
+
+void
+rb_trap_exit()
+{
+ if (trap_list[0])
+ rb_trap_eval(trap_list[0]);
+}
+
+#if defined(SAFE_SIGHANDLE)
+rb_trap_exec()
+{
+ int i;
+
+ trap_pending = 0;
+ for (i=0; i<NSIG; i++) {
+ if (trap_pending_list[i]) {
+ trap_pending_list[i] = 0;
+ rb_trap_eval(trap_list[i]);
+ }
+ }
+}
+
+#if defined(HAVE_SYSCALL) && defined(HAVE_SYSCALL_H)
+#include <syscall.h>
+
+#ifdef SYS_read
+int
+read(fd, buf, nbytes)
+ int fd, nbytes;
+ char *buf;
+{
+ int res;
+
+ trap_immediate++;
+ res = syscall(SYS_read, fd, buf, nbytes);
+ trap_immediate = 0;
+ return res;
+}
+#endif /* SYS_read */
+
+#ifdef SYS_wait
+int
+wait(status)
+ union wait *status;
+{
+ int res;
+
+ trap_immediate++;
+ res = syscall(SYS_wait, status);
+ trap_immediate =0;
+ return res;
+}
+#endif /* SYS_wait */
+
+#ifdef SYS_sigpause
+int
+sigpause(mask)
+ int mask;
+{
+ int res;
+
+ trap_immediate++;
+ res = syscall(SYS_sigpause, mask);
+ trap_immediate =0;
+ return res;
+}
+#endif /* SYS_sigpause */
+
+/* linux syscall(select) doesn't work file. */
+#if defined(SYS_select) && !defined(linux)
+#include <sys/types.h>
+
+int
+select(nfds, readfds, writefds, exceptfds, timeout)
+ int nfds;
+ fd_set *readfds, *writefds, *exceptfds;
+ struct timeval *timeout;
+{
+ int res;
+
+ trap_immediate++;
+ res = syscall(SYS_select, nfds, readfds, writefds, exceptfds, timeout);
+ trap_immediate =0;
+ return res;
+}
+#endif /* SYS_select */
+
+#endif /* HAVE_SYSCALL_H */
+#endif /* SAFE_SIGHANDLE */
+
+static VALUE
+Ftrap(argc, argv)
+ int argc;
+ VALUE *argv;
+{
+ RETSIGTYPE (*func)();
+ VALUE command;
+ int i, sig;
+#ifdef HAVE_SIGPROCMASK
+ sigset_t mask;
+#else
+ int mask;
+#endif
+
+ if (argc < 2)
+ Fail("wrong # of arguments -- kill(cmd, sig...)");
+
+ /* disable interrupt */
+#ifdef HAVE_SIGPROCMASK
+ sigfillset(&mask);
+ sigprocmask(SIG_BLOCK, &mask, &mask);
+#else
+ mask = sigblock(~0);
+#endif
+
+ func = sighandle;
+
+ if (argv[0] == Qnil) {
+ func = SIG_IGN;
+ command = Qnil;
+ }
+ else {
+ Check_Type(argv[0], T_STRING);
+ command = argv[0];
+ if (RSTRING(argv[0])->len == 0) {
+ func = SIG_IGN;
+ }
+ else if (RSTRING(argv[0])->len == 7) {
+ if (strncmp(RSTRING(argv[0])->ptr, "SIG_IGN", 7) == 0) {
+ func = SIG_IGN;
+ }
+ else if (strncmp(RSTRING(argv[0])->ptr, "SIG_DFL", 7) == 0) {
+ func = SIG_DFL;
+ }
+ else if (strncmp(RSTRING(argv[0])->ptr, "DEFAULT", 7) == 0) {
+ func = SIG_DFL;
+ }
+ }
+ else if (RSTRING(argv[0])->len == 6) {
+ if (strncmp(RSTRING(argv[0])->ptr, "IGNORE", 6) == 0) {
+ func = SIG_IGN;
+ }
+ }
+ }
+ if (func == SIG_IGN || func == SIG_DFL)
+ command = Qnil;
+
+ for (i=1; i<argc; i++) {
+ if (TYPE(argv[i]) == T_STRING) {
+ char *s = RSTRING(argv[i])->ptr;
+
+ if (strncmp("SIG", s, 3) == 0)
+ s += 3;
+ sig = signm2signo(s);
+ if (sig == 0 && strcmp(s, "EXIT") != 0)
+ Fail("Invalid signal SIG%s", s);
+ }
+ else {
+ sig = NUM2INT(argv[i]);
+ }
+ if (sig < 0 || sig > NSIG)
+ Fail("Invalid signal no %d", sig);
+
+ signal(sig, sighandle);
+ trap_list[sig] = command;
+ /* enable at least specified signal. */
+#ifdef HAVE_SIGPROCMASK
+ sigdelset(&mask, sig);
+#else
+ mask &= ~sigmask(sig);
+#endif
+ }
+ /* disable interrupt */
+#ifdef HAVE_SIGPROCMASK
+ sigprocmask(SIG_SETMASK, &mask, NULL);
+#else
+ sigsetmask(mask);
+#endif
+ return Qnil;
+}
diff --git a/spec b/spec
index 93186dff2e..98504255e9 100644
--- a/spec
+++ b/spec
@@ -359,15 +359,17 @@ Rubyѿϥ(ͭϰ)ȼ̿(ͭ)ˤä4ʬव졤
||
.. ..
::
- =() (+=, -=, ..)
+ =() (+=, -=, ..)
+ and
+ or
ۤȤɤα黻ˤϥ᥽åɸƤӽФȤƲᤵ(饹˺
Ǥ)ǤʤüʤΤ롥Ǥʤü黻
Ҥ
- &&(), ||(), =(), ...(ϰϻ)
+ &&(), ||(), =(), ...(ϰϻ), and, or
-4ĤǤ롥
+6ĤǤ롥
Ǥü黻Ұʳα黻ҷϥ᥽åɸƤӽФȸʤ롥
ñ黻(+, -, !, ~)
@@ -490,12 +492,16 @@ case
黻ҷ
1 '&&' 2
+ 1 'and' 2
-1ɾͤ(nilʳ)ǤС2ɾ롥
+1ɾͤ(nilʳ)ǤС2ɾ롥`and'ͥ
+̤㤤̾Ǥ롥
1 '||' 2
+ 1 'or 2
-1ɾͤǤС2ɾ롥
+1ɾͤǤС2ɾ롥`or'̤ͥ㤤
+̾Ǥ롥
1 '...' 2
@@ -2131,10 +2137,10 @@ Single Methods:
*** Fixnum(饹)
-31bitΥ饹builtin classǤ롥Υ饹pointer¨ͤ
-뤿call by valueǸƤӽФħŪǤ(¾Υ饹call
-by reference)黻η̤31bitۤˤϼưŪBignum(̵¿
-Ĺ)˳ĥ롥
+31bit(ޥlongĹ-1 bit)Υ饹builtin classǤ롥
+饹pointer¨ͤǤ뤿call by valueǸƤӽФħŪ
+Ǥ(¾Υ饹call by reference)黻η̤31bitۤ
+ϼưŪBignum(̵¿Ĺ)˳ĥ롥
ƥ졼upto()downto()step()Ϸ֤ΤѤ졤̤
Range饹Ѥ®Ǥ롥
diff --git a/variable.c b/variable.c
index aa01b31921..af8ae603f8 100644
--- a/variable.c
+++ b/variable.c
@@ -3,7 +3,7 @@
variable.c -
$Author: matz $
- $Date: 1994/12/19 08:30:16 $
+ $Date: 1994/12/20 05:07:14 $
created at: Tue Apr 19 23:55:15 JST 1994
************************************************/
@@ -47,7 +47,7 @@ rb_name_class(class, id)
}
struct global_entry {
- enum { GLOBAL_VAL, GLOBAL_VAR, GLOBAL_UNDEF } mode;
+ enum { GLOBAL_VAL, GLOBAL_VAR, GLOBAL_SYSVAR, GLOBAL_UNDEF } mode;
ID id;
union {
VALUE val;
@@ -68,6 +68,7 @@ mark_global_entry(key, entry)
gc_mark(entry->v.val); /* normal global value */
break;
case GLOBAL_VAR:
+ case GLOBAL_SYSVAR:
if (entry->v.var)
gc_mark(*entry->v.var); /* c variable pointer */
break;
@@ -122,10 +123,8 @@ rb_define_variable(name, var, get_hook, set_hook, data)
id = rb_intern(buf);
}
- if (!st_lookup(global_tbl, id, &entry)) {
- entry = rb_global_entry(id);
- }
- entry->mode = GLOBAL_VAR;
+ entry = rb_global_entry(id);
+ entry->mode = GLOBAL_SYSVAR;
entry->v.var = var;
entry->get_hook = get_hook;
entry->set_hook = set_hook;
@@ -200,6 +199,7 @@ rb_gvar_get(entry)
return entry->v.val;
case GLOBAL_VAR:
+ case GLOBAL_SYSVAR:
if (entry->v.var == Qnil) return val;
return *entry->v.var;
@@ -271,7 +271,7 @@ rb_gvar_set(entry, val)
if (entry->set_hook)
(*entry->set_hook)(val, entry->id, entry->data);
- if (entry->mode == GLOBAL_VAR) {
+ if (entry->mode == GLOBAL_VAR || entry->mode == GLOBAL_SYSVAR) {
if (entry->v.var == Qnil) {
rb_readonly_hook(val, entry->id);
}
@@ -426,5 +426,5 @@ Fdefined(obj, name)
break;
}
return FALSE;
-}
+}
diff --git a/version.h b/version.h
index cfda74e8fb..92781b4078 100644
--- a/version.h
+++ b/version.h
@@ -1,2 +1,2 @@
-#define RUBY_VERSION "0.62"
-#define VERSION_DATE "94/12/19"
+#define RUBY_VERSION "0.63"
+#define VERSION_DATE "94/12/20"