diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c index 6c9ebcd124..7eb6181203 100644 --- a/ext/strscan/strscan.c +++ b/ext/strscan/strscan.c @@ -445,13 +445,10 @@ static VALUE strscan_get_charpos(VALUE self) { struct strscanner *p; - VALUE substr; GET_SCANNER(self, p); - substr = rb_funcall(p->str, id_byteslice, 2, INT2FIX(0), LONG2NUM(p->curr)); - - return rb_str_length(substr); + return LONG2NUM(rb_enc_strlen(S_PBEG(p), CURPTR(p), rb_enc_get(p->str))); } /* diff --git a/test/strscan/test_stringscanner.rb b/test/strscan/test_stringscanner.rb index 4b001b317e..6e30be1f7d 100644 --- a/test/strscan/test_stringscanner.rb +++ b/test/strscan/test_stringscanner.rb @@ -206,6 +206,23 @@ class TestStringScanner < Test::Unit::TestCase assert_equal 11, s.charpos end + def test_charpos_not_use_string_methods + string = +'abcädeföghi' + scanner = create_string_scanner(string) + + class << string + EnvUtil.suppress_warning do + undef_method(*instance_methods) + end + end + + assert_equal 0, scanner.charpos + assert_equal "abcä", scanner.scan_until(/ä/) + assert_equal 4, scanner.charpos + assert_equal "defö", scanner.scan_until(/ö/) + assert_equal 8, scanner.charpos + end + def test_concat s = create_string_scanner('a'.dup) s.scan(/a/)