Details
-
Type:
Bug
-
Status:
Closed
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: JRuby 1.6.3
-
Fix Version/s: JRuby 1.6.4
-
Component/s: Parser, Ruby 1.9.2
-
Labels:None
-
Number of attachments :
Description
I've fixed this in 6d72809 on jruby-1_6 and 38de906 on master, but it needs tests. The problem was that the magic comment parsing expected to encounter newline before EOF, resulting in it walking off the end of the file and trying to process a null comment. This resulted in an NPE. Here's the full long log of the NPE, along with the short log Rubyists see.
~/projects/jruby $ jruby --1.9 -rffi -e 1
LoadError: load error: ffi/enum -- java.lang.NullPointerException: null
require at org/jruby/RubyKernel.java:1047
require at /Users/headius/projects/jruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:29
(root) at /Users/headius/projects/jruby/lib/ruby/site_ruby/shared/ffi/ffi.rb:81
require at org/jruby/RubyKernel.java:1047
require at /Users/headius/projects/jruby/lib/ruby/site_ruby/shared/ffi/ffi.rb:29
(root) at /Users/headius/projects/jruby/lib/ruby/site_ruby/shared/ffi.rb:1
~/projects/jruby $ jruby -d -Xbacktrace.style=raw --1.9 -rffi -e 1
Exception `LoadError' at java/lang/Thread.java:1570 - Win32API only supported on win32
/Users/headius/projects/jruby/lib/ruby/site_ruby/shared/ffi/library.rb:154 warning: shadowing outer local variable - lib
java.lang.NullPointerException
at org.jruby.lexer.yacc.RubyYaccLexer.parseMagicComment(RubyYaccLexer.java:741)
at org.jruby.lexer.yacc.RubyYaccLexer.readComment(RubyYaccLexer.java:808)
at org.jruby.lexer.yacc.RubyYaccLexer.yylex(RubyYaccLexer.java:1003)
at org.jruby.lexer.yacc.RubyYaccLexer.nextToken(RubyYaccLexer.java:313)
at org.jruby.parser.Ruby19Parser.yyparse(Ruby19Parser.java:1416)
at org.jruby.parser.Ruby19Parser.yyparse(Ruby19Parser.java:1367)
at org.jruby.parser.Ruby19Parser.parse(Ruby19Parser.java:4232)
at org.jruby.parser.Parser.parse(Parser.java:112)
at org.jruby.parser.Parser.parse(Parser.java:83)
at org.jruby.parser.Parser.parse(Parser.java:91)
at org.jruby.Ruby.parseFile(Ruby.java:2276)
at org.jruby.Ruby.parseFile(Ruby.java:2287)
at org.jruby.Ruby.loadFile(Ruby.java:2438)
at org.jruby.runtime.load.ExternalScript.load(ExternalScript.java:66)
at org.jruby.runtime.load.LoadService.tryLoadingLibraryOrScript(LoadService.java:755)
at org.jruby.runtime.load.LoadService.smartLoad(LoadService.java:334)
at org.jruby.runtime.load.LoadService.require(LoadService.java:381)
at org.jruby.runtime.load.LoadService.lockAndRequire(LoadService.java:306)
at org.jruby.RubyKernel.requireCommon(RubyKernel.java:1055)
at org.jruby.RubyKernel.require19(RubyKernel.java:1047)
at org.jruby.RubyKernel$s$1$0$require19.call(RubyKernel$s$1$0$require19.gen:65535)
at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodOneOrNBlock.call(JavaMethod.java:319)
at org.jruby.internal.runtime.methods.AliasMethod.call(AliasMethod.java:61)
at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:167)
at org.jruby.ast.FCallOneArgNode.interpret(FCallOneArgNode.java:36)
at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)
at org.jruby.ast.RescueNode.executeBody(RescueNode.java:216)
at org.jruby.ast.RescueNode.interpretWithJavaExceptions(RescueNode.java:120)
at org.jruby.ast.RescueNode.interpret(RescueNode.java:110)
at org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75)
at org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:190)
at org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:179)
at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:312)
at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:169)
at org.jruby.ast.FCallOneArgNode.interpret(FCallOneArgNode.java:36)
at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)
at org.jruby.ast.BlockNode.interpret(BlockNode.java:71)
at org.jruby.ast.RootNode.interpret(RootNode.java:129)
at org.jruby.evaluator.ASTInterpreter.INTERPRET_ROOT(ASTInterpreter.java:120)
at org.jruby.Ruby.runInterpreter(Ruby.java:702)
at org.jruby.Ruby.loadFile(Ruby.java:2443)
at org.jruby.runtime.load.ExternalScript.load(ExternalScript.java:66)
at org.jruby.runtime.load.LoadService.tryLoadingLibraryOrScript(LoadService.java:755)
at org.jruby.runtime.load.LoadService.smartLoad(LoadService.java:334)
at org.jruby.runtime.load.LoadService.require(LoadService.java:381)
at org.jruby.runtime.load.LoadService.lockAndRequire(LoadService.java:306)
at org.jruby.RubyKernel.requireCommon(RubyKernel.java:1055)
at org.jruby.RubyKernel.require19(RubyKernel.java:1047)
at org.jruby.RubyKernel$s$1$0$require19.call(RubyKernel$s$1$0$require19.gen:65535)
at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodOneOrNBlock.call(JavaMethod.java:319)
at org.jruby.internal.runtime.methods.AliasMethod.call(AliasMethod.java:61)
at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:167)
at org.jruby.ast.FCallOneArgNode.interpret(FCallOneArgNode.java:36)
at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)
at org.jruby.ast.RescueNode.executeBody(RescueNode.java:216)
at org.jruby.ast.RescueNode.interpretWithJavaExceptions(RescueNode.java:120)
at org.jruby.ast.RescueNode.interpret(RescueNode.java:110)
at org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.java:75)
at org.jruby.internal.runtime.methods.InterpretedMethod.call(InterpretedMethod.java:190)
at org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.java:179)
at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:312)
at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:169)
at org.jruby.ast.FCallOneArgNode.interpret(FCallOneArgNode.java:36)
at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104)
at org.jruby.ast.RootNode.interpret(RootNode.java:129)
at org.jruby.evaluator.ASTInterpreter.INTERPRET_ROOT(ASTInterpreter.java:120)
at org.jruby.Ruby.runInterpreter(Ruby.java:702)
at org.jruby.Ruby.loadFile(Ruby.java:2443)
at org.jruby.runtime.load.ExternalScript.load(ExternalScript.java:66)
at org.jruby.runtime.load.LoadService.tryLoadingLibraryOrScript(LoadService.java:755)
at org.jruby.runtime.load.LoadService.smartLoad(LoadService.java:334)
at org.jruby.Ruby.init(Ruby.java:1090)
at org.jruby.Ruby.newInstance(Ruby.java:182)
at org.jruby.Main.internalRun(Main.java:182)
at org.jruby.Main.run(Main.java:164)
at org.jruby.Main.run(Main.java:148)
at org.jruby.Main.main(Main.java:128)
Exception `LoadError' at java/lang/Thread.java:1570 - load error: ffi/enum -- java.lang.NullPointerException: null
Exception `LoadError' at java/lang/Thread.java:1570 - load error: ffi/enum -- java.lang.NullPointerException: null
LoadError: load error: ffi/enum -- java.lang.NullPointerException: null
getStackTrace at java/lang/Thread.java:1570
getBacktraceData at org/jruby/runtime/backtrace/TraceType.java:60
getBacktrace at org/jruby/runtime/backtrace/TraceType.java:26
prepareBacktrace at org/jruby/RubyException.java:160
preRaise at org/jruby/exceptions/RaiseException.java:205
preRaise at org/jruby/exceptions/RaiseException.java:195
<init> at org/jruby/exceptions/RaiseException.java:112
newRaiseException at org/jruby/Ruby.java:3315
newLoadError at org/jruby/Ruby.java:3206
newLoadErrorFromThrowable at org/jruby/runtime/load/LoadService.java:777
tryLoadingLibraryOrScript at org/jruby/runtime/load/LoadService.java:770
smartLoad at org/jruby/runtime/load/LoadService.java:334
require at org/jruby/runtime/load/LoadService.java:381
lockAndRequire at org/jruby/runtime/load/LoadService.java:306
requireCommon at org/jruby/RubyKernel.java:1055
require19 at org/jruby/RubyKernel.java:1047
call at org/jruby/RubyKernel$s$1$0$require19.gen:65535
call at org/jruby/internal/runtime/methods/JavaMethod.java:319
call at org/jruby/internal/runtime/methods/AliasMethod.java:61
call at org/jruby/runtime/callsite/CachingCallSite.java:167
interpret at org/jruby/ast/FCallOneArgNode.java:36
interpret at org/jruby/ast/NewlineNode.java:104
executeBody at org/jruby/ast/RescueNode.java:216
interpretWithJavaExceptions at org/jruby/ast/RescueNode.java:120
interpret at org/jruby/ast/RescueNode.java:110
INTERPRET_METHOD at org/jruby/evaluator/ASTInterpreter.java:75
call at org/jruby/internal/runtime/methods/InterpretedMethod.java:190
call at org/jruby/internal/runtime/methods/DefaultMethod.java:179
cacheAndCall at org/jruby/runtime/callsite/CachingCallSite.java:312
call at org/jruby/runtime/callsite/CachingCallSite.java:169
interpret at org/jruby/ast/FCallOneArgNode.java:36
interpret at org/jruby/ast/NewlineNode.java:104
interpret at org/jruby/ast/BlockNode.java:71
interpret at org/jruby/ast/RootNode.java:129
INTERPRET_ROOT at org/jruby/evaluator/ASTInterpreter.java:120
runInterpreter at org/jruby/Ruby.java:702
loadFile at org/jruby/Ruby.java:2443
load at org/jruby/runtime/load/ExternalScript.java:66
tryLoadingLibraryOrScript at org/jruby/runtime/load/LoadService.java:755
smartLoad at org/jruby/runtime/load/LoadService.java:334
require at org/jruby/runtime/load/LoadService.java:381
lockAndRequire at org/jruby/runtime/load/LoadService.java:306
requireCommon at org/jruby/RubyKernel.java:1055
require19 at org/jruby/RubyKernel.java:1047
call at org/jruby/RubyKernel$s$1$0$require19.gen:65535
call at org/jruby/internal/runtime/methods/JavaMethod.java:319
call at org/jruby/internal/runtime/methods/AliasMethod.java:61
call at org/jruby/runtime/callsite/CachingCallSite.java:167
interpret at org/jruby/ast/FCallOneArgNode.java:36
interpret at org/jruby/ast/NewlineNode.java:104
executeBody at org/jruby/ast/RescueNode.java:216
interpretWithJavaExceptions at org/jruby/ast/RescueNode.java:120
interpret at org/jruby/ast/RescueNode.java:110
INTERPRET_METHOD at org/jruby/evaluator/ASTInterpreter.java:75
call at org/jruby/internal/runtime/methods/InterpretedMethod.java:190
call at org/jruby/internal/runtime/methods/DefaultMethod.java:179
cacheAndCall at org/jruby/runtime/callsite/CachingCallSite.java:312
call at org/jruby/runtime/callsite/CachingCallSite.java:169
interpret at org/jruby/ast/FCallOneArgNode.java:36
interpret at org/jruby/ast/NewlineNode.java:104
interpret at org/jruby/ast/RootNode.java:129
INTERPRET_ROOT at org/jruby/evaluator/ASTInterpreter.java:120
runInterpreter at org/jruby/Ruby.java:702
loadFile at org/jruby/Ruby.java:2443
load at org/jruby/runtime/load/ExternalScript.java:66
tryLoadingLibraryOrScript at org/jruby/runtime/load/LoadService.java:755
smartLoad at org/jruby/runtime/load/LoadService.java:334
init at org/jruby/Ruby.java:1090
newInstance at org/jruby/Ruby.java:182
internalRun at org/jruby/Main.java:182
run at org/jruby/Main.java:164
run at org/jruby/Main.java:148
main at org/jruby/Main.java:128
FWIW, a simple workaround is to add \n to the single line in lib/ruby/site_ruby/shared/ffi/enum.rb.