Prechádzať zdrojové kódy

* 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 rokov pred
rodič
commit
72d6d9ac97
5 zmenil súbory, kde vykonal 62 pridanie a 52 odobranie
  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;
   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)
   public
     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
   JLNoSuchMethodException = class;
   Arr1JLNoSuchMethodException = array of JLNoSuchMethodException;
@@ -30,6 +30,11 @@ type
   Arr2JLEnum = array of Arr1JLEnum;
   Arr3JLEnum = array of Arr2JLEnum;
 
+  JLRField = class;
+  Arr1JLRField = array of JLRField;
+  Arr2JLRField = array of Arr1JLRField;
+  Arr3JLRField = array of Arr2JLRField;
+
   JLError = class;
   Arr1JLError = array of JLError;
   Arr2JLError = array of Arr1JLError;
@@ -320,11 +325,6 @@ type
   Arr2JSProtectionDomain = array of Arr1JSProtectionDomain;
   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';
   Arr1JIPrintStream = array of JIPrintStream;
   Arr2JIPrintStream = array of Arr1JIPrintStream;

+ 0 - 35
rtl/java/jdk15.inc

@@ -23835,41 +23835,6 @@
     function getParameterAnnotations(): Arr2JLAAnnotation; overload; virtual;
   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)
     function getGenericComponentType(): JLRType; overload;
   end;

+ 10 - 10
rtl/java/jdk15.pas

@@ -3335,11 +3335,6 @@ type
   Arr2JPASJobMediaSheets = array of Arr1JPASJobMediaSheets;
   Arr3JPASJobMediaSheets = array of Arr2JPASJobMediaSheets;
 
-  JUCCopyOnWriteArraySet = class;
-  Arr1JUCCopyOnWriteArraySet = array of JUCCopyOnWriteArraySet;
-  Arr2JUCCopyOnWriteArraySet = array of Arr1JUCCopyOnWriteArraySet;
-  Arr3JUCCopyOnWriteArraySet = array of Arr2JUCCopyOnWriteArraySet;
-
   JMMutableBigInteger = class;
   Arr1JMMutableBigInteger = array of JMMutableBigInteger;
   Arr2JMMutableBigInteger = array of Arr1JMMutableBigInteger;
@@ -3350,6 +3345,11 @@ type
   Arr2JXStreamFactoryFinder = array of Arr1JXStreamFactoryFinder;
   Arr3JXStreamFactoryFinder = array of Arr2JXStreamFactoryFinder;
 
+  JUCCopyOnWriteArraySet = class;
+  Arr1JUCCopyOnWriteArraySet = array of JUCCopyOnWriteArraySet;
+  Arr2JUCCopyOnWriteArraySet = array of Arr1JUCCopyOnWriteArraySet;
+  Arr3JUCCopyOnWriteArraySet = array of Arr2JUCCopyOnWriteArraySet;
+
   JUZDeflaterOutputStream = class;
   Arr1JUZDeflaterOutputStream = array of JUZDeflaterOutputStream;
   Arr2JUZDeflaterOutputStream = array of Arr1JUZDeflaterOutputStream;
@@ -8415,11 +8415,6 @@ type
   Arr2JBBBeanContextSupport = array of Arr1JBBBeanContextSupport;
   Arr3JBBBeanContextSupport = array of Arr2JBBBeanContextSupport;
 
-  JLRField = class;
-  Arr1JLRField = array of JLRField;
-  Arr2JLRField = array of Arr1JLRField;
-  Arr3JLRField = array of Arr2JLRField;
-
   JUJJarException = class;
   Arr1JUJJarException = array of JUJJarException;
   Arr2JUJJarException = array of Arr1JUJJarException;
@@ -20670,6 +20665,11 @@ type
   Arr2JLEnum = array of Arr1JLEnum;
   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';
   Arr1JLError = array of JLError;
   Arr2JLError = array of Arr1JLError;

+ 11 - 1
rtl/java/jpvar.inc

@@ -78,9 +78,19 @@
 
 
   function FpcBaseProcVarType.clone: JLObject;
+    var
+      field: JLRField;
+      newmethodrec: tmethod;
     begin
       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;