harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Irina Arkhipets (JIRA)" <j...@apache.org>
Subject [jira] Created: (HARMONY-1874) [drlvm][jit] Jitrino/OPT does not reject class which contains aastore instruction with incorrect argument on Linux EM-64T
Date Mon, 16 Oct 2006 08:57:35 GMT
[drlvm][jit] Jitrino/OPT does not reject class which contains aastore instruction with incorrect
argument on Linux EM-64T
-------------------------------------------------------------------------------------------------------------------------

                 Key: HARMONY-1874
                 URL: http://issues.apache.org/jira/browse/HARMONY-1874
             Project: Harmony
          Issue Type: Bug
          Components: DRLVM
         Environment: Linux EM-64T
            Reporter: Irina Arkhipets
         Attachments: cases.j, test.java

J2SE VM Specification reads about the aastore instruction:
...
The type of value must be assignment compatible (§2.6.6) with the type of the components
of the array referenced by arrayref. Assignment of a value of reference type S (source) to
a variable of reference type T (target) is allowed only when the type S supports all the operations
defined on type T. The detailed rules follow:

    - If S is a class type, then: 
        * If T is a class type, then S must be the same class (§2.8.1) as T, or S must be
a subclass of T; 
        * If T is an interface type, S must implement (§2.13) interface T. 

    - If S is an array type, namely the type SC[], that is, an array of components of type
SC, then: 
        * If T is a class type, T must be Object (§2.4.6), or: 
            ** If T is an array type, namely the type TC[], an array of components of type
TC, then eitherTC and SC must be the same primitive type, or 
            ** TC and SC must both be reference types with type SC assignable to TC, by these
rules. 

S cannot be an interface type, because there are no instances of interfaces, only instances
of classes and arrays.
...

However,  VM does not reject class which contains incorrect aastore instructions:
     - when T is class but it is  superclass of S
     - when T is interface but S is not implemented T
     - if S is interface and T is not Object class
     - if T and S are different interfaces

This bug is reproducible on Linux EM-64T with jitrino OPT only.
It is not reproducible with interpreter and JET.

Please, compile the following sources and run the test class with "-Xem:opt" switch on Linux
EM-64T server to reproduce this bug:

--------- test.java ---------
public class test {    

    public static void main (String [] args)  throws InterruptedException {

        /* T is class but it is  superclass of S */
        try {
            new cases().test1();
            System.out.println("Case 1: FAILED");
        } catch (ArrayStoreException e) {
            System.out.println("Case 1: PASSED");
        }

        /* T is interface but S is not implemented T */
        try {
            new cases().test2();
            System.out.println("Case 2: FAILED");
        } catch (ArrayStoreException e) {
            System.out.println("Case 2: PASSED");
        }

        /* S is interface and T is not Object class */
        try {
            new cases().test3();
            System.out.println("Case3: FAILED");
        } catch (ArrayStoreException e) {
            System.out.println("Case 3: PASSED");
        }

        /* if T and S are different interfaces */
        try {
            new cases().test4();
            System.out.println("Case3: FAILED");
        } catch (ArrayStoreException e) {
            System.out.println("Case 3: PASSED");
        }
   }
}

class MyClass extends MySuperClass {}
class MySuperClass {}
interface MyInterface {}
interface MyInterface1 {}
class MyImplClass implements MyInterface {}

--------- cases.j ---------
.class public cases
.super java/lang/Object

.field public testField LMyInterface;

.method public <init>()V
    aload_0
    invokespecial java/lang/Object/<init>()V
    return
.end method 

.method public test1()V
    .limit locals 3
    .limit stack 4
    iconst_4
    anewarray MyClass
    astore_1
    aload_1
    iconst_1
    new MySuperClass
    dup
    invokespecial MySuperClass/<init>()V
    aastore 
    return
.end method

.method public test2()V
    .limit locals 3
    .limit stack 4
    iconst_4
    anewarray MyInterface
    astore_1 
    aload_1
    iconst_1
    new MyClass
    dup
    invokespecial MyClass/<init>()V
    aastore 
    return
.end method

.method public test3()V
    .limit locals 3
    .limit stack 4
    iconst_4
    anewarray MyClass
    astore_1 
    aload_0
    new MyImplClass
    dup
    invokespecial MyImplClass/<init>()V
    putfield cases/testField LMyInterface;
    aload_1
    iconst_1
    aload_0
    getfield cases/testField LMyInterface;
    aastore ; must throw java/lang/ArrayStoreException
    return
.end method

.method public test4()V
    .limit locals 3
    .limit stack 4
    iconst_4
    anewarray MyInterface1
    astore_1
    aload_0
    new MyImplClass
    dup
    invokespecial MyImplClass/<init>()V
    putfield cases/testField LMyInterface;
    aload_1
    iconst_1
    aload_0
    getfield cases/testField LMyInterface;
    aastore 
    return
.end method
------------------------------

Sample output is:
...
Case 1: FAILED
Case 2: FAILED
Case3: FAILED
Case3: FAILED
...


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

Mime
View raw message