commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Julius Davies (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (LANG-816) introduce ConstantUtils class to prevent Javac from inlining constants
Date Thu, 23 Aug 2012 01:42:43 GMT

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

Julius Davies updated LANG-816:
-------------------------------

    Description: 
ConstantUtils currently contains a set of methods to ensure constants are not inlined by javac.
  
For example, typically a developer might declare a constant like
{code}
  public final static int MAGIC_NUMBER = 5;
{code}
Should a different jar file refer to this, and the MAGIC_NUMBER is changed a later date (e.g.,
MAGIC_NUMBER = 6), the different jar file will need to recompile itself.  This is because
javac typically inlines the primitive or String constant directly into the bytecode, and removes
the reference to the MAGIC_NUMBER field.

To help the other jar (so that it does not need to recompile when constants are changed) the
original developer can declare their constant using one of the CONST() utility methods, instead:
{code}
  public final static int MAGIC_NUMBER = CONST(5);
{code}


I imagine the code would look something like this:

{code}
public static boolean CONST(boolean v) { return v; }
public static byte CONST(byte v) { return v; }
public static char CONST(char v) { return v; }
public static short CONST(short v) { return v; }
public static int CONST(int v) { return v; }
public static long CONST(long v) { return v; }
public static float CONST(float v) { return v; }
public static double CONST(double v) { return v; }
public static <T> T CONST(T t) { return t; }
{code}

  was:
ConstantUtils currently contains a set of methods to ensure constants are not inlined by javac.
  
For example, typically a developer might declare a constant like
{code}
  public final static int MAGIC_NUMBER = 5;
{code}
Should a different jar file refer to this, and the MAGIC_NUMBER is changed a later date (e.g.,
MAGIC_NUMBER = 6), the different jar file will need to recompile itself.  This is because
javac typically inlines the primitive or String constant directly into the bytecode, and removes
the reference to the MAGIC_NUMBER field.

To help the other jar (so that it does not need to recompile when constants are changed) the
original developer can declare their constant using one of the CONST() utility methods, instead:
{code}
  public final static int MAGIC_NUMBER = CONST(5);
{code}


I imagine the code would look something like this:

{code}
    public static boolean CONST(boolean v) { return v; }
    public static byte CONST(byte v) { return v; }
    public static char CONST(char v) { return v; }
    public static short CONST(short v) { return v; }
    public static int CONST(int v) { return v; }
    public static long CONST(long v) { return v; }
    public static float CONST(float v) { return v; }
    public static double CONST(double v) { return v; }
    public static <T> T CONST(T t) { return t; }
{code}

    
> introduce ConstantUtils class to prevent Javac from inlining constants
> ----------------------------------------------------------------------
>
>                 Key: LANG-816
>                 URL: https://issues.apache.org/jira/browse/LANG-816
>             Project: Commons Lang
>          Issue Type: Wish
>            Reporter: Julius Davies
>            Priority: Trivial
>
> ConstantUtils currently contains a set of methods to ensure constants are not inlined
by javac.
>   
> For example, typically a developer might declare a constant like
> {code}
>   public final static int MAGIC_NUMBER = 5;
> {code}
> Should a different jar file refer to this, and the MAGIC_NUMBER is changed a later date
(e.g., MAGIC_NUMBER = 6), the different jar file will need to recompile itself.  This is because
javac typically inlines the primitive or String constant directly into the bytecode, and removes
the reference to the MAGIC_NUMBER field.
> To help the other jar (so that it does not need to recompile when constants are changed)
the original developer can declare their constant using one of the CONST() utility methods,
instead:
> {code}
>   public final static int MAGIC_NUMBER = CONST(5);
> {code}
> I imagine the code would look something like this:
> {code}
> public static boolean CONST(boolean v) { return v; }
> public static byte CONST(byte v) { return v; }
> public static char CONST(char v) { return v; }
> public static short CONST(short v) { return v; }
> public static int CONST(int v) { return v; }
> public static long CONST(long v) { return v; }
> public static float CONST(float v) { return v; }
> public static double CONST(double v) { return v; }
> public static <T> T CONST(T t) { return t; }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message