Skip to content

Commit

Permalink
Showing 2 changed files with 58 additions and 7 deletions.
3 changes: 0 additions & 3 deletions spec/truffle/tags/core/io/close_tags.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
fails:IO#close closes the stream
fails:IO#close raises an IOError writing to a closed IO
fails:IO#close raises an IOError if closed
fails:IO#close on an IO.popen stream clears #pid
fails:IO#close on an IO.popen stream sets $?
fails:IO#close on an IO.popen stream waits for the child to exit
Original file line number Diff line number Diff line change
@@ -6,6 +6,34 @@
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*
* Some of the code in this class is transliterated from C++ code in Rubinius.
*
* Copyright (c) 2007-2014, Evan Phoenix and contributors
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of Rubinius nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.jruby.truffle.nodes.rubinius;

@@ -188,8 +216,16 @@ public IOEnsureOpenPrimitiveNode(RubyContext context, SourceSection sourceSectio
}

@Specialization
public RubyBasicObject ensureOpen(RubyBasicObject file) {
// TODO CS 18-Apr-15
public RubyBasicObject ensureOpen(VirtualFrame frame, RubyBasicObject file) {
// TODO BJF 13-May-2015 Handle nil case
final int fd = (int) rubyWithSelf(frame, file, "@descriptor");
if(fd == -1){
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().ioError("closed stream",this));
} else if (fd == -2){
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().ioError("shutdown stream",this));
}
return nil();
}

@@ -243,9 +279,27 @@ public IOClosePrimitiveNode(RubyContext context, SourceSection sourceSection) {

@Specialization
public int close(VirtualFrame frame, RubyBasicObject io) {
// In Rubinius this does a lot more, but we'll stick with this for now
rubyWithSelf(frame, io, "ensure_open");
final int fd = (int) rubyWithSelf(frame, io, "@descriptor");
return posix().close(fd);

if (fd == -1) {
return 0;
}

if (fd < 3) {

This comment has been minimized.

Copy link
@nirvdrum

nirvdrum May 14, 2015

Contributor

Is this temporary? It looks like MRI lets you close standard streams. And can we rely on their FDs being less than 3?

This comment has been minimized.

Copy link
@bjfish

bjfish May 14, 2015

Author Contributor

This is transliterated from https://github.com/rubinius/rubinius/blob/master/vm/builtin/io.cpp

Looks like I need to move this to after "@descriptor = -1" based on that source.

@chrisseaton are we going to have the standard streams be 0,1, 2 as well?

This comment has been minimized.

Copy link
@chrisseaton

chrisseaton May 14, 2015

Contributor

The standard streams being 0, 1, 2 is not a Rubinius or Ruby thing. When a unix (Mac, Linux etc) process gets started those are always the stdin, stdout and stderr file handles.

This comment has been minimized.

Copy link
@nirvdrum

nirvdrum May 14, 2015

Contributor

Yeah. I'm just not familiar enough with the POSIX standard to know whether those values are codified or if they're just convention.

This comment has been minimized.

Copy link
@nirvdrum

nirvdrum May 14, 2015

Contributor

And it looks like POSIX does define them. So, we should be in the clear. FWIW, I think Windows uses the same values as well. I just wanted to make sure it wasn't system-dependent.

return 0;
}

rubyWithSelf(frame, io, "@descriptor = -1");

final int result = posix().close(fd);

// TODO BJF 13-May-2015 Implement more error handling from Rubinius
if (result == -1) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().errnoError(posix().errno(), this));
}
return 0;
}

}

0 comments on commit a7cf015

Please sign in to comment.