In this test case (from jakarta-commons-collections) we expect to see an
OutOfMemoryError thrown.  This doesn't always happen as it should, but only
when compiling from bytecode.  And only with ecj...


public class OutOfMemoryError
{
  private static void fail(String msg)
  {
    System.err.println(msg);
    System.exit(1);
  }

  private static void gc() {
    try {
      // trigger GC
      byte[][] tooLarge = new byte[1000000000][1000000000];
      fail("you have too much RAM");
    } catch (java.lang.OutOfMemoryError ex) {
      System.gc(); // ignore
    }
  }

  public static void main(String[] argv)
  {
    gc();
  }
}

It depends on exactly how the bytecode compiler generates code.

This one fails:

Method name:"gc" private static Signature: ()void
Attribute "Code", length:70, max_stack:2, max_locals:0, code_length:22
  0: ldc <Integer 1000000000>
  2: ldc <Integer 1000000000>
  4: multianewarray <Class [[B> 2
  8: pop

This one doesn't fail:

Method name:"gc" private static Signature: ()void
Attribute "Code", length:66, max_stack:2, max_locals:1, code_length:22
  0: ldc <Integer 1000000000>
  2: ldc <Integer 1000000000>
  4: multianewarray <Class [[B> 2
  8: astore_0

It seems that the pop instruction in the first version causes the
multianewarray never to be invoked.  The "oh so clever" ecj notices that
tooLarge is never used, so doesn't generate a slot for it.


-- 
           Summary: multianewarray not always evaluated when compiling from
                    bytecode
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: java
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: aph at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28423

Reply via email to