harmony-commits mailing list archives

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

     [ https://issues.apache.org/jira/browse/HARMONY-4355?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Pavel Pervov updated HARMONY-4355:
----------------------------------

    Attachment: H4355.patch

Yes, this is correct - our implementation of method lookup was incorrect. It was not looking
recursively in superinterfaces of superclasses.

Attached patch fixes the identified issue.

BTW, the test may be as well implemented in pure Java with recompilation of few classes.

> [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: H4355.patch, 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