Created
February 15, 2016 21:08
-
-
Save marshalium/3e62c2affbd2ce95757f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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