소스 검색

* migrated java.lang.NoSuchMethodException to java_sys.inc
* catch java.lang.NoSuchMethodException exceptions when resolving a procvar,
because java.lang.Class.getDeclaredMethod() only searches that particular
class itself and not its parents -> in case we get the address of a method
that's not overridden in the current class, also search the parent classes

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

Jonas Maebe 14 년 전
부모
커밋
441787672d
5개의 변경된 파일30개의 추가작업 그리고 18개의 파일을 삭제
  1. 6 0
      rtl/java/java_sys.inc
  2. 6 1
      rtl/java/java_sysh.inc
  3. 0 6
      rtl/java/jdk15.inc
  4. 5 10
      rtl/java/jdk15.pas
  5. 13 1
      rtl/java/jpvar.inc

+ 6 - 0
rtl/java/java_sys.inc

@@ -1876,6 +1876,12 @@
     constructor create(para1: JLString); overload;
   end;
 
+  JLNoSuchMethodException = class external 'java.lang' name 'NoSuchMethodException' (JLException)
+  public
+    constructor create(); overload;
+    constructor create(para1: JLString); overload;
+  end;
+
   JLRuntimeException = class external 'java.lang' name 'RuntimeException' (JLException)
   public
     constructor create(); overload;

+ 6 - 1
rtl/java/java_sysh.inc

@@ -1,5 +1,10 @@
-{ 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.Number, java.lang.Object, 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.text.Collator, java.util.AbstractCollection, java.util.AbstractMap, java.util.AbstractSet, java.util.Arrays, java.util.BitSet, 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.NoSuchMethodException, java.lang.Number, java.lang.Object, 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.text.Collator, java.util.AbstractCollection, java.util.AbstractMap, java.util.AbstractSet, java.util.Arrays, java.util.BitSet, 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;
+  Arr2JLNoSuchMethodException = array of Arr1JLNoSuchMethodException;
+  Arr3JLNoSuchMethodException = array of Arr2JLNoSuchMethodException;
+
   JLStringBuffer = class;
   Arr1JLStringBuffer = array of JLStringBuffer;
   Arr2JLStringBuffer = array of Arr1JLStringBuffer;

+ 0 - 6
rtl/java/jdk15.inc

@@ -16189,12 +16189,6 @@
     constructor create(para1: JLString); overload;
   end;
 
-  JLNoSuchMethodException = class external 'java.lang' name 'NoSuchMethodException' (JLException)
-  public
-    constructor create(); overload;
-    constructor create(para1: JLString); overload;
-  end;
-
   JLIIllegalClassFormatException = class external 'java.lang.instrument' name 'IllegalClassFormatException' (JLException)
   public
     constructor create(); overload;

+ 5 - 10
rtl/java/jdk15.pas

@@ -7380,11 +7380,6 @@ type
   Arr2JSRSSerialRef = array of Arr1JSRSSerialRef;
   Arr3JSRSSerialRef = array of Arr2JSRSSerialRef;
 
-  JLNoSuchMethodException = class;
-  Arr1JLNoSuchMethodException = array of JLNoSuchMethodException;
-  Arr2JLNoSuchMethodException = array of Arr1JLNoSuchMethodException;
-  Arr3JLNoSuchMethodException = array of Arr2JLNoSuchMethodException;
-
   JSDefaultListModel = class;
   Arr1JSDefaultListModel = array of JSDefaultListModel;
   Arr2JSDefaultListModel = array of Arr1JSDefaultListModel;
@@ -12510,16 +12505,16 @@ type
   Arr2JSTVariableHeightLayoutCache = array of Arr1JSTVariableHeightLayoutCache;
   Arr3JSTVariableHeightLayoutCache = array of Arr2JSTVariableHeightLayoutCache;
 
-  JUEnumMap = class;
-  Arr1JUEnumMap = array of JUEnumMap;
-  Arr2JUEnumMap = array of Arr1JUEnumMap;
-  Arr3JUEnumMap = array of Arr2JUEnumMap;
-
   JUJManifest = class;
   Arr1JUJManifest = array of JUJManifest;
   Arr2JUJManifest = array of Arr1JUJManifest;
   Arr3JUJManifest = array of Arr2JUJManifest;
 
+  JUEnumMap = class;
+  Arr1JUEnumMap = array of JUEnumMap;
+  Arr2JUEnumMap = array of Arr1JUEnumMap;
+  Arr3JUEnumMap = array of Arr2JUEnumMap;
+
   JLVerifyError = class;
   Arr1JLVerifyError = array of JLVerifyError;
   Arr2JLVerifyError = array of Arr1JLVerifyError;

+ 13 - 1
rtl/java/jpvar.inc

@@ -37,7 +37,19 @@
         owningClass:=JLClass(method.data)
       else
         owningClass:=method.data.getClass;
-      method.code:=owningClass.getDeclaredMethod(methodName,argTypes);
+      method.code:=nil;
+      { getDeclaredMethod does not search superclasses -> manually traverse
+        until found. If we don't find it anywhere, we'll traverse up to the
+        parent of java.lang.Object = null and throw a NullPointerException }
+      repeat
+        try
+          method.code:=owningClass.getDeclaredMethod(methodName,argTypes);
+        except
+          on JLNoSuchMethodException do
+            owningClass:=owningClass.getSuperClass;
+        end;
+      until assigned(method.code);
+
       { required to enable calling private methods in one class from another
         class -- can cause security exceptions if the security manager doesn't
         allow this though... }