Skip to content

Instantly share code, notes, and snippets.

@marshalium
Created February 15, 2016 21:08
Show Gist options
  • Save marshalium/3e62c2affbd2ce95757f to your computer and use it in GitHub Desktop.
Save marshalium/3e62c2affbd2ce95757f to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# This code breaks on JRuby 1.7.24 and JRuby 9.0.5.0. Sample run at the bottom of the file.
puts "#{RUBY_DESCRIPTION}\n\n"
$last_thread_error = nil
threads = 5.times.map do
Thread.new do
begin
5_000.times do
str = "foobar"
str.force_encoding("UTF-8")
str.gsub(/foo/i, '')
end
rescue Exception => e
$last_thread_error ||= e
raise
end
end
end
threads.map(&:join)
if $last_thread_error
puts "\nTEST FAILED because $last_thread_error was set: #{$last_thread_error.inspect}"
else
puts "\nTEST PASSED because no error was thrown"
end
# $ rbenv shell jruby-1.7.23
# $ ./recreate_utf8_bug.rb
# jruby 1.7.23 (1.9.3p551) 2015-11-24 f496dd5 on Java HotSpot(TM) 64-Bit Server VM 1.7.0_80-b15 +jit [darwin-x86_64]
#
#
# TEST PASSED because no error was thrown
# $
# $
# $ rbenv shell jruby-1.7.24
# $ ./recreate_utf8_bug.rb
# jruby 1.7.24 (1.9.3p551) 2016-01-20 bd68d85 on Java HotSpot(TM) 64-Bit Server VM 1.7.0_80-b15 +jit [darwin-x86_64]
#
# Exception in thread "Ruby-0-Thread-4: ./recreate_utf8_bug.rb:3" Exception in thread "Ruby-0-Thread-3: ./recreate_utf8_bug.rb:3" Exception in thread "Ruby-0-Thread-6: ./recreate_utf8_bug.rb:3" java.lang.ArrayIndexOutOfBoundsException: 6
# at org.jcodings.specific.BaseUTF8Encoding.mbcCaseFold(BaseUTF8Encoding.java:167)
# at org.jcodings.specific.UTF8Encoding.mbcCaseFold(UTF8Encoding.java:24)
# at org.joni.SearchAlgorithm$SLOW_IC.lowerCaseMatch(SearchAlgorithm.java:238)
# at org.joni.SearchAlgorithm$SLOW_IC.search(SearchAlgorithm.java:206)
# at org.joni.Matcher.forwardSearchRange(Matcher.java:140)
# at org.joni.Matcher.searchInterruptible(Matcher.java:451)
# at org.jruby.RubyRegexp$SearchMatchTask.run(RubyRegexp.java:273)
# at org.jruby.RubyThread.executeBlockingTask(RubyThread.java:1066)
# at org.jruby.RubyRegexp.matcherSearch(RubyRegexp.java:235)
# at org.jruby.RubyString.gsubCommon19(RubyString.java:3123)
# at org.jruby.RubyString.gsubCommon19(RubyString.java:3106)
# at org.jruby.RubyString.gsub19(RubyString.java:3101)
# at org.jruby.RubyString.gsub19(RubyString.java:3069)
# at org.jruby.RubyString$INVOKER$i$gsub19.call(RubyString$INVOKER$i$gsub19.gen)
# at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodOneOrTwoOrNBlock.call(JavaMethod.java:367)
# at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:202)
# at $_dot_.recreate_utf8_bug.block_2$RUBY$__file__(./recreate_utf8_bug.rb:13)
# at $_dot_$recreate_utf8_bug$block_2$RUBY$__file__.call($_dot_$recreate_utf8_bug$block_2$RUBY$__file__)
# at org.jruby.runtime.CompiledBlock19.yieldSpecificInternal(CompiledBlock19.java:117)
# at org.jruby.runtime.CompiledBlock19.yieldSpecific(CompiledBlock19.java:92)
# at org.jruby.runtime.Block.yieldSpecific(Block.java:111)
# at org.jruby.RubyFixnum.times(RubyFixnum.java:275)
# at org.jruby.RubyFixnum$INVOKER$i$0$0$times.call(RubyFixnum$INVOKER$i$0$0$times.gen)
# at org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:143)
# at org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:154)
# at $_dot_.recreate_utf8_bug.chained_0_rescue_1$RUBY$SYNTHETIC__file__(./recreate_utf8_bug.rb:10)
# at $_dot_.recreate_utf8_bug.block_1$RUBY$__file__(./recreate_utf8_bug.rb:9)
# at $_dot_$recreate_utf8_bug$block_1$RUBY$__file__.call($_dot_$recreate_utf8_bug$block_1$RUBY$__file__)
# at org.jruby.runtime.CompiledBlock19.yield(CompiledBlock19.java:159)
# at org.jruby.runtime.CompiledBlock19.call(CompiledBlock19.java:87)
# at org.jruby.runtime.Block.call(Block.java:101)
# at org.jruby.RubyProc.call(RubyProc.java:300)
# at org.jruby.RubyProc.call(RubyProc.java:230)
# at org.jruby.internal.runtime.RubyRunnable.run(RubyRunnable.java:99)
# at java.lang.Thread.run(Thread.java:745)
# java.lang.ArrayIndexOutOfBoundsException: 6
# at org.jcodings.specific.BaseUTF8Encoding.mbcCaseFold(BaseUTF8Encoding.java:167)
# at org.jcodings.specific.UTF8Encoding.mbcCaseFold(UTF8Encoding.java:24)
# at org.joni.SearchAlgorithm$SLOW_IC.lowerCaseMatch(SearchAlgorithm.java:238)
# at org.joni.SearchAlgorithm$SLOW_IC.search(SearchAlgorithm.java:206)
# at org.joni.Matcher.forwardSearchRange(Matcher.java:140)
# at org.joni.Matcher.searchInterruptible(Matcher.java:451)
# at org.jruby.RubyRegexp$SearchMatchTask.run(RubyRegexp.java:273)
# at org.jruby.RubyThread.executeBlockingTask(RubyThread.java:1066)
# at org.jruby.RubyRegexp.matcherSearch(RubyRegexp.java:235)
# at org.jruby.RubyString.gsubCommon19(RubyString.java:3123)
# at org.jruby.RubyString.gsubCommon19(RubyString.java:3106)
# at org.jruby.RubyString.gsub19(RubyString.java:3101)
# at org.jruby.RubyString.gsub19(RubyString.java:3069)
# at org.jruby.RubyString$INVOKER$i$gsub19.call(RubyString$INVOKER$i$gsub19.gen)
# at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodOneOrTwoOrNBlock.call(JavaMethod.java:367)
# at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:202)
# at $_dot_.recreate_utf8_bug.block_2$RUBY$__file__(./recreate_utf8_bug.rb:13)
# at $_dot_$recreate_utf8_bug$block_2$RUBY$__file__.call($_dot_$recreate_utf8_bug$block_2$RUBY$__file__)
# at org.jruby.runtime.CompiledBlock19.yieldSpecificInternal(CompiledBlock19.java:117)
# at org.jruby.runtime.CompiledBlock19.yieldSpecific(CompiledBlock19.java:92)
# at org.jruby.runtime.Block.yieldSpecific(Block.java:111)
# at org.jruby.RubyFixnum.times(RubyFixnum.java:275)
# at org.jruby.RubyFixnum$INVOKER$i$0$0$times.call(RubyFixnum$INVOKER$i$0$0$times.gen)
# at org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:143)
# at org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:154)
# at $_dot_.recreate_utf8_bug.chained_0_rescue_1$RUBY$SYNTHETIC__file__(./recreate_utf8_bug.rb:10)
# at $_dot_.recreate_utf8_bug.block_1$RUBY$__file__(./recreate_utf8_bug.rb:9)
# at $_dot_$recreate_utf8_bug$block_1$RUBY$__file__.call($_dot_$recreate_utf8_bug$block_1$RUBY$__file__)
# at org.jruby.runtime.CompiledBlock19.yield(CompiledBlock19.java:159)
# at org.jruby.runtime.CompiledBlock19.call(CompiledBlock19.java:87)
# at org.jruby.runtime.Block.call(Block.java:101)
# at org.jruby.RubyProc.call(RubyProc.java:300)
# at org.jruby.RubyProc.call(RubyProc.java:230)
# at org.jruby.internal.runtime.RubyRunnable.run(RubyRunnable.java:99)
# at java.lang.Thread.run(Thread.java:745)
# java.lang.ArrayIndexOutOfBoundsException: 6
# at org.jcodings.specific.BaseUTF8Encoding.mbcCaseFold(BaseUTF8Encoding.java:167)
# at org.jcodings.specific.UTF8Encoding.mbcCaseFold(UTF8Encoding.java:24)
# at org.joni.SearchAlgorithm$SLOW_IC.lowerCaseMatch(SearchAlgorithm.java:238)
# at org.joni.SearchAlgorithm$SLOW_IC.search(SearchAlgorithm.java:206)
# at org.joni.Matcher.forwardSearchRange(Matcher.java:140)
# at org.joni.Matcher.searchInterruptible(Matcher.java:451)
# at org.jruby.RubyRegexp$SearchMatchTask.run(RubyRegexp.java:273)
# at org.jruby.RubyThread.executeBlockingTask(RubyThread.java:1066)
# at org.jruby.RubyRegexp.matcherSearch(RubyRegexp.java:235)
# at org.jruby.RubyString.gsubCommon19(RubyString.java:3123)
# at org.jruby.RubyString.gsubCommon19(RubyString.java:3106)
# at org.jruby.RubyString.gsub19(RubyString.java:3101)
# at org.jruby.RubyString.gsub19(RubyString.java:3069)
# at org.jruby.RubyString$INVOKER$i$gsub19.call(RubyString$INVOKER$i$gsub19.gen)
# at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodOneOrTwoOrNBlock.call(JavaMethod.java:367)
# at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:202)
# at $_dot_.recreate_utf8_bug.block_2$RUBY$__file__(./recreate_utf8_bug.rb:13)
# at $_dot_$recreate_utf8_bug$block_2$RUBY$__file__.call($_dot_$recreate_utf8_bug$block_2$RUBY$__file__)
# at org.jruby.runtime.CompiledBlock19.yieldSpecificInternal(CompiledBlock19.java:117)
# at org.jruby.runtime.CompiledBlock19.yieldSpecific(CompiledBlock19.java:92)
# at org.jruby.runtime.Block.yieldSpecific(Block.java:111)
# at org.jruby.RubyFixnum.times(RubyFixnum.java:275)
# at org.jruby.RubyFixnum$INVOKER$i$0$0$times.call(RubyFixnum$INVOKER$i$0$0$times.gen)
# at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:316)
# at org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:145)
# at org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:154)
# at $_dot_.recreate_utf8_bug.chained_0_rescue_1$RUBY$SYNTHETIC__file__(./recreate_utf8_bug.rb:10)
# at $_dot_.recreate_utf8_bug.block_1$RUBY$__file__(./recreate_utf8_bug.rb:9)
# at $_dot_$recreate_utf8_bug$block_1$RUBY$__file__.call($_dot_$recreate_utf8_bug$block_1$RUBY$__file__)
# at org.jruby.runtime.CompiledBlock19.yield(CompiledBlock19.java:159)
# at org.jruby.runtime.CompiledBlock19.call(CompiledBlock19.java:87)
# at org.jruby.runtime.Block.call(Block.java:101)
# at org.jruby.RubyProc.call(RubyProc.java:300)
# at org.jruby.RubyProc.call(RubyProc.java:230)
# at org.jruby.internal.runtime.RubyRunnable.run(RubyRunnable.java:99)
# at java.lang.Thread.run(Thread.java:745)
#
# TEST FAILED because $last_thread_error was set: java.lang.ArrayIndexOutOfBoundsException: 6
# $
# $
# $ rbenv shell jruby-9.0.4.0
# $ ./recreate_utf8_bug.rb
# jruby 9.0.4.0 (2.2.2) 2015-11-12 b9fb7aa Java HotSpot(TM) 64-Bit Server VM 24.80-b11 on 1.7.0_80-b15 +jit [darwin-x86_64]
#
#
# TEST PASSED because no error was thrown
# $
# $
# $ rbenv shell jruby-9.0.5.0
# $ ./recreate_utf8_bug.rb
# jruby 9.0.5.0 (2.2.3) 2016-01-26 7bee00d Java HotSpot(TM) 64-Bit Server VM 24.80-b11 on 1.7.0_80-b15 +jit [darwin-x86_64]
#
# Exception in thread "Ruby-0-Thread-5: ./recreate_utf8_bug.rb:3" java.lang.ArrayIndexOutOfBoundsException: 6
# at org.jcodings.specific.BaseUTF8Encoding.mbcCaseFold(BaseUTF8Encoding.java:167)
# at org.jcodings.specific.UTF8Encoding.mbcCaseFold(UTF8Encoding.java:24)
# at org.joni.SearchAlgorithm$SLOW_IC.lowerCaseMatch(SearchAlgorithm.java:238)
# at org.joni.SearchAlgorithm$SLOW_IC.search(SearchAlgorithm.java:206)
# at org.joni.Matcher.forwardSearchRange(Matcher.java:140)
# at org.joni.Matcher.searchInterruptible(Matcher.java:451)
# at org.jruby.RubyRegexp$SearchMatchTask.run(RubyRegexp.java:271)
# at org.jruby.RubyThread.executeBlockingTask(RubyThread.java:1337)
# at org.jruby.RubyRegexp.matcherSearch(RubyRegexp.java:233)
# at org.jruby.RubyString.gsubCommon19(RubyString.java:2418)
# at org.jruby.RubyString.gsubCommon19(RubyString.java:2400)
# at org.jruby.RubyString.gsub19(RubyString.java:2395)
# at org.jruby.RubyString.gsub19(RubyString.java:2363)
# at org.jruby.RubyString$INVOKER$i$gsub19.call(RubyString$INVOKER$i$gsub19.gen)
# at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodOneOrTwoOrNBlock.call(JavaMethod.java:398)
# at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:193)
# at $_dot_.recreate_utf8_bug.invokeOther6:gsub(./recreate_utf8_bug.rb)
# at $_dot_.recreate_utf8_bug.RUBY$block$\=\,\|recreate_utf8_bug\,rb$2(./recreate_utf8_bug.rb:13)
# at org.jruby.runtime.CompiledIRBlockBody.yieldDirect(CompiledIRBlockBody.java:140)
# at org.jruby.runtime.IRBlockBody.yieldSpecific(IRBlockBody.java:73)
# at org.jruby.runtime.Block.yieldSpecific(Block.java:135)
# at org.jruby.RubyFixnum.times(RubyFixnum.java:296)
# at org.jruby.RubyFixnum$INVOKER$i$0$0$times.call(RubyFixnum$INVOKER$i$0$0$times.gen)
# at org.jruby.runtime.callsite.CachingCallSite.callBlock(CachingCallSite.java:139)
# at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:145)
# at $_dot_.recreate_utf8_bug.invokeOther9:times(./recreate_utf8_bug.rb)
# at $_dot_.recreate_utf8_bug.RUBY$block$\=\,\|recreate_utf8_bug\,rb$1(./recreate_utf8_bug.rb:10)
# at org.jruby.runtime.CompiledIRBlockBody.callDirect(CompiledIRBlockBody.java:129)
# at org.jruby.runtime.IRBlockBody.call(IRBlockBody.java:64)
# at org.jruby.runtime.Block.call(Block.java:125)
# at org.jruby.RubyProc.call(RubyProc.java:334)
# at org.jruby.RubyProc.call(RubyProc.java:240)
# at org.jruby.internal.runtime.RubyRunnable.run(RubyRunnable.java:99)
# at java.lang.Thread.run(Thread.java:745)
#
# TEST FAILED because $last_thread_error was set: java.lang.ArrayIndexOutOfBoundsException: 6
# $
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment