Browse Source

* moved JLRField from jdk15 to the system unit
* fixed FpcBaseProcVarType.clone: create a new method field "pointer" and
set it (using the java.lang.reflect interface). Previously, the pointer
to the method record was copied via the inherited clone, which meant
that the original and new procvar shared it

git-svn-id: branches/jvmbackend@18816 -

Jonas Maebe 14 years ago
parent
commit
72d6d9ac97
5 changed files with 62 additions and 52 deletions
  1. 35 0
      rtl/java/java_sys.inc
  2. 6 6
      rtl/java/java_sysh.inc
  3. 0 35
      rtl/java/jdk15.inc
  4. 10 10
      rtl/java/jdk15.pas
  5. 11 1
      rtl/java/jpvar.inc

+ 35 - 0
rtl/java/java_sys.inc

@@ -2044,6 +2044,41 @@
     function hashCode(): jint; overload;
     function hashCode(): jint; overload;
   end;
   end;
 
 
+  JLRField = class sealed external 'java.lang.reflect' name 'Field' (JLRAccessibleObject, JLRMember)
+  public
+    function getDeclaringClass(): JLClass; overload; virtual;
+    function getName(): JLString; overload; virtual;
+    function getModifiers(): jint; overload; virtual;
+    function isEnumConstant(): jboolean; overload; virtual;
+    function isSynthetic(): jboolean; overload; virtual;
+    function getType(): JLClass; overload; virtual;
+    function getGenericType(): JLRType; overload; virtual;
+    function equals(para1: JLObject): jboolean; overload; virtual;
+    function hashCode(): jint; overload; virtual;
+    function toString(): JLString; overload; virtual;
+    function toGenericString(): JLString; overload; virtual;
+    function get(para1: JLObject): JLObject; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    function getBoolean(para1: JLObject): jboolean; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    function getByte(para1: JLObject): jbyte; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    function getChar(para1: JLObject): jchar; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    function getShort(para1: JLObject): jshort; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    function getInt(para1: JLObject): jint; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    function getLong(para1: JLObject): jlong; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    function getFloat(para1: JLObject): jfloat; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    function getDouble(para1: JLObject): jdouble; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    procedure &set(para1: JLObject; para2: JLObject); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    procedure setBoolean(para1: JLObject; para2: jboolean); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    procedure setByte(para1: JLObject; para2: jbyte); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    procedure setChar(para1: JLObject; para2: jchar); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    procedure setShort(para1: JLObject; para2: jshort); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    procedure setInt(para1: JLObject; para2: jint); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    procedure setLong(para1: JLObject; para2: jlong); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    procedure setFloat(para1: JLObject; para2: jfloat); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    procedure setDouble(para1: JLObject; para2: jdouble); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
+    function getAnnotation(para1: JLClass): JLAAnnotation; overload; virtual;
+    function getDeclaredAnnotations(): Arr1JLAAnnotation; overload; virtual;
+  end;
+
   JLRMethod = class sealed external 'java.lang.reflect' name 'Method' (JLRAccessibleObject, JLRGenericDeclaration, JLRMember)
   JLRMethod = class sealed external 'java.lang.reflect' name 'Method' (JLRAccessibleObject, JLRGenericDeclaration, JLRMember)
   public
   public
     function getDeclaringClass(): JLClass; overload; virtual;
     function getDeclaringClass(): JLClass; overload; virtual;

+ 6 - 6
rtl/java/java_sysh.inc

@@ -1,4 +1,4 @@
-{ Imports for Java packages/classes: java.io.Serializable, java.lang.AbstractStringBuilder, java.lang.Appendable, java.lang.Boolean, java.lang.Byte, java.lang.CharSequence, java.lang.Character, java.lang.Class, java.lang.Cloneable, java.lang.Comparable, java.lang.Double, java.lang.Enum, java.lang.Error, java.lang.Exception, java.lang.Float, java.lang.IllegalArgumentException, java.lang.IndexOutOfBoundsException, java.lang.Integer, java.lang.Iterable, java.lang.LinkageError, java.lang.Long, java.lang.Math, java.lang.NoSuchMethodException, java.lang.Number, java.lang.Object, java.lang.Runtime, java.lang.RuntimeException, java.lang.Short, java.lang.String, java.lang.StringBuffer, java.lang.StringBuilder, java.lang.System, java.lang.Throwable, java.lang.reflect.AccessibleObject, java.lang.reflect.AnnotatedElement, java.lang.reflect.Array, java.lang.reflect.GenericDeclaration, java.lang.reflect.Member, java.lang.reflect.Method, java.lang.reflect.Type, java.math.BigInteger, java.text.Collator, java.util.AbstractCollection, java.util.AbstractMap, java.util.AbstractSet, java.util.Arrays, java.util.BitSet, java.util.Calendar, java.util.Collection, java.util.Comparator, java.util.EnumSet, java.util.HashMap, java.util.Iterator, java.util.Map, java.util.Set }
+{ Imports for Java packages/classes: java.io.Serializable, java.lang.AbstractStringBuilder, java.lang.Appendable, java.lang.Boolean, java.lang.Byte, java.lang.CharSequence, java.lang.Character, java.lang.Class, java.lang.Cloneable, java.lang.Comparable, java.lang.Double, java.lang.Enum, java.lang.Error, java.lang.Exception, java.lang.Float, java.lang.IllegalArgumentException, java.lang.IndexOutOfBoundsException, java.lang.Integer, java.lang.Iterable, java.lang.LinkageError, java.lang.Long, java.lang.Math, java.lang.NoSuchMethodException, java.lang.Number, java.lang.Object, java.lang.Runtime, java.lang.RuntimeException, java.lang.Short, java.lang.String, java.lang.StringBuffer, java.lang.StringBuilder, java.lang.System, java.lang.Throwable, java.lang.reflect.AccessibleObject, java.lang.reflect.AnnotatedElement, java.lang.reflect.Array, java.lang.reflect.Field, java.lang.reflect.GenericDeclaration, java.lang.reflect.Member, java.lang.reflect.Method, java.lang.reflect.Type, java.math.BigInteger, java.text.Collator, java.util.AbstractCollection, java.util.AbstractMap, java.util.AbstractSet, java.util.Arrays, java.util.BitSet, java.util.Calendar, java.util.Collection, java.util.Comparator, java.util.EnumSet, java.util.HashMap, java.util.Iterator, java.util.Map, java.util.Set }
 type
 type
   JLNoSuchMethodException = class;
   JLNoSuchMethodException = class;
   Arr1JLNoSuchMethodException = array of JLNoSuchMethodException;
   Arr1JLNoSuchMethodException = array of JLNoSuchMethodException;
@@ -30,6 +30,11 @@ type
   Arr2JLEnum = array of Arr1JLEnum;
   Arr2JLEnum = array of Arr1JLEnum;
   Arr3JLEnum = array of Arr2JLEnum;
   Arr3JLEnum = array of Arr2JLEnum;
 
 
+  JLRField = class;
+  Arr1JLRField = array of JLRField;
+  Arr2JLRField = array of Arr1JLRField;
+  Arr3JLRField = array of Arr2JLRField;
+
   JLError = class;
   JLError = class;
   Arr1JLError = array of JLError;
   Arr1JLError = array of JLError;
   Arr2JLError = array of Arr1JLError;
   Arr2JLError = array of Arr1JLError;
@@ -320,11 +325,6 @@ type
   Arr2JSProtectionDomain = array of Arr1JSProtectionDomain;
   Arr2JSProtectionDomain = array of Arr1JSProtectionDomain;
   Arr3JSProtectionDomain = array of Arr2JSProtectionDomain;
   Arr3JSProtectionDomain = array of Arr2JSProtectionDomain;
 
 
-  JLRField = class external 'java.lang.reflect' name 'Field';
-  Arr1JLRField = array of JLRField;
-  Arr2JLRField = array of Arr1JLRField;
-  Arr3JLRField = array of Arr2JLRField;
-
   JIPrintStream = class external 'java.io' name 'PrintStream';
   JIPrintStream = class external 'java.io' name 'PrintStream';
   Arr1JIPrintStream = array of JIPrintStream;
   Arr1JIPrintStream = array of JIPrintStream;
   Arr2JIPrintStream = array of Arr1JIPrintStream;
   Arr2JIPrintStream = array of Arr1JIPrintStream;

+ 0 - 35
rtl/java/jdk15.inc

@@ -23835,41 +23835,6 @@
     function getParameterAnnotations(): Arr2JLAAnnotation; overload; virtual;
     function getParameterAnnotations(): Arr2JLAAnnotation; overload; virtual;
   end;
   end;
 
 
-  JLRField = class sealed external 'java.lang.reflect' name 'Field' (JLRAccessibleObject, JLRMember)
-  public
-    function getDeclaringClass(): JLClass; overload; virtual;
-    function getName(): JLString; overload; virtual;
-    function getModifiers(): jint; overload; virtual;
-    function isEnumConstant(): jboolean; overload; virtual;
-    function isSynthetic(): jboolean; overload; virtual;
-    function getType(): JLClass; overload; virtual;
-    function getGenericType(): JLRType; overload; virtual;
-    function equals(para1: JLObject): jboolean; overload; virtual;
-    function hashCode(): jint; overload; virtual;
-    function toString(): JLString; overload; virtual;
-    function toGenericString(): JLString; overload; virtual;
-    function get(para1: JLObject): JLObject; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    function getBoolean(para1: JLObject): jboolean; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    function getByte(para1: JLObject): jbyte; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    function getChar(para1: JLObject): jchar; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    function getShort(para1: JLObject): jshort; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    function getInt(para1: JLObject): jint; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    function getLong(para1: JLObject): jlong; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    function getFloat(para1: JLObject): jfloat; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    function getDouble(para1: JLObject): jdouble; overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    procedure &set(para1: JLObject; para2: JLObject); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    procedure setBoolean(para1: JLObject; para2: jboolean); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    procedure setByte(para1: JLObject; para2: jbyte); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    procedure setChar(para1: JLObject; para2: jchar); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    procedure setShort(para1: JLObject; para2: jshort); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    procedure setInt(para1: JLObject; para2: jint); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    procedure setLong(para1: JLObject; para2: jlong); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    procedure setFloat(para1: JLObject; para2: jfloat); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    procedure setDouble(para1: JLObject; para2: jdouble); overload; virtual;  // throws java.lang.IllegalArgumentException, java.lang.IllegalAccessException
-    function getAnnotation(para1: JLClass): JLAAnnotation; overload; virtual;
-    function getDeclaredAnnotations(): Arr1JLAAnnotation; overload; virtual;
-  end;
-
   JLRGenericArrayType = interface external 'java.lang.reflect' name 'GenericArrayType' (JLRType)
   JLRGenericArrayType = interface external 'java.lang.reflect' name 'GenericArrayType' (JLRType)
     function getGenericComponentType(): JLRType; overload;
     function getGenericComponentType(): JLRType; overload;
   end;
   end;

+ 10 - 10
rtl/java/jdk15.pas

@@ -3335,11 +3335,6 @@ type
   Arr2JPASJobMediaSheets = array of Arr1JPASJobMediaSheets;
   Arr2JPASJobMediaSheets = array of Arr1JPASJobMediaSheets;
   Arr3JPASJobMediaSheets = array of Arr2JPASJobMediaSheets;
   Arr3JPASJobMediaSheets = array of Arr2JPASJobMediaSheets;
 
 
-  JUCCopyOnWriteArraySet = class;
-  Arr1JUCCopyOnWriteArraySet = array of JUCCopyOnWriteArraySet;
-  Arr2JUCCopyOnWriteArraySet = array of Arr1JUCCopyOnWriteArraySet;
-  Arr3JUCCopyOnWriteArraySet = array of Arr2JUCCopyOnWriteArraySet;
-
   JMMutableBigInteger = class;
   JMMutableBigInteger = class;
   Arr1JMMutableBigInteger = array of JMMutableBigInteger;
   Arr1JMMutableBigInteger = array of JMMutableBigInteger;
   Arr2JMMutableBigInteger = array of Arr1JMMutableBigInteger;
   Arr2JMMutableBigInteger = array of Arr1JMMutableBigInteger;
@@ -3350,6 +3345,11 @@ type
   Arr2JXStreamFactoryFinder = array of Arr1JXStreamFactoryFinder;
   Arr2JXStreamFactoryFinder = array of Arr1JXStreamFactoryFinder;
   Arr3JXStreamFactoryFinder = array of Arr2JXStreamFactoryFinder;
   Arr3JXStreamFactoryFinder = array of Arr2JXStreamFactoryFinder;
 
 
+  JUCCopyOnWriteArraySet = class;
+  Arr1JUCCopyOnWriteArraySet = array of JUCCopyOnWriteArraySet;
+  Arr2JUCCopyOnWriteArraySet = array of Arr1JUCCopyOnWriteArraySet;
+  Arr3JUCCopyOnWriteArraySet = array of Arr2JUCCopyOnWriteArraySet;
+
   JUZDeflaterOutputStream = class;
   JUZDeflaterOutputStream = class;
   Arr1JUZDeflaterOutputStream = array of JUZDeflaterOutputStream;
   Arr1JUZDeflaterOutputStream = array of JUZDeflaterOutputStream;
   Arr2JUZDeflaterOutputStream = array of Arr1JUZDeflaterOutputStream;
   Arr2JUZDeflaterOutputStream = array of Arr1JUZDeflaterOutputStream;
@@ -8415,11 +8415,6 @@ type
   Arr2JBBBeanContextSupport = array of Arr1JBBBeanContextSupport;
   Arr2JBBBeanContextSupport = array of Arr1JBBBeanContextSupport;
   Arr3JBBBeanContextSupport = array of Arr2JBBBeanContextSupport;
   Arr3JBBBeanContextSupport = array of Arr2JBBBeanContextSupport;
 
 
-  JLRField = class;
-  Arr1JLRField = array of JLRField;
-  Arr2JLRField = array of Arr1JLRField;
-  Arr3JLRField = array of Arr2JLRField;
-
   JUJJarException = class;
   JUJJarException = class;
   Arr1JUJJarException = array of JUJJarException;
   Arr1JUJJarException = array of JUJJarException;
   Arr2JUJJarException = array of Arr1JUJJarException;
   Arr2JUJJarException = array of Arr1JUJJarException;
@@ -20670,6 +20665,11 @@ type
   Arr2JLEnum = array of Arr1JLEnum;
   Arr2JLEnum = array of Arr1JLEnum;
   Arr3JLEnum = array of Arr2JLEnum;
   Arr3JLEnum = array of Arr2JLEnum;
 
 
+  JLRField = class external 'java.lang.reflect' name 'Field';
+  Arr1JLRField = array of JLRField;
+  Arr2JLRField = array of Arr1JLRField;
+  Arr3JLRField = array of Arr2JLRField;
+
   JLError = class external 'java.lang' name 'Error';
   JLError = class external 'java.lang' name 'Error';
   Arr1JLError = array of JLError;
   Arr1JLError = array of JLError;
   Arr2JLError = array of Arr1JLError;
   Arr2JLError = array of Arr1JLError;

+ 11 - 1
rtl/java/jpvar.inc

@@ -78,9 +78,19 @@
 
 
 
 
   function FpcBaseProcVarType.clone: JLObject;
   function FpcBaseProcVarType.clone: JLObject;
+    var
+      field: JLRField;
+      newmethodrec: tmethod;
     begin
     begin
       result:=inherited;
       result:=inherited;
-      FpcBaseProcVarType(result).method:=method;
+      { replace the method record pointer (the inherited clone will have copied
+        it, and there is no way we can change it using Pascal code since it's
+        not a pointer at the Pascal level) }
+      newmethodrec:=method;
+      field:=getClass.getField('method');
+      { doesn't matter that it's a local variable, everything is garbage
+        collected }
+      field.&set(result,JLObject(@newmethodrec));
     end;
     end;