summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ext/stringio/stringio.c22
-rw-r--r--io.c2
-rw-r--r--rubyio.h1
4 files changed, 21 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index fceb2898eb..f3f408a54c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Thu Nov 18 10:10:14 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c, rubyio.h (rb_io_modenum_flags): exported.
+
+ * ext/stringio/stringio.c (strio_initialize): allow Fixnum as mode as
+ well as IO.new does. [ruby-dev:24896]
+
Wed Nov 17 23:47:30 2004 NAKAMURA, Hiroshi <nakahiro@sarion.co.jp>
* test/ruby/test_settracefunc.rb: added. [ruby-dev:24884]
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index 89d2f06290..84ee3f28a7 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -201,7 +201,7 @@ strio_initialize(argc, argv, self)
{
struct StringIO *ptr = check_strio(self);
VALUE string, mode;
- const char* m;
+ int trunc = Qfalse;
if (!ptr) {
DATA_PTR(self) = ptr = strio_alloc();
@@ -209,21 +209,23 @@ strio_initialize(argc, argv, self)
rb_call_super(0, 0);
switch (rb_scan_args(argc, argv, "02", &string, &mode)) {
case 2:
- StringValue(mode);
+ if (FIXNUM_P(mode)) {
+ int flags = FIX2INT(mode);
+ ptr->flags = rb_io_modenum_flags(flags);
+ trunc = flags & O_TRUNC;
+ }
+ else {
+ const char *m = StringValueCStr(mode);
+ ptr->flags = rb_io_mode_flags(m);
+ trunc = *m == 'w';
+ }
StringValue(string);
- if (!(m = RSTRING(mode)->ptr)) m = "";
- ptr->flags = rb_io_mode_flags(m);
if ((ptr->flags & FMODE_WRITABLE) && OBJ_FROZEN(string)) {
errno = EACCES;
rb_sys_fail(0);
}
- switch (*m) {
- case 'a':
- ptr->flags |= FMODE_APPEND;
- break;
- case 'w':
+ if (trunc) {
rb_str_resize(string, 0);
- break;
}
break;
case 1:
diff --git a/io.c b/io.c
index 5abe8dd5c8..2b459ca1aa 100644
--- a/io.c
+++ b/io.c
@@ -2389,7 +2389,7 @@ rb_io_mode_flags(mode)
return flags;
}
-static int
+int
rb_io_modenum_flags(mode)
int mode;
{
diff --git a/rubyio.h b/rubyio.h
index f56cec4c40..3ae67b2762 100644
--- a/rubyio.h
+++ b/rubyio.h
@@ -65,6 +65,7 @@ int rb_getc _((FILE*));
long rb_io_fread _((char *, long, FILE *));
long rb_io_fwrite _((const char *, long, FILE *));
int rb_io_mode_flags _((const char*));
+int rb_io_modenum_flags _((int));
void rb_io_check_writable _((OpenFile*));
void rb_io_check_readable _((OpenFile*));
int rb_io_fptr_finalize _((OpenFile*));