[macruby-changes] [1052] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Sat Mar 21 17:49:08 PDT 2009
Revision: 1052
http://trac.macosforge.org/projects/ruby/changeset/1052
Author: lsansonetti at apple.com
Date: 2009-03-21 17:49:07 -0700 (Sat, 21 Mar 2009)
Log Message:
-----------
fixed File.open by making sure IO.open calls alloc + initialize and that File#initialize is correctly implemented
Modified Paths:
--------------
MacRuby/branches/experimental/include/ruby/intern.h
MacRuby/branches/experimental/io.c
Modified: MacRuby/branches/experimental/include/ruby/intern.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/intern.h 2009-03-21 23:50:28 UTC (rev 1051)
+++ MacRuby/branches/experimental/include/ruby/intern.h 2009-03-22 00:49:07 UTC (rev 1052)
@@ -395,7 +395,6 @@
VALUE rb_io_printf(VALUE, SEL, int, VALUE *);
VALUE rb_io_print(VALUE, SEL, int, VALUE *);
VALUE rb_io_fdopen(int, int, const char*);
-VALUE rb_file_open(const char*, const char*);
VALUE rb_gets(void);
void rb_write_error(const char*);
void rb_write_error2(const char*, long);
Modified: MacRuby/branches/experimental/io.c
===================================================================
--- MacRuby/branches/experimental/io.c 2009-03-21 23:50:28 UTC (rev 1051)
+++ MacRuby/branches/experimental/io.c 2009-03-22 00:49:07 UTC (rev 1052)
@@ -91,7 +91,8 @@
// return S_ISSOCK(sbuf.st_mode);
// }
-int convert_mode_string_to_fmode(VALUE rstr)
+static int
+convert_mode_string_to_fmode(VALUE rstr)
{
int fmode = 0;
const char *m = RSTRING_PTR(rstr);
@@ -312,6 +313,8 @@
static inline void
prepare_io_from_fd(rb_io_t *io_struct, int fd, int mode)
{
+ // TODO we should really get rid of these FMODE_* constants and instead always
+ // use the POSIX ones.
CFReadStreamRef r = NULL;
CFWriteStreamRef w = NULL;
@@ -376,7 +379,7 @@
static VALUE
prep_io(int fd, int mode, VALUE klass)
{
- VALUE io = io_alloc(rb_cIO, 0);
+ VALUE io = io_alloc(klass, 0);
rb_io_t *io_struct = ExtractIOStruct(io);
prepare_io_from_fd(io_struct, fd, mode);
rb_objc_keep_for_exit_finalize((VALUE)io);
@@ -2022,23 +2025,31 @@
*/
static VALUE
-rb_f_open(VALUE klass, SEL sel, int argc, VALUE *argv)
+rb_file_open(VALUE io, int argc, VALUE *argv)
{
- // FIX THE HECK OUT OF ME!!!!
- // TODO: Handle the pipes, subprocess, etc.
// TODO: Take into account the provided file permissions.
- // TODO: Handle files that don't exist.
VALUE path, modes, permissions;
rb_scan_args(argc, argv, "12", &path, &modes, &permissions);
- if(NIL_P(modes)) {
- modes = (VALUE)CFSTR("r");
+ if (NIL_P(modes)) {
+ modes = (VALUE)CFSTR("r");
}
StringValue(path);
const char *filepath = RSTRING_PTR(path);
int fd = open(filepath, convert_mode_string_to_oflags(modes));
- return prep_io(fd, convert_mode_string_to_fmode(modes), klass);
+ if (fd == -1) {
+ rb_sys_fail(NULL);
+ }
+ prepare_io_from_fd(ExtractIOStruct(io), fd, convert_mode_string_to_fmode(modes));
+ return io;
}
+static VALUE
+rb_f_open(VALUE klass, SEL sel, int argc, VALUE *argv)
+{
+ VALUE io = rb_class_new_instance(argc, argv, rb_cFile);
+ return rb_file_open(io, argc, argv);
+}
+
/*
* call-seq:
* ios.reopen(other_IO) => ios
@@ -2471,15 +2482,7 @@
static VALUE
rb_file_initialize(VALUE io, SEL sel, int argc, VALUE *argv)
{
- // VALUE path, mode, permissions, io;
- // rb_io_t *io_s;
- // rb_scan_args(argc, argv, "12", &path, &mode, &permissions);
- // // TODO: I completely ignore the mode and permissions here. Fix that.
- // io = io_alloc(klass, sel);
- // io_s = ExtractIOStruct(io);
- // prepare_io_from_path(io_s, path, O_RDONLY | O_WRONLY);
- // return io;
- rb_notimplement();
+ return rb_file_open(io, argc, argv);
}
/*
@@ -2503,11 +2506,9 @@
static VALUE
rb_io_s_new(VALUE klass, SEL sel, int argc, VALUE *argv)
{
- VALUE io = io_alloc(klass, sel);
- return rb_io_initialize(io, sel, argc, argv);
+ return rb_class_new_instance(argc, argv, klass);
}
-
static inline void
argf_init(struct argf *p, VALUE v)
{
@@ -3122,10 +3123,10 @@
StringValue(fname);
- const char *path = RSTRING_PTR(fname);
- int fd = open(path, O_RDONLY);
+ const char *path = RSTRING_PTR(fname);
+ int fd = open(path, O_RDONLY);
CFReadStreamRef readStream = _CFReadStreamCreateFromFileDescriptor(NULL, fd);
- CFReadStreamOpen(readStream);
+ CFReadStreamOpen(readStream);
if (!NIL_P(offset)) {
long o = FIX2LONG(offset);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090321/ee7f1e7e/attachment.html>
More information about the macruby-changes
mailing list