diff --git a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java index c68c57edea..3c4c5294a4 100644 --- a/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java +++ b/ext/jruby/org/jruby/ext/strscan/RubyStringScanner.java @@ -584,7 +584,6 @@ public IRubyObject scan_base10_integer(ThreadContext context) { return context.nil; } - setMatched(); prev = ptr; while (len < remaining_len && Character.isDigit(bytes.get(ptr + len))) { @@ -625,8 +624,6 @@ public IRubyObject scan_base16_integer(ThreadContext context) { return context.nil; } - setMatched(); - adjustRegisters(); prev = ptr; while (len < remaining_len && isHexChar(bytes.get(ptr + len))) { @@ -639,6 +636,9 @@ public IRubyObject scan_base16_integer(ThreadContext context) { private RubyInteger strscanParseInteger(Ruby runtime, ByteList bytes, int ptr, int len, int base) { this.curr = ptr + len; + setMatched(); + adjustRegisters(); + return ConvertBytes.byteListToInum(runtime, bytes, ptr, len, base, true); } diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index ee5af9a139..ae265cb2d7 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -1292,6 +1292,10 @@ strscan_parse_integer(struct strscanner *p, int base, long len) integer = rb_cstr2inum(buffer, base); RB_ALLOCV_END(buffer_v); p->curr += len; + + MATCHED(p); + adjust_registers_to_matched(p); + return integer; } @@ -1341,7 +1345,6 @@ strscan_scan_base10_integer(VALUE self) return Qnil; } - MATCHED(p); p->prev = p->curr; while (len < remaining_len && rb_isdigit(ptr[len])) { @@ -1383,7 +1386,6 @@ strscan_scan_base16_integer(VALUE self) return Qnil; } - MATCHED(p); p->prev = p->curr; while (len < remaining_len && rb_isxdigit(ptr[len])) { diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index 11f9b507c7..1c2fb57711 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -946,6 +946,18 @@ def test_scan_integer_encoding end end + def test_scan_integer_matched + omit("not implemented on TruffleRuby") if RUBY_ENGINE == "truffleruby" + + s = create_string_scanner("42abc") + assert_equal(42, s.scan_integer) + assert_equal("42", s.matched) + + s = create_string_scanner("42abc") + assert_equal(0x42abc, s.scan_integer(base: 16)) + assert_equal("42abc", s.matched) + end + def test_scan_integer_base_16 omit("scan_integer isn't implemented on TruffleRuby yet") if RUBY_ENGINE == "truffleruby"