From 2d6b3f6a5c064c762c200fd10e4acb439431d387 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Fri, 3 Apr 2015 11:36:13 -0500 Subject: [PATCH] Fix remaining strscan MRI failures. --- .../main/java/org/jruby/RubyMatchData.java | 3 ++ .../jruby/ext/strscan/RubyStringScanner.java | 35 +++++++++++-------- test/mri/excludes/TestStringScanner.rb | 4 --- 3 files changed, 23 insertions(+), 19 deletions(-) delete mode 100644 test/mri/excludes/TestStringScanner.rb diff --git a/core/src/main/java/org/jruby/RubyMatchData.java b/core/src/main/java/org/jruby/RubyMatchData.java index cd3d477ae12..ce181fff2da 100644 --- a/core/src/main/java/org/jruby/RubyMatchData.java +++ b/core/src/main/java/org/jruby/RubyMatchData.java @@ -399,6 +399,9 @@ private int nameToBackrefNumber(RubyString str) { } private static int nameToBackrefNumber(Ruby runtime, Regex pattern, Region regs, RubyString str) { + if (pattern == null) { + throw runtime.newIndexError("undefined group name reference: " + str); + } ByteList value = str.getByteList(); try { return pattern.nameToBackrefNumber(value.getUnsafeBytes(), value.getBegin(), value.getBegin() + value.getRealSize(), regs); diff --git a/core/src/main/java/org/jruby/ext/strscan/RubyStringScanner.java b/core/src/main/java/org/jruby/ext/strscan/RubyStringScanner.java index 38c6006431c..c088fbc1b70 100644 --- a/core/src/main/java/org/jruby/ext/strscan/RubyStringScanner.java +++ b/core/src/main/java/org/jruby/ext/strscan/RubyStringScanner.java @@ -46,6 +46,7 @@ import org.jruby.common.IRubyWarnings.ID; import org.jruby.exceptions.RaiseException; import org.jruby.runtime.Block; +import org.jruby.runtime.Helpers; import org.jruby.runtime.ObjectAllocator; import org.jruby.runtime.ThreadContext; import org.jruby.runtime.builtin.IRubyObject; @@ -184,7 +185,7 @@ public RubyString string() { @JRubyMethod(name = "string=", required = 1) public IRubyObject set_string(ThreadContext context, IRubyObject str) { - this.str = (RubyString) str.convertToString().strDup(context.runtime).freeze(context); + this.str = RubyString.stringValue(str); pos = 0; clearMatched(); return str; @@ -214,6 +215,13 @@ public IRubyObject set_pos(IRubyObject pos) { return RubyFixnum.newFixnum(getRuntime(), i); } + @JRubyMethod(name = "charpos") + public IRubyObject charpos(ThreadContext context) { + Ruby runtime = context.runtime; + RubyString sub = (RubyString)Helpers.invoke(context, str, "byteslice", runtime.newFixnum(0), runtime.newFixnum(pos)); + return runtime.newFixnum(sub.strLength()); + } + private IRubyObject extractRange(Ruby runtime, int beg, int end) { int size = str.getByteList().getRealSize(); if (beg > size) return getRuntime().getNil(); @@ -492,25 +500,22 @@ public IRubyObject op_aref(ThreadContext context, IRubyObject idx) { return context.nil; } - int i; - - if (regs == null) { - i = RubyNumeric.fix2int(idx); - if (i != 0) return context.nil; - if (beg == -1) return context.nil; - return extractRange(runtime, lastPos + beg, lastPos + end); - } + int i = RubyMatchData.backrefNumber(runtime, pattern, regs, idx); + int numRegs = regs == null ? 1 : regs.numRegs; - i = RubyMatchData.backrefNumber(runtime, pattern, regs, idx); - - int numRegs = regs.numRegs; if (i < 0) i += numRegs; if (i < 0 || i >= numRegs) { return context.nil; } - - if (regs.beg[i] == -1) return getRuntime().getNil(); - return extractRange(runtime, lastPos + regs.beg[i], lastPos + regs.end[i]); + + if (regs == null) { + assert i == 0; + if (beg == -1) return context.nil; + return extractRange(runtime, lastPos + beg, lastPos + end); + } else { + if (regs.beg[i] == -1) return getRuntime().getNil(); + return extractRange(context.runtime, lastPos + regs.beg[i], lastPos + regs.end[i]); + } } @JRubyMethod(name = "pre_match") diff --git a/test/mri/excludes/TestStringScanner.rb b/test/mri/excludes/TestStringScanner.rb deleted file mode 100644 index db07e777846..00000000000 --- a/test/mri/excludes/TestStringScanner.rb +++ /dev/null @@ -1,4 +0,0 @@ -exclude :test_AREF, "needs investigation" -exclude :test_pos_unicode, "needs investigation" -exclude :test_string_append, "needs investigation" -exclude :test_string_set_is_equal, "needs investigation"