This patch is part of Jikes RVM JIRA issue 443:
http://jira.codehaus.org/browse/RVM-443
committed here:
http://jikesrvm.svn.sourceforge.net/viewvc/jikesrvm?view=rev&revision=14905
The patch avoids back references in java.lang.reflect.VM* classes and
instead passes the parent object as a parameter. This means that
constant parents can be propagated rather than in the current code where
the parent must be loaded from a non-final field (breaking potential
optimization without pointer analysis).
The patch changes the internal reflection API and therefore would need a
number of changes in other Classpath VMs to match the interface.
Regards,
Ian
Index: java/lang/reflect/Constructor.java
===================================================================
RCS file: /sources/classpath/classpath/java/lang/reflect/Constructor.java,v
retrieving revision 1.10
diff -u -r1.10 Constructor.java
--- java/lang/reflect/Constructor.java 23 Jun 2008 20:59:35 -0000 1.10
+++ java/lang/reflect/Constructor.java 18 Aug 2008 17:14:28 -0000
@@ -95,7 +95,6 @@
Constructor(VMConstructor cons)
{
this.cons = cons;
- cons.cons = this;
}
private Constructor()
@@ -316,7 +315,7 @@
{
// Inescapable as the VM layer is 1.4 based.
@SuppressWarnings("unchecked")
- T ins = (T) cons.construct(args);
+ T ins = (T) cons.construct(args, this);
return ins;
}
Index: java/lang/reflect/Field.java
===================================================================
RCS file: /sources/classpath/classpath/java/lang/reflect/Field.java,v
retrieving revision 1.10
diff -u -r1.10 Field.java
--- java/lang/reflect/Field.java 23 Jun 2008 20:59:35 -0000 1.10
+++ java/lang/reflect/Field.java 18 Aug 2008 17:14:28 -0000
@@ -96,7 +96,6 @@
Field(VMField f)
{
this.f = f;
- f.f = this;
}
/**
@@ -257,7 +256,7 @@
public Object get(Object o)
throws IllegalAccessException
{
- return f.get(o);
+ return f.get(this, o);
}
/**
@@ -280,7 +279,7 @@
public boolean getBoolean(Object o)
throws IllegalAccessException
{
- return f.getBoolean(o);
+ return f.getBoolean(this, o);
}
/**
@@ -303,7 +302,7 @@
public byte getByte(Object o)
throws IllegalAccessException
{
- return f.getByte(o);
+ return f.getByte(this, o);
}
/**
@@ -324,7 +323,7 @@
public char getChar(Object o)
throws IllegalAccessException
{
- return f.getChar(o);
+ return f.getChar(this, o);
}
/**
@@ -347,7 +346,7 @@
public short getShort(Object o)
throws IllegalAccessException
{
- return f.getShort(o);
+ return f.getShort(this, o);
}
/**
@@ -370,7 +369,7 @@
public int getInt(Object o)
throws IllegalAccessException
{
- return f.getInt(o);
+ return f.getInt(this, o);
}
/**
@@ -393,7 +392,7 @@
public long getLong(Object o)
throws IllegalAccessException
{
- return f.getLong(o);
+ return f.getLong(this, o);
}
/**
@@ -416,7 +415,7 @@
public float getFloat(Object o)
throws IllegalAccessException
{
- return f.getFloat(o);
+ return f.getFloat(this, o);
}
/**
@@ -440,7 +439,7 @@
public double getDouble(Object o)
throws IllegalAccessException
{
- return f.getDouble(o);
+ return f.getDouble(this, o);
}
/**
@@ -491,7 +490,7 @@
public void set(Object o, Object value)
throws IllegalAccessException
{
- f.set(o, value);
+ f.set(this, o, value);
}
/**
@@ -514,7 +513,7 @@
public void setBoolean(Object o, boolean value)
throws IllegalAccessException
{
- f.setBoolean(o, value);
+ f.setBoolean(this, o, value);
}
/**
@@ -537,7 +536,7 @@
public void setByte(Object o, byte value)
throws IllegalAccessException
{
- f.setByte(o, value);
+ f.setByte(this, o, value);
}
/**
@@ -560,7 +559,7 @@
public void setChar(Object o, char value)
throws IllegalAccessException
{
- f.setChar(o, value);
+ f.setChar(this, o, value);
}
/**
@@ -583,7 +582,7 @@
public void setShort(Object o, short value)
throws IllegalAccessException
{
- f.setShort(o, value);
+ f.setShort(this, o, value);
}
/**
@@ -606,7 +605,7 @@
public void setInt(Object o, int value)
throws IllegalAccessException
{
- f.setInt(o, value);
+ f.setInt(this, o, value);
}
/**
@@ -629,7 +628,7 @@
public void setLong(Object o, long value)
throws IllegalAccessException
{
- f.setLong(o, value);
+ f.setLong(this, o, value);
}
/**
@@ -652,7 +651,7 @@
public void setFloat(Object o, float value)
throws IllegalAccessException
{
- f.setFloat(o, value);
+ f.setFloat(this, o, value);
}
/**
@@ -675,7 +674,7 @@
public void setDouble(Object o, double value)
throws IllegalAccessException
{
- f.setDouble(o, value);
+ f.setDouble(this, o, value);
}
/**
Index: java/lang/reflect/Method.java
===================================================================
RCS file: /sources/classpath/classpath/java/lang/reflect/Method.java,v
retrieving revision 1.9
diff -u -r1.9 Method.java
--- java/lang/reflect/Method.java 23 Jun 2008 20:59:35 -0000 1.9
+++ java/lang/reflect/Method.java 18 Aug 2008 17:14:28 -0000
@@ -96,7 +96,6 @@
Method(VMMethod m)
{
this.m = m;
- m.m = this;
}
/**
@@ -324,7 +323,7 @@
public Object invoke(Object o, Object... args)
throws IllegalAccessException, InvocationTargetException
{
- return m.invoke(o, args);
+ return m.invoke(o, args, this);
}
/**
Index: vm/reference/java/lang/reflect/VMConstructor.java
===================================================================
RCS file:
/sources/classpath/classpath/vm/reference/java/lang/reflect/VMConstructor.java,v
retrieving revision 1.4
diff -u -r1.4 VMConstructor.java
--- vm/reference/java/lang/reflect/VMConstructor.java 6 Mar 2008 20:22:19
-0000 1.4
+++ vm/reference/java/lang/reflect/VMConstructor.java 18 Aug 2008 17:14:41
-0000
@@ -47,12 +47,6 @@
Class clazz;
int slot;
- /**
- * This field allows us to refer back to the main constructor instance.
- * It is set by the constructor of Constructor.
- */
- Constructor cons;
-
VMConstructor(Class clazz, int slot)
{
this.clazz = clazz;
@@ -88,7 +82,7 @@
*/
native Class[] getExceptionTypes();
- native Object construct(Object[] args)
+ native Object construct(Object[] args, Constructor cons)
throws InstantiationException, IllegalAccessException,
InvocationTargetException;
Index: vm/reference/java/lang/reflect/VMField.java
===================================================================
RCS file:
/sources/classpath/classpath/vm/reference/java/lang/reflect/VMField.java,v
retrieving revision 1.5
diff -u -r1.5 VMField.java
--- vm/reference/java/lang/reflect/VMField.java 16 Mar 2008 20:03:53 -0000
1.5
+++ vm/reference/java/lang/reflect/VMField.java 18 Aug 2008 17:14:42 -0000
@@ -46,12 +46,6 @@
String name;
int slot;
- /**
- * This field allows us to refer back to the main constructor instance.
- * It is set by the constructor of Field.
- */
- Field f;
-
VMField(Class clazz, String name, int slot)
{
this.clazz = clazz;
@@ -112,16 +106,16 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #getBoolean(Object)
- * @see #getByte(Object)
- * @see #getChar(Object)
- * @see #getShort(Object)
- * @see #getInt(Object)
- * @see #getLong(Object)
- * @see #getFloat(Object)
- * @see #getDouble(Object)
+ * @see #getBoolean(Field f, Object)
+ * @see #getByte(Field f, Object)
+ * @see #getChar(Field f, Object)
+ * @see #getShort(Field f, Object)
+ * @see #getInt(Field f, Object)
+ * @see #getLong(Field f, Object)
+ * @see #getFloat(Field f, Object)
+ * @see #getDouble(Field f, Object)
*/
- native Object get(Object o)
+ native Object get(Field f, Object o)
throws IllegalAccessException;
/**
@@ -139,9 +133,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #get(Object)
+ * @see #get(Field f, Object)
*/
- native boolean getBoolean(Object o)
+ native boolean getBoolean(Field f, Object o)
throws IllegalAccessException;
/**
@@ -159,9 +153,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #get(Object)
+ * @see #get(Field f, Object)
*/
- native byte getByte(Object o)
+ native byte getByte(Field f, Object o)
throws IllegalAccessException;
/**
@@ -178,9 +172,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #get(Object)
+ * @see #get(Field f, Object)
*/
- native char getChar(Object o)
+ native char getChar(Field f, Object o)
throws IllegalAccessException;
/**
@@ -198,9 +192,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #get(Object)
+ * @see #get(Field f, Object)
*/
- native short getShort(Object o)
+ native short getShort(Field f, Object o)
throws IllegalAccessException;
/**
@@ -218,9 +212,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #get(Object)
+ * @see #get(Field f, Object)
*/
- native int getInt(Object o)
+ native int getInt(Field f, Object o)
throws IllegalAccessException;
/**
@@ -238,9 +232,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #get(Object)
+ * @see #get(Field f, Object)
*/
- native long getLong(Object o)
+ native long getLong(Field f, Object o)
throws IllegalAccessException;
/**
@@ -258,9 +252,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #get(Object)
+ * @see #get(Field f, Object)
*/
- native float getFloat(Object o)
+ native float getFloat(Field f, Object o)
throws IllegalAccessException;
/**
@@ -279,9 +273,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #get(Object)
+ * @see #get(Field f, Object)
*/
- native double getDouble(Object o)
+ native double getDouble(Field f, Object o)
throws IllegalAccessException;
/**
@@ -320,16 +314,16 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #setBoolean(Object, boolean)
- * @see #setByte(Object, byte)
- * @see #setChar(Object, char)
- * @see #setShort(Object, short)
- * @see #setInt(Object, int)
- * @see #setLong(Object, long)
- * @see #setFloat(Object, float)
- * @see #setDouble(Object, double)
+ * @see #setBoolean(Field f, Object, boolean)
+ * @see #setByte(Field f, Object, byte)
+ * @see #setChar(Field f, Object, char)
+ * @see #setShort(Field f, Object, short)
+ * @see #setInt(Field f, Object, int)
+ * @see #setLong(Field f, Object, long)
+ * @see #setFloat(Field f, Object, float)
+ * @see #setDouble(Field f, Object, double)
*/
- native void set(Object o, Object value)
+ native void set(Field f, Object o, Object value)
throws IllegalAccessException;
/**
@@ -347,9 +341,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #set(Object, Object)
+ * @see #set(Field f, Object, Object)
*/
- native void setBoolean(Object o, boolean value)
+ native void setBoolean(Field f, Object o, boolean value)
throws IllegalAccessException;
/**
@@ -367,9 +361,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #set(Object, Object)
+ * @see #set(Field f, Object, Object)
*/
- native void setByte(Object o, byte value)
+ native void setByte(Field f, Object o, byte value)
throws IllegalAccessException;
/**
@@ -387,9 +381,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #set(Object, Object)
+ * @see #set(Field f, Object, Object)
*/
- native void setChar(Object o, char value)
+ native void setChar(Field f, Object o, char value)
throws IllegalAccessException;
/**
@@ -407,9 +401,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #set(Object, Object)
+ * @see #set(Field f, Object, Object)
*/
- native void setShort(Object o, short value)
+ native void setShort(Field f, Object o, short value)
throws IllegalAccessException;
/**
@@ -427,9 +421,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #set(Object, Object)
+ * @see #set(Field f, Object, Object)
*/
- native void setInt(Object o, int value)
+ native void setInt(Field f, Object o, int value)
throws IllegalAccessException;
/**
@@ -447,9 +441,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #set(Object, Object)
+ * @see #set(Field f, Object, Object)
*/
- native void setLong(Object o, long value)
+ native void setLong(Field f, Object o, long value)
throws IllegalAccessException;
/**
@@ -467,9 +461,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #set(Object, Object)
+ * @see #set(Field f, Object, Object)
*/
- native void setFloat(Object o, float value)
+ native void setFloat(Field f, Object o, float value)
throws IllegalAccessException;
/**
@@ -487,9 +481,9 @@
* requires an instance
* @throws ExceptionInInitializerError if accessing a static field triggered
* class initialization, which then failed
- * @see #set(Object, Object)
+ * @see #set(Field f, Object, Object)
*/
- native void setDouble(Object o, double value)
+ native void setDouble(Field f, Object o, double value)
throws IllegalAccessException;
/**
Index: vm/reference/java/lang/reflect/VMMethod.java
===================================================================
RCS file:
/sources/classpath/classpath/vm/reference/java/lang/reflect/VMMethod.java,v
retrieving revision 1.5
diff -u -r1.5 VMMethod.java
--- vm/reference/java/lang/reflect/VMMethod.java 16 Mar 2008 20:03:53
-0000 1.5
+++ vm/reference/java/lang/reflect/VMMethod.java 18 Aug 2008 17:14:42
-0000
@@ -48,12 +48,6 @@
String name;
int slot;
- /**
- * This field allows us to refer back to the main constructor instance.
- * It is set by the constructor of Field.
- */
- Method m;
-
public Class getDeclaringClass()
{
return clazz;
@@ -93,7 +87,7 @@
*/
native Class[] getExceptionTypes();
- native Object invoke(Object o, Object[] args)
+ native Object invoke(Object o, Object[] args, Method m)
throws IllegalAccessException, InvocationTargetException;
/**
[?1049h[?1h=[1;46r[?12;25h[?12l[?25h[27m[m[H[2J[?25l[46;1H"[EMAIL
PROTECTED]:/home/antigua/IanR/classpath" [New DIRECTORY][2;1H[1m[34m~
[3;1H~
[4;1H~
[5;1H~
[6;1H~
[7;1H~
[8;1H~
[9;1H~
[10;1H~
[11;1H~
[12;1H~
[13;1H~
[14;1H~
[15;1H~
[16;1H~
[17;1H~
[18;1H~
[19;1H~
[20;1H~
[21;1H~
[22;1H~
[23;1H~
[24;1H~
[25;1H~
[26;1H~
[27;1H~
[28;1H~
[29;1H~
[30;1H~
[31;1H~
[32;1H~
[33;1H~
[34;1H~
[35;1H~
[36;1H~
[37;1H~
[38;1H~
[39;1H~
[40;1H~
[41;1H~
[42;1H~
[43;1H~
[44;1H~
[45;1H~
[m[46;140H0,0-1[9CAll[1;1H[?12l[?25h[?25l[46;1H[K[46;1H:[?12l[?25h
[?25l[138C0,0-1[9CAll[1;1H[?12l[?25h[?25l[46;140H[K[46;1H:[?12l[?25hQ
[?25l[1m[37m[41mE492: Not an editor command:
Q[m[109C0,0-1[9CAll[1;1H[?12l[?25h[?25l[46;1H[K[46;1H:[?12l[?25hq!
[?25l[46;1H[K[46;1H[?1l>[?12l[?25h[?1049l3 files to edit