harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Vera Petrashkova (JIRA)" <j...@apache.org>
Subject [jira] Created: (HARMONY-4355) [drlvm][classloader] compatibility: VM throws NoClassDefFoundError when the implementation of some abstract method is absent while RI throws AbstractMethodError
Date Fri, 06 Jul 2007 04:52:04 GMT
[drlvm][classloader] compatibility: VM throws NoClassDefFoundError when the implementation
of some abstract method is absent while RI throws AbstractMethodError
----------------------------------------------------------------------------------------------------------------------------------------------------------------

                 Key: HARMONY-4355
                 URL: https://issues.apache.org/jira/browse/HARMONY-4355
             Project: Harmony
          Issue Type: Bug
          Components: DRLVM
            Reporter: Vera Petrashkova
            Priority: Minor
         Attachments: invoke.zip

According to J2SE 1.5 specifications of
invokestatic  and invokevirtual 
instructions
     During resolution of the symbolic reference to the method, any of the exceptions listed
"Method resolution" can be thrown.
     Otherwise, if the resolved method is an instance method, the invokestatic/invokevirtual
instruction throws 
      IncompatibleClassChangeError.

The specification also says about resolving a method reference in class C: 

1) Method resolution checks whether C is a class or an interface. 
    - If C is an interface VM  throws IncompatibleClassChangeError. 
2 ) Method resolution attempts to look up the referenced method in C and its superclasses:

   - If C declares a method with the name and descriptor specified by the method reference,

     method lookup succeeds. 
   - Otherwise, if C has a superclass, step 2 of method lookup is recursively 
      invoked on the direct superclass of C. 
3)  Otherwise, method lookup attempts to locate the referenced method in any of the superinterfaces

      of the specified class C. 
     - If any superinterface of C declares a method with the name and descriptor specified
by the method 
       reference, method lookup succeeds. 
     - Otherwise, method lookup fails. 

If method lookup fails, method resolution throws a NoSuchMethodError. If method lookup succeeds
and the method is abstract, but C is not abstract, method resolution throws an AbstractMethodError.


The following test which uses synthetic classes demonstrates that DRLVM and RI behavior are
differ
when  some method is declared in the interface but the its implementation is absent.

RI throws AbstractMethodError but DRLVM returns NoClassDefFoundError.

This occurs because RI resolves method reference using steps 2 and 3 but DRLVM uses only step
2.

--------------test.java------------
public class test {
    public static void main(String[] args) {
        System.out.println("------invokestatic instruction");
        try {
            System.out.println(new invokeS().test(args));
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("------invokevirtual instruction");
        try {
            System.out.println(new invokeV().test(args));
        } catch (Throwable e){
            e.printStackTrace();
        }
    }
}
---------------------invokeS.jj---------------
.class public invokeS
.super java/lang/Object

; standard initializer
.method public <init>()V
   aload_0
   invokenonvirtual java/lang/Object/<init>()V
   return
.end method

.method public test([Ljava/lang/String;)I
   .limit stack 2
   .limit locals 2
   invokestatic invokeSn/testNeg()I   
   sipush 104
   ireturn   
.end method

.method public test1([Ljava/lang/String;)I
   .limit stack 2
   .limit locals 2
   invokestatic invokeSn1/testNeg()I   
   sipush 104
   ireturn   
.end method
----------------invokeSn.jj-------------
.class public invokeSn
.super invokeSc1
	
; standard initializer
.method public <init>()V
   aload_0
   invokenonvirtual invokeSc1/<init>()V
   return
.end method

.method public static testNeg()I
   .limit stack 2
   .limit locals 1

   invokestatic invokeSn/testAbstr()I
   ireturn   
.end method
----------------invokeV.jj-----------------
.class public invokeV
.super java/lang/Object

; standard initializer
.method public <init>()V
   aload_0
   invokenonvirtual java/lang/Object/<init>()V
   return
.end method

.method public test([Ljava/lang/String;)I
   .limit stack 2
   .limit locals 2      
   invokestatic invokeVn/testNeg()I   
   sipush 104
   ireturn
.end method
----------invokeVn.jj----------
.class public invokeVn
.super invokeSc1
	
; standard initializer
.method public <init>()V
   aload_0
   invokenonvirtual invokeSc1/<init>()V
   return
.end method

.method public static testNeg()I
   .limit stack 3
   .limit locals 2 

   new invokeVn
   dup
   invokespecial invokeVn/<init>()V
   invokevirtual invokeVn/testAbstr()I
   ireturn   
.end method
----------invokeSc1.jj-----------
.class public invokeSc1
.super java/lang/Object
.implements invokeSc2

; standard initializer
.method public <init>()V
   aload_0
   invokenonvirtual java/lang/Object/<init>()V
   return
.end method
-----------invokeSc2.jj------------------------
.interface abstract public invokeSc2
.super java/lang/Object
.implements invokeSc3
----------- invokeSc3.jj------------------------
.interface abstract public invokeSc3
.super java/lang/Object
.implements invokeSc4
----------- invokeSc4.jj------------------------
.interface abstract public invokeSc4
.super java/lang/Object
.implements invokeSc5
----------- invokeSc5.jj------------------------
.interface abstract public invokeSc5
.super java/lang/Object

; method
.method abstract public testAbstr()I   
.end method
---------------------------
Output:
=======
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)
------invokestatic instruction
java.lang.AbstractMethodError: invokeSn.testAbstr()I
        at invokeSn.testNeg(invokeSn.jj)
        at invokeS.test(invokeS.jj)
        at test.main(test.java:5)
------invokevirtual instruction
java.lang.AbstractMethodError: invokeVn.testAbstr()I
        at invokeVn.testNeg(invokeVn.jj)
        at invokeV.test(invokeV.jj)
        at test.main(test.java:11)

Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors,
as applicable.
java version "1.5.0"
pre-alpha : not complete or compatible
svn = r551077, (Jun 27 2007), Windows/ia32/msvc 1310, release build
http://harmony.apache.org
------invokestatic instruction
java.lang.NoSuchMethodError: invokeSn.testAbstr()I while resolving constant pool entry at
index 16 in class invokeSn
        at invokeS.test(invokeS.jj)
        at test.main(test.java:5)
------invokevirtual instruction
java.lang.NoSuchMethodError: invokeVn.testAbstr()I while resolving constant pool entry at
index 3 in class invokeVn
        at invokeV.test(invokeV.jj)
        at test.main(test.java:11)


This bug causes the failure of VTS test 
vm/jvms/instructions/invokeReturn/invokestatic/invokestatic11/invokestatic1102/invokestatic1102.xml



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message