Precompiled class raises exception, but in interpreted mode - works well. -------------------------------------------------------------------------
Key: JRUBY-6025 URL: https://jira.codehaus.org/browse/JRUBY-6025 Project: JRuby Issue Type: Bug Components: Compiler Affects Versions: JRuby 1.6.4, JRuby 1.6.3, JRuby 1.7 Environment: Windows 7 SP1 x64, Java 1.6.0_21-b07, JRuby 1.6.3 & JRuby 1.6.4 & JRuby 1.7.0 snapshot from 26.08.11 Reporter: Maxim Sokolovsky Attachments: Mock.java, test2.rb I'm trying to use [JMonkeyEngine3|http://jmonkeyengine.org] framework with JRuby and stumbled on exceptions, running precompiled code. You can reproduce error with files in attachment, no other files needed. {code:title=Mock.java|borderStyle=solid} public abstract class Mock { public Mock() { System.out.println("Mock constructor invoked."); } public void start() { System.out.println("start() method invoked from Mock class.\nInvoking callbackMethod() from main class..."); callbackMethod(); } public void callbackMethod() { System.out.println("callbackMethod() invoked from Mock object!"); } } {code} {code:title=test2.rb|borderStyle=solid} require 'java' import 'Mock' class Test2 < Mock java_signature 'public static void main(String[])' def self.main(args) puts "main(args) method from child class started." app = Test2.new app.start() end java_signature 'public void callbackMethod()' def callbackMethod() puts "callbackMethod from child class started." end end puts "Static code from bottom of child file started." Test2.main(ARGV) {code} Running in interpreted mode works well: {noformat} C:\aXe1\dev\ruby\test\jruby>jruby test2.rb Static code from bottom of child file started. main(args) method from child class started. Mock constructor invoked. start() method invoked from Mock class. Invoking callbackMethod() from main class... callbackMethod from child class started. {noformat} Then I removed two last lines in 'test2.rb', cause main(String[]) method should be invoked automatically, according to [GeneratingJavaClasses wiki page|https://github.com/jruby/jruby/wiki/GeneratingJavaClasses]. Running precompiled throws an exception: {noformat} C:\aXe1\dev\ruby\test\jruby>jrubyc --javac test2.rb C:\aXe1\dev\ruby\test\jruby>java -cp .;jruby-complete-1.7.0.dev.jar Test2 main(args) method from child class started. Mock constructor invoked. Exception in thread "main" java.lang.ClassCastException: Test2 cannot be cast to org.jruby.java.proxies.JavaProxy at org.jruby.java.proxies.ConcreteJavaProxy$3.needsCreate(ConcreteJavaPr oxy.java:88) at org.jruby.java.proxies.ConcreteJavaProxy$3.call(ConcreteJavaProxy.jav a:137) at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSi te.java:292) at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java: 135) at org.jruby.ast.CallNoArgNode.interpret(CallNoArgNode.java:63) at org.jruby.ast.LocalAsgnNode.interpret(LocalAsgnNode.java:123) at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104) at org.jruby.ast.BlockNode.interpret(BlockNode.java:71) at org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.ja va:75) at org.jruby.internal.runtime.methods.InterpretedMethod.call(Interpreted Method.java:190) at org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.j ava:179) at org.jruby.RubyClass.finvoke(RubyClass.java:691) at org.jruby.javasupport.util.RuntimeHelpers.invoke(RuntimeHelpers.java: 544) at Test2.main(Test2.java:80) {noformat} If I leave last lines uncommented, then it work one time and then tries to start again and throw same exception. So I think trouble is in some runtime class bootstraping. {noformat} C:\aXe1\dev\ruby\test\jruby>jrubyc --javac test2.rb C:\aXe1\dev\ruby\test\jruby>java -cp .;jruby-complete-1.7.0.dev.jar Test2 Static code from bottom of child file started. main(args) method from child class started. Mock constructor invoked. start() method invoked from Mock class. Invoking callbackMethod() from main class... callbackMethod from child class started. main(args) method from child class started. Mock constructor invoked. Exception in thread "main" java.lang.ClassCastException: Test2 cannot be cast to org.jruby.java.proxies.JavaProxy at org.jruby.java.proxies.ConcreteJavaProxy$3.needsCreate(ConcreteJavaPr oxy.java:88) at org.jruby.java.proxies.ConcreteJavaProxy$3.call(ConcreteJavaProxy.jav a:137) at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java: 133) at org.jruby.ast.CallNoArgNode.interpret(CallNoArgNode.java:63) at org.jruby.ast.LocalAsgnNode.interpret(LocalAsgnNode.java:123) at org.jruby.ast.NewlineNode.interpret(NewlineNode.java:104) at org.jruby.ast.BlockNode.interpret(BlockNode.java:71) at org.jruby.evaluator.ASTInterpreter.INTERPRET_METHOD(ASTInterpreter.ja va:75) at org.jruby.internal.runtime.methods.InterpretedMethod.call(Interpreted Method.java:190) at org.jruby.internal.runtime.methods.DefaultMethod.call(DefaultMethod.j ava:179) at org.jruby.RubyClass.finvoke(RubyClass.java:691) at org.jruby.javasupport.util.RuntimeHelpers.invoke(RuntimeHelpers.java: 544) at Test2.main(Test2.java:80) {noformat} I think this as a bug of JRuby, cause behavior of interpreted and precompiled code differences. Also this is true both for 1.8 and 1.9 modes. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email