aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-02-05 07:56:31 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-02-05 07:56:31 +0000
commit8210c254bee19294af67bcee0e8f5e02ebb39a60 (patch)
tree91734ef17b33d9f50435abec5286dca5492e17ec
parent49c720ff67cbca36cac3a6a4775c5522ea7d93b2 (diff)
downloadruby-8210c254bee19294af67bcee0e8f5e02ebb39a60.tar.gz
* io.c (fptr_finalize): should raise error when fclose fails.
* eval.c (method_inspect): proper output format to distinguish methods and singleton methods. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2046 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog9
-rw-r--r--eval.c36
-rw-r--r--ext/socket/socket.c16
-rw-r--r--file.c14
-rw-r--r--io.c47
-rw-r--r--version.h4
6 files changed, 81 insertions, 45 deletions
diff --git a/ChangeLog b/ChangeLog
index f82e5db26c..05c86bdd88 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Tue Feb 5 16:17:20 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * io.c (fptr_finalize): should raise error when fclose fails.
+
+ * eval.c (method_inspect): proper output format to distinguish
+ methods and singleton methods.
+
Mon Feb 4 22:44:58 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* file.c (rb_file_s_expand_path): should terminate.
@@ -8,6 +15,8 @@ Mon Feb 4 15:38:29 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* variable.c (classname): should follow ICLASS link explicitly.
+ * eval.c (rb_call): ditto.
+
Fri Feb 1 19:10:04 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* intern.h: prototypes for new functions; rb_cstr_to_inum(),
diff --git a/eval.c b/eval.c
index a9b79403b5..ade8f043d8 100644
--- a/eval.c
+++ b/eval.c
@@ -4669,6 +4669,9 @@ rb_call(klass, recv, mid, argc, argv, scope)
/* self must be kind of a specified form for private method */
if ((noex & NOEX_PROTECTED)) {
+ if (TYPE(klass) == T_ICLASS) {
+ klass = RBASIC(klass)->klass;
+ }
if (!rb_obj_is_kind_of(ruby_frame->self, rb_class_real(klass)))
return rb_undefined(recv, mid, argc, argv, CSTAT_PROT);
}
@@ -6757,7 +6760,7 @@ method_unbind(obj)
Data_Get_Struct(obj, struct METHOD, orig);
method = Data_Make_Struct(rb_cUnboundMethod, struct METHOD, bm_mark, free, data);
data->klass = orig->klass;
- data->recv = 0;
+ data->recv = Qundef;
data->id = orig->id;
data->body = orig->body;
data->rklass = orig->rklass;
@@ -6787,7 +6790,7 @@ rb_mod_method(mod, vid)
VALUE mod;
VALUE vid;
{
- return mnew(mod, 0, rb_to_id(vid), rb_cUnboundMethod);
+ return mnew(mod, Qundef, rb_to_id(vid), rb_cUnboundMethod);
}
static VALUE
@@ -6913,18 +6916,35 @@ method_inspect(method)
struct METHOD *data;
VALUE str;
const char *s;
+ char *sharp = "#";
Data_Get_Struct(method, struct METHOD, data);
str = rb_str_buf_new2("#<");
s = rb_class2name(CLASS_OF(method));
rb_str_buf_cat2(str, s);
rb_str_buf_cat2(str, ": ");
- s = rb_class2name(data->rklass);
- rb_str_buf_cat2(str, s);
- rb_str_buf_cat2(str, "(");
- s = rb_class2name(data->klass);
- rb_str_buf_cat2(str, s);
- rb_str_buf_cat2(str, ")#");
+
+ if (FL_TEST(data->klass, FL_SINGLETON)) {
+ VALUE v;
+
+ rb_str_buf_append(str, rb_inspect(data->recv));
+ v = rb_iv_get(data->klass, "__attached__");
+ if (data->recv != v) {
+ rb_str_buf_cat2(str, "(");
+ rb_str_buf_append(str, rb_inspect(v));
+ rb_str_buf_cat2(str, ").");
+ }
+ else {
+ rb_str_buf_cat2(str, ".");
+ }
+ }
+ else {
+ rb_str_buf_cat2(str, rb_class2name(data->rklass));
+ rb_str_buf_cat2(str, "(");
+ s = rb_class2name(data->klass);
+ rb_str_buf_cat2(str, s);
+ rb_str_buf_cat2(str, ")#");
+ }
s = rb_id2name(data->oid);
rb_str_buf_cat2(str, s);
rb_str_buf_cat2(str, ">");
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 82f52472c4..5580725fd9 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -192,6 +192,13 @@ init_sock(sock, fd)
}
static VALUE
+bsock_s_for_fd(klass, fd)
+ VALUE klass, fd;
+{
+ return init_sock(rb_obj_alloc(klass), NUM2INT(fd));
+}
+
+static VALUE
bsock_shutdown(argc, argv, sock)
int argc;
VALUE *argv;
@@ -1534,13 +1541,6 @@ sock_init(sock, domain, type, protocol)
}
static VALUE
-sock_s_for_fd(klass, fd)
- VALUE klass, fd;
-{
- return init_sock(rb_obj_alloc(klass), NUM2INT(fd));
-}
-
-static VALUE
sock_s_socketpair(klass, domain, type, protocol)
VALUE klass, domain, type, protocol;
{
@@ -2123,6 +2123,7 @@ Init_socket()
bsock_do_not_rev_lookup, 0);
rb_define_singleton_method(rb_cBasicSocket, "do_not_reverse_lookup=",
bsock_do_not_rev_lookup_set, 1);
+ rb_define_singleton_method(rb_cBasicSocket, "for_fd", bsock_s_for_fd, 1);
rb_define_method(rb_cBasicSocket, "close_read", bsock_close_read, 0);
rb_define_method(rb_cBasicSocket, "close_write", bsock_close_write, 0);
@@ -2185,7 +2186,6 @@ Init_socket()
#endif
rb_cSocket = rb_define_class("Socket", rb_cBasicSocket);
- rb_define_singleton_method(rb_cSocket, "for_fd", sock_s_for_fd, 1);
rb_define_method(rb_cSocket, "initialize", sock_init, 3);
rb_define_method(rb_cSocket, "connect", sock_connect, 1);
diff --git a/file.c b/file.c
index 96ecb7edf3..1eea9360e4 100644
--- a/file.c
+++ b/file.c
@@ -1459,8 +1459,9 @@ rb_file_s_expand_path(argc, argv)
if (!NIL_P(dname)) {
dname = rb_file_s_expand_path(1, &dname);
if (OBJ_TAINTED(dname)) tainted = 1;
- BUFCHECK (strlen(RSTRING(dname)->ptr) > buflen);
- strcpy(buf, RSTRING(dname)->ptr);
+ BUFCHECK (RSTRING(dname)->len > buflen);
+ memcpy(buf, RSTRING(dname)->ptr, RSTRING(dname)->len);
+ p += RSTRING(dname)->len;
}
else {
char *dir = my_getcwd();
@@ -1468,8 +1469,8 @@ rb_file_s_expand_path(argc, argv)
tainted = 1;
BUFCHECK (strlen(dir) > buflen);
strcpy(buf, dir);
+ p = &buf[strlen(buf)];
}
- p = &buf[strlen(buf)];
while (p > buf && *(p - 1) == '/') p--;
}
else {
@@ -1539,9 +1540,6 @@ rb_file_s_expand_path(argc, argv)
memcpy(++p, b, s-b);
p += s-b;
}
- else if (p == buf) {
- p++;
- }
#if defined(DOSISH)
else if (ISALPHA(buf[0]) && (buf[1] == ':') && isdirsep(buf[2])) {
/* root directory needs a trailing backslash,
@@ -1554,8 +1552,8 @@ rb_file_s_expand_path(argc, argv)
#endif
if (tainted) OBJ_TAINT(result);
- *p = '\0';
RSTRING(result)->len = p - buf;
+ *p = '\0';
return result;
}
@@ -2308,7 +2306,7 @@ path_check_1(path)
for (;;) {
if (stat(p0, &st) == 0 && (st.st_mode & 002)) {
if (p) *p = '/';
- rb_warn("Bad mode 0%o on %s", st.st_mode, p0);
+ rb_warn("Unsecure world writeable dir %s , mode 0%o", p0, st.st_mode);
return 0;
}
s = strrdirsep(p0);
diff --git a/io.c b/io.c
index 946d332195..f078bcca21 100644
--- a/io.c
+++ b/io.c
@@ -1072,26 +1072,34 @@ rb_io_isatty(io)
}
static void
-fptr_finalize(fptr)
+fptr_finalize(fptr, fin)
OpenFile *fptr;
{
+ int n1 = 0, n2 = 0, e = 0;
+
if (fptr->f) {
- fclose(fptr->f);
+ n1 = fclose(fptr->f);
+ if (n1 < 0) e = errno;
}
if (fptr->f2) {
- fclose(fptr->f2);
+ n2 = fclose(fptr->f2);
+ }
+ if (!fin && (n1 < 0 || n2 < 0)) {
+ if (n2 == 0) errno = e;
+ rb_sys_fail(fptr->path);
}
}
static void
-rb_io_fptr_cleanup(fptr)
+rb_io_fptr_cleanup(fptr, fin)
OpenFile *fptr;
+ int fin;
{
if (fptr->finalize) {
(*fptr->finalize)(fptr);
}
else {
- fptr_finalize(fptr);
+ fptr_finalize(fptr, fin);
}
fptr->f = fptr->f2 = 0;
@@ -1109,31 +1117,24 @@ rb_io_fptr_finalize(fptr)
if (!fptr->f && !fptr->f2) return;
if (fileno(fptr->f) < 3) return;
- rb_io_fptr_cleanup(fptr);
+ rb_io_fptr_cleanup(fptr, Qtrue);
}
-static void
-rb_io_fptr_close(fptr)
- OpenFile *fptr;
+VALUE
+rb_io_close(io)
+ VALUE io;
{
+ OpenFile *fptr;
int fd;
+ fptr = RFILE(io)->fptr;
if (!fptr) return;
if (!fptr->f && !fptr->f2) return;
fd = fileno(fptr->f);
- rb_io_fptr_cleanup(fptr);
+ rb_io_fptr_cleanup(fptr, Qfalse);
rb_thread_fd_close(fd);
-}
-VALUE
-rb_io_close(io)
- VALUE io;
-{
- OpenFile *fptr;
-
- fptr = RFILE(io)->fptr;
- rb_io_fptr_close(fptr);
if (fptr->pid) {
rb_syswait(fptr->pid);
fptr->pid = 0;
@@ -2493,6 +2494,14 @@ rb_file_initialize(argc, argv, io)
free(RFILE(io)->fptr);
RFILE(io)->fptr = 0;
}
+ if (0 < argc && argc < 3) {
+ VALUE fd = rb_check_convert_type(argv[0], T_FIXNUM, "Fixnum", "to_int");
+
+ if (!NIL_P(fd)) {
+ argv[0] = fd;
+ return rb_io_initialize(argc, argv, io);
+ }
+ }
rb_open_file(argc, argv, io);
return io;
diff --git a/version.h b/version.h
index 409f43218a..e8e4faf659 100644
--- a/version.h
+++ b/version.h
@@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.2"
-#define RUBY_RELEASE_DATE "2002-02-04"
+#define RUBY_RELEASE_DATE "2002-02-05"
#define RUBY_VERSION_CODE 172
-#define RUBY_RELEASE_CODE 20020204
+#define RUBY_RELEASE_CODE 20020205