[Jastadd] [bug report] no need to be a static field to have the ConstantValue attribute

From: Na, Hyunik <hina_at_kaist.ac.kr>
Date: Mon, 30 Apr 2012 14:45:00 +0900

Hello JastAddJ developers,


In Attributes.jrag in Java1.4Backend, FieldDeclaration.attributes() is
defined as follows:



  eq FieldDeclaration.attributes() {

    ArrayList l = new ArrayList();

    if(isStatic() && isFinal() && isConstant() && (type().isPrimitive() ||

      l.add(new ConstantValueAttribute(hostType().constantPool(), this));

    return l;




It seems that the "iStatic() &&" should be dropped from the if-condition

because a ConstantValue attribute can be generated for a non-static field.

That is, the condition is too strict.


Because of this, JastAddJ rejects a correct program as described below.


1. Put the following A.java and B.java in a directory:


-=-=-= A.java

class A extends B {

  void test() {

    short s = b;





-=-=-= B.java

class B {

  final int b = 7;




2. Compile A.java with JastAddJ's JavaCompiler. Then it will be compiled


3. Compile B.java to generate B.class.


4. Compile A.java again. (Now, unlike in step 2, class B is loaded from
B.class rather than from B.java because of step 3)

Unlike in step 2, an error message is emitted.





  Semantic Error: can not assign s of type short a value of type int



The b field in the JastAddJ generated B.class does not have ConstantValue
attribute (because it is not static),

and hence it is not taken as a constant when loaded from the class file
(but, it is when loaded from B.java).

So, narrowing from int to short is not allowed in the assignment at line 3
of A.java when loaded from the class file.


This problem was observed when compiling
sun/reflect/MethodAccessorGenerator.java in the OpenJDK1.6


Please check this.


- Hyunik.

Received on Mon Apr 30 2012 - 07:45:15 CEST

This archive was generated by hypermail 2.3.0 : Wed Apr 16 2014 - 17:19:06 CEST