JRuby (please use github issues at http://bugs.jruby.org)
  1. JRuby (please use github issues at http://bugs.jruby.org)
  2. JRUBY-5294

Closure conversion doesn't play nice with some interface method names


    • Type: Bug Bug
    • Status: Closed Closed
    • Priority: Major Major
    • Resolution: Incomplete
    • Affects Version/s: JRuby 1.5.6
    • Fix Version/s: None
    • Component/s: Java Integration
    • Labels:
    • Environment:
      Mac OS X 10.6.5
      Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
      Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)
      JRuby 1.5.6
    • Number of attachments :


      Define a Java interface with a single-argument method named 'exec'. Define a Java class that defines a method that uses instances of that interface as a callback. Use JRuby to invoke the class's method using a block as its argument, attempting to take advantage of the closure conversion feature of JRuby.

      When the callback is invoked by the Java method, rather than running the code defined in the block, the system attempts to coerce the argument to a String and Kernel.exec it. The same issue happens for any Kernel.* method name I've tried.

      I'm a complete Ruby/JRuby noob, but based on a quick perusal of the code, it looks like closure conversion is implemented by defining method_missing on a fresh new RubyClass, and that any methods already defined for Ruby's Object are going to be invoked ahead of any interface methods with the same names. This behavior may be completely expected, then; if so, I apologize for the trouble.

      I've attached example code illustrating the problem.

      1. jruby_exec_method_problem.tar.gz
        0.6 kB
        Jason Fager
      2. output_broken.log
        1 kB
        Richard Nienaber
      3. output_works.log
        0.5 kB
        Richard Nienaber


        No work has yet been logged on this issue.


          • Assignee:
            Charles Oliver Nutter
            Jason Fager


            • Created: