From d4cc2a6056985504e993663723fd4b4d1e7fdb2f Mon Sep 17 00:00:00 2001 From: David Calavera Date: Mon, 21 Sep 2009 23:17:02 +0200 Subject: [PATCH] ARGF.binmode? method added. Little refactor to clean some code --- src/org/jruby/RubyArgsFile.java | 48 +++++++++++++++++--------------------- 1 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/org/jruby/RubyArgsFile.java b/src/org/jruby/RubyArgsFile.java index 5b49973..8e58746 100644 --- a/src/org/jruby/RubyArgsFile.java +++ b/src/org/jruby/RubyArgsFile.java @@ -195,21 +195,13 @@ public class RubyArgsFile { @JRubyMethod(name = {"fileno", "to_i"}) public static IRubyObject fileno(ThreadContext context, IRubyObject recv) { - ArgsFileData data = ArgsFileData.getDataFrom(recv); - - if (!data.next_argv(context)) { - throw context.getRuntime().newArgumentError("no stream"); - } + ArgsFileData data = getData(context, recv, "no stream"); return ((RubyIO) data.currentFile).fileno(context); } @JRubyMethod(name = "to_io") public static IRubyObject to_io(ThreadContext context, IRubyObject recv) { - ArgsFileData data = ArgsFileData.getDataFrom(recv); - - if (!data.next_argv(context)) { - throw context.getRuntime().newArgumentError("no stream"); - } + ArgsFileData data = getData(context, recv, "no stream"); return data.currentFile; } @@ -468,14 +460,18 @@ public class RubyArgsFile { @JRubyMethod(name = "binmode") public static IRubyObject binmode(ThreadContext context, IRubyObject recv) { - ArgsFileData data = ArgsFileData.getDataFrom(recv); - if(!data.next_argv(context)) { - throw context.getRuntime().newArgumentError("no stream"); - } + ArgsFileData data = getData(context, recv, "no stream"); ((RubyIO)data.currentFile).binmode(); return recv; } + + @JRubyMethod(name = "binmode?", compat = CompatVersion.RUBY1_9) + public static IRubyObject op_binmode(ThreadContext context, IRubyObject recv) { + ArgsFileData data = getData(context, recv, "no stream"); + + return ((RubyIO)data.currentFile).op_binmode(context); + } @JRubyMethod(name = "lineno") public static IRubyObject lineno(ThreadContext context, IRubyObject recv) { @@ -502,10 +498,8 @@ public class RubyArgsFile { @JRubyMethod(name = "rewind") public static IRubyObject rewind(ThreadContext context, IRubyObject recv) { - ArgsFileData data = ArgsFileData.getDataFrom(recv); - if(!data.next_argv(context)) { - throw context.getRuntime().newArgumentError("no stream to rewind"); - } + ArgsFileData data = getData(context, recv, "no stream to rewind"); + RubyFixnum retVal = ((RubyIO)data.currentFile).rewind(context); ((RubyIO)data.currentFile).lineno_set(context, context.getRuntime().newFixnum(data.minLineNumber)); return retVal; @@ -539,19 +533,13 @@ public class RubyArgsFile { @JRubyMethod(name = "pos=", required = 1) public static IRubyObject set_pos(ThreadContext context, IRubyObject recv, IRubyObject offset) { - ArgsFileData data = ArgsFileData.getDataFrom(recv); - if(!data.next_argv(context)) { - throw context.getRuntime().newArgumentError("no stream to set position"); - } + ArgsFileData data = getData(context, recv, "no stream to set position"); return ((RubyIO)data.currentFile).pos_set(context, offset); } @JRubyMethod(name = "seek", required = 1, optional = 1) public static IRubyObject seek(ThreadContext context, IRubyObject recv, IRubyObject[] args) { - ArgsFileData data = ArgsFileData.getDataFrom(recv); - if(!data.next_argv(context)) { - throw context.getRuntime().newArgumentError("no stream to seek"); - } + ArgsFileData data = getData(context, recv, "no stream to seek"); return ((RubyIO)data.currentFile).seek(context, args); } @@ -653,4 +641,12 @@ public class RubyArgsFile { public static IRubyObject to_s(IRubyObject recv) { return recv.getRuntime().newString("ARGF"); } + + private static ArgsFileData getData(ThreadContext context, IRubyObject recv, String errorMessage) { + ArgsFileData data = ArgsFileData.getDataFrom(recv); + if(!data.next_argv(context)) { + throw context.getRuntime().newArgumentError(errorMessage); + } + return data; + } } -- 1.6.0.3 From 08dad5868c3900f8c291133e2dd9c917528cbde2 Mon Sep 17 00:00:00 2001 From: David Calavera Date: Mon, 21 Sep 2009 23:33:48 +0200 Subject: [PATCH] ARGF#close raises an IOError if called on a closed stream --- src/org/jruby/RubyArgsFile.java | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/org/jruby/RubyArgsFile.java b/src/org/jruby/RubyArgsFile.java index 8e58746..0ee98a4 100644 --- a/src/org/jruby/RubyArgsFile.java +++ b/src/org/jruby/RubyArgsFile.java @@ -436,6 +436,10 @@ public class RubyArgsFile { public static IRubyObject close(ThreadContext context, IRubyObject recv) { ArgsFileData data = ArgsFileData.getDataFrom(recv); data.next_argv(context); + if (isClosed(context, data.currentFile)) { + throw context.getRuntime().newIOError("closed stream"); + } + argf_close(context, data.currentFile); if(data.next_p != -1) { @@ -451,11 +455,17 @@ public class RubyArgsFile { ArgsFileData data = ArgsFileData.getDataFrom(recv); data.next_argv(context); - if(!(data.currentFile instanceof RubyIO)) { - return data.currentFile.callMethod(context, "closed?"); + return RubyBoolean.newBoolean(context.getRuntime(), isClosed(context, data.currentFile); + } + + private static boolean isClosed(ThreadContext context, IRubyObject currentFile) { + boolean closed = false; + if(!(currentFile instanceof RubyIO)) { + closed = currentFile.callMethod(context, "closed?").isTrue(); + } else { + closed = ((RubyIO)currentFile).closed_p(context).isTrue(); } - - return ((RubyIO)data.currentFile).closed_p(context); + return closed; } @JRubyMethod(name = "binmode") -- 1.6.0.3 From 0af8ee58773859c8f5bab855491a128be2cfea34 Mon Sep 17 00:00:00 2001 From: David Calavera Date: Mon, 21 Sep 2009 23:39:31 +0200 Subject: [PATCH] [1.9] ARGF.readlines returns an empty Array when end of stream reached --- src/org/jruby/RubyArgsFile.java | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/org/jruby/RubyArgsFile.java b/src/org/jruby/RubyArgsFile.java index 0ee98a4..0b73769 100644 --- a/src/org/jruby/RubyArgsFile.java +++ b/src/org/jruby/RubyArgsFile.java @@ -275,14 +275,16 @@ public class RubyArgsFile { @JRubyMethod(name = {"readlines"}, optional = 1, frame = true) public static IRubyObject readlines(ThreadContext context, IRubyObject recv, IRubyObject[] args) { ArgsFileData data = ArgsFileData.getDataFrom(recv); + Ruby runtime = context.getRuntime(); + if(!data.next_argv(context)) { - return context.getRuntime().getNil(); + return runtime.is1_9() ? runtime.newEmptyArray() : runtime.getNil(); } if(!(data.currentFile instanceof RubyIO)) { return data.currentFile.callMethod(context, "readlines", args); } - RubyArray ary = context.getRuntime().newArray(); + RubyArray ary = runtime.newArray(); IRubyObject line; while(!(line = argf_getline(context, recv, args)).isNil()) { ary.append(line); @@ -455,7 +457,7 @@ public class RubyArgsFile { ArgsFileData data = ArgsFileData.getDataFrom(recv); data.next_argv(context); - return RubyBoolean.newBoolean(context.getRuntime(), isClosed(context, data.currentFile); + return RubyBoolean.newBoolean(context.getRuntime(), isClosed(context, data.currentFile)); } private static boolean isClosed(ThreadContext context, IRubyObject currentFile) { -- 1.6.0.3 From 1e14b4d195e2d8a34403732de20af3f1f44ba6db Mon Sep 17 00:00:00 2001 From: David Calavera Date: Mon, 21 Sep 2009 23:41:58 +0200 Subject: [PATCH] [1.9] ARGF.to_a returns an empty Array when end of stream reached --- src/org/jruby/RubyArgsFile.java | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/org/jruby/RubyArgsFile.java b/src/org/jruby/RubyArgsFile.java index 0b73769..d55ed38 100644 --- a/src/org/jruby/RubyArgsFile.java +++ b/src/org/jruby/RubyArgsFile.java @@ -295,14 +295,16 @@ public class RubyArgsFile { @JRubyMethod(name = {"to_a"}, optional = 1, frame = true) public static IRubyObject to_a(ThreadContext context, IRubyObject recv, IRubyObject[] args) { ArgsFileData data = ArgsFileData.getDataFrom(recv); + Ruby runtime = context.getRuntime(); + if(!data.next_argv(context)) { - return context.getRuntime().getNil(); + return runtime.is1_9() ? runtime.newEmptyArray() : runtime.getNil(); } if(!(data.currentFile instanceof RubyIO)) { return data.currentFile.callMethod(context, "to_a", args); } - RubyArray ary = context.getRuntime().newArray(); + RubyArray ary = runtime.newArray(); IRubyObject line; while(!(line = argf_getline(context, recv, args)).isNil()) { ary.append(line); -- 1.6.0.3 From edb2f8e1efa73b455203087a9780450eaaf36680 Mon Sep 17 00:00:00 2001 From: David Calavera Date: Mon, 21 Sep 2009 23:59:51 +0200 Subject: [PATCH] [1.9] ARGF.rewind resets ARGF.lineno to 0 --- src/org/jruby/RubyArgsFile.java | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/src/org/jruby/RubyArgsFile.java b/src/org/jruby/RubyArgsFile.java index d55ed38..99f03c4 100644 --- a/src/org/jruby/RubyArgsFile.java +++ b/src/org/jruby/RubyArgsFile.java @@ -515,7 +515,10 @@ public class RubyArgsFile { ArgsFileData data = getData(context, recv, "no stream to rewind"); RubyFixnum retVal = ((RubyIO)data.currentFile).rewind(context); - ((RubyIO)data.currentFile).lineno_set(context, context.getRuntime().newFixnum(data.minLineNumber)); + ((RubyIO)data.currentFile).lineno_set(context, context.getRuntime().newFixnum(0)); + + data.minLineNumber = 0; + data.currentLineNumber = 0; return retVal; } -- 1.6.0.3