Crash invoke()'ing Method with "double" as return type

Martin Egholm Nielsen martin@egholm-nielsen.dk
Mon Jun 26 14:31:00 GMT 2006


Hi there,

Just ran into a strange problem on my target: When calling invoke() on a 
java.lang.reflect.Method returning a double, my target crashes with an 
"Illegal instruction" attempting to return:

--- 8< 8< 8< ---
# ./tdr1
Constructing...
Returning double...
Pre non-reflective test on double: 3.14
Constructing...
1 about to invoke: public int 
men.gcjdoublereflection.TestDoubleReflection1.gimmeInt()
Returning int...
2 done invoking: public int 
men.gcjdoublereflection.TestDoubleReflection1.gimmeInt()
3 about to invoke: public double 
men.gcjdoublereflection.TestDoubleReflection1.gimmeDouble()
Returning double...
Illegal instruction
--- 8< 8< 8< ---

(whereas returning "int" works.)

And it's not working on double in general that sucks - output line 3 is 
the output after invoking the same method in a non-reflective manner.

This is on my ancient (hacked) GCJ 3.4.x, running on my PPC405EP 
target... I know it's old - but does it ring a bell?

The program producing the output follows:

=== 8< 8< 8< ===
package men.gcjdoublereflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class TestDoubleReflection1
{
   public TestDoubleReflection1()
   {
     System.out.println("Constructing...");
   } // constr.

   public int gimmeInt()
   {
     System.out.println("Returning int...");

     return 3;
   } // gimmeInt

   public double gimmeDouble()
   {
     System.out.println("Returning double...");

     return 3.14;
   } // gimmeDouble

   public static void main(String[] args) throws Exception
   {
     System.out.println("Pre non-reflective test on double: "
         + new TestDoubleReflection1().gimmeDouble());

     Class clazz = Class
         .forName("men.gcjdoublereflection.TestDoubleReflection1");
     Constructor constr = clazz.getConstructor(new Class[0]);
     Object instance = constr.newInstance(new Object[0]);

     Method intMethod = clazz.getMethod("gimmeInt", new Class[0]);
     System.out.println("1 about to invoke: " + intMethod);
     intMethod.invoke(instance, new Object[0]);
     System.out.println("2 done invoking: " + intMethod);

     Method doubleMethod = clazz.getMethod("gimmeDouble", new Class[0]);
     System.out.println("3 about to invoke: " + doubleMethod);
     doubleMethod.invoke(instance, new Object[0]);
     System.out.println("4 done invoking: " + doubleMethod);
   } // main
} // TDR1



More information about the Java mailing list