-
-
Notifications
You must be signed in to change notification settings - Fork 925
Commit
- 9.4.12.0
- 9.4.11.0
- 9.4.10.0
- 9.4.9.0
- 9.4.8.0
- 9.4.7.0
- 9.4.6.0
- 9.4.5.0
- 9.4.4.0
- 9.4.3.0
- 9.4.2.0
- 9.4.1.0
- 9.4.0.0
- 9.3.15.0
- 9.3.14.0
- 9.3.13.0
- 9.3.12.0
- 9.3.11.0
- 9.3.10.0
- 9.3.9.0
- 9.3.8.0
- 9.3.7.0
- 9.3.6.0
- 9.3.5.0
- 9.3.4.0
- 9.3.3.0
- 9.3.2.0
- 9.3.1.0
- 9.3.0.0
- 9.2.21.0
- 9.2.20.1
- 9.2.20.0
- 9.2.19.0
- 9.2.18.0
- 9.2.17.0
- 9.2.16.0
- 9.2.15.0
- 9.2.14.0
- 9.2.13.0
- 9.2.12.0
- 9.2.11.1
- 9.2.11.0
- 9.2.10.0
- 9.2.9.0
- 9.2.8.0
- 9.2.7.0
- 9.2.6.0
- 9.2.5.0
- 9.2.4.1
- 9.2.4.0
- 9.2.3.0
- 9.2.2.0
- 9.2.1.0
- 9.2.0.0
- 9.1.17.0
- 9.1.16.0
- 9.1.15.0
- 9.1.14.0
- 9.1.13.0
- 9.1.12.0
- 9.1.11.0
- 9.1.10.0
- 9.1.9.0
- 9.1.8.0
- 9.1.7.0
- 9.1.6.0
- 9.1.5.0
- 9.1.4.0
- 9.1.3.0
- 9.1.2.0
- 9.1.1.0
- 9.1.0.0
- 9.0.5.0
- 9.0.4.0
- 9.0.3.0
- 9.0.1.0
- 9.0.0.0
- 9.0.0.0.rc2
- 9.0.0.0.rc1
There are no files selected for viewing
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.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
bjfish
Author
Contributor
|
||
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; | ||
} | ||
|
||
} | ||
|
Is this temporary? It looks like MRI lets you close standard streams. And can we rely on their FDs being less than 3?