This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]