Use new :static-methods functionality in SCI (#1626)

This commit is contained in:
Michiel Borkent 2023-09-26 17:46:50 +02:00 committed by GitHub
parent e14af7b629
commit 0b61f4d3ab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 14 deletions

2
sci

@ -1 +1 @@
Subproject commit 69e16209a21b5e43f93d28d9cd92e86425a91892
Subproject commit 9508340a16b1c61f677b3c4196b6cccdac5d8d58

View file

@ -8,6 +8,8 @@
[sci.core :as sci]
[sci.impl.types :as t]))
(set! *warn-on-reflection* true)
(def has-of-virtual?
(some #(= "ofVirtual" (.getName ^java.lang.reflect.Method %))
(.getMethods Thread)))
@ -177,8 +179,8 @@
(def custom-map
(cond->
(merge base-custom-map
proxy/custom-reflect-map)
(merge base-custom-map
proxy/custom-reflect-map)
features/hsqldb? (assoc `org.hsqldb.dbinfo.DatabaseInformationFull
{:methods [{:name "<init>"
:parameterTypes ["org.hsqldb.Database"]}]}
@ -634,7 +636,15 @@
(:instance-checks classes))
m (apply hash-map
(for [c classes
c [(list 'quote c) c]]
c [(list 'quote c) (cond-> `{:class ~c}
(= 'java.lang.Class c)
(assoc :static-methods
{(list 'quote 'forName)
`(fn
([_# ^String class-name#]
(Class/forName class-name#))
([_# ^String class-name# initialize# ^java.lang.ClassLoader clazz-loader#]
(Class/forName class-name#)))}))]]
c))
m (assoc m :public-class
(fn [v]
@ -715,7 +725,7 @@
(instance? java.security.cert.X509Certificate v)
java.security.cert.X509Certificate
;; keep commas for merge friendliness
,,,)))
)))
m (assoc m (list 'quote 'clojure.lang.Var) 'sci.lang.Var)
m (assoc m (list 'quote 'clojure.lang.Namespace) 'sci.lang.Namespace)]
m))
@ -726,6 +736,14 @@
allowed to be initialized at build time."
(gen-class-map))
#_(let [class-name (str c)]
(cond-> (Class/forName class-name)
(= "java.lang.Class" class-name)
(->> (hash-map :static-methods {'forName (fn [class-name]
(prn :class-for)
(Class/forName class-name))}
:class))))
(def class-map
"A delay to delay initialization of java-net-http classes to run time, since GraalVM 22.1"
(delay (persistent! (reduce (fn [acc c]
@ -770,7 +788,7 @@
Object java.lang.Object
Runtime java.lang.Runtime
RuntimeException java.lang.RuntimeException
Process java.lang.Process
Process java.lang.Process
ProcessBuilder java.lang.ProcessBuilder
Short java.lang.Short
StackTraceElement java.lang.StackTraceElement
@ -782,8 +800,7 @@
Throwable java.lang.Throwable
VirtualMachineError java.lang.VirtualMachineError
ThreadDeath java.lang.ThreadDeath
UnsupportedOperationException java.lang.UnsupportedOperationException
})
UnsupportedOperationException java.lang.UnsupportedOperationException})
(defn reflection-file-entries []
(let [entries (vec (for [c (sort (concat (:all classes)
@ -825,13 +842,13 @@
"resources/META-INF/native-image/babashka/babashka/reflect-config.json")
(json/generate-string all-entries {:pretty true}))))
(defn public-declared-method? [c m]
(defn public-declared-method? [^Class c ^java.lang.reflect.Method m]
(and (= c (.getDeclaringClass m))
(not (.getAnnotation m Deprecated))))
(defn public-declared-method-names [c]
(defn public-declared-method-names [^Class c]
(->> (.getMethods c)
(keep (fn [m]
(keep (fn [^java.lang.reflect.Method m]
(when (public-declared-method? c m)
{:class c
:name (.getName m)})))
@ -859,6 +876,4 @@
(public-declared-method-names java.net.URL)
(public-declared-method-names java.util.Properties)
(all-classes)
)
(all-classes))