1

I used a little Jruby script from http://www.javaworld.com/javaworld/jw-07-2006/jw-0717-ruby.html to test invokedynamic:

class ADuck
    def quack()
        puts "quack A";
    end
end

class BDuck
    def quack()
        puts "quack B";
    end
end

def quack_it(duck)
    duck.quack
end

a = ADuck.new
b = BDuck.new
quack_it(a)
quack_it(b)

But when I compile in with JRuby to Java classfiles and then try to execute it I get the following exception:

Java HotSpot(TM) 64-Bit Server VM warning: Use -XX:+UnlockDiagnosticVMOptions be
fore EnableInvokeDynamic flag
Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot
 be cast to java.lang.invoke.SwitchPoint
        at     org.jruby.runtime.invokedynamic.InvokeDynamicSupport.constantFallback
(InvokeDynamicSupport.java:659)
        at duck_typing.__file__(duck_typing.rb:22)
        at duck_typing.load(duck_typing.rb)
        at duck_typing.main(duck_typing.rb)

My system: JDK 1.7.0_09 64bit on Windows 7 64bit, JRuby 1.7.2

Used commandlines:

jruby -Xcompile.invokedynamic=true -S jrubyc duck_typing.rb
java -XX:+UnlockExperimentalVMOptions -XX:+EnableInvokeDynamic -cp .;jruby-complete-1.7.2.jar duck_typing

A while ago I tested it on linux machine with same results and on Windows jdk8. With JDK8 it worked, but gave me problems using the classfiles in another project.

Has anyone a idee how to fix it? How can I use JRuby with indy on Java 7?

Thorben
  • 953
  • 13
  • 28

1 Answers1

0

Except for the JRuby convenience parameter --server, all JVM runtime parameters use the -J option, followed by the specific JVM setting. For example:

Heap space settings: jruby -J-X

JRuby runtime settings: jruby -J-D

All the settings described in the following sections are JVM settings.

https://github.com/jruby/jruby/wiki/PerformanceTuning

try this instead

jruby -J-Xcompile.invokedynamic=true -S jrubyc duck_typing.rb
Sully
  • 14,672
  • 5
  • 54
  • 79