From 441787672de80719a9e0565badb2431fc2bbdb13 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sat, 20 Aug 2011 08:28:45 +0000 Subject: [PATCH] * 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 - --- rtl/java/java_sys.inc | 6 ++++++ rtl/java/java_sysh.inc | 7 ++++++- rtl/java/jdk15.inc | 6 ------ rtl/java/jdk15.pas | 15 +++++---------- rtl/java/jpvar.inc | 14 +++++++++++++- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/rtl/java/java_sys.inc b/rtl/java/java_sys.inc index f6d7d6ec3e..f62865a40e 100644 --- a/rtl/java/java_sys.inc +++ b/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; diff --git a/rtl/java/java_sysh.inc b/rtl/java/java_sysh.inc index 2b4b4bba20..ac129c2d81 100644 --- a/rtl/java/java_sysh.inc +++ b/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; diff --git a/rtl/java/jdk15.inc b/rtl/java/jdk15.inc index 5431c3d4ba..0ba5b08287 100644 --- a/rtl/java/jdk15.inc +++ b/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; diff --git a/rtl/java/jdk15.pas b/rtl/java/jdk15.pas index 51f6a2ebc3..c022ab4750 100644 --- a/rtl/java/jdk15.pas +++ b/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; diff --git a/rtl/java/jpvar.inc b/rtl/java/jpvar.inc index e2cfadf8f8..3daad8bacf 100644 --- a/rtl/java/jpvar.inc +++ b/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... }