Dev: avoid calling empty constructor for enums
This commit is contained in:
parent
3ca42ffc06
commit
4fce9fa47b
|
@ -41,13 +41,17 @@ indirect enum JNIStorageType {
|
||||||
|
|
||||||
class JNIStorageObject {
|
class JNIStorageObject {
|
||||||
let type: JNIStorageType
|
let type: JNIStorageType
|
||||||
var javaObject: jobject
|
var javaObject: jobject!
|
||||||
|
|
||||||
init(type: JNIStorageType, javaObject: jobject) {
|
init(type: JNIStorageType, javaObject: jobject) {
|
||||||
self.type = type
|
self.type = type
|
||||||
self.javaObject = javaObject
|
self.javaObject = javaObject
|
||||||
}
|
}
|
||||||
|
|
||||||
|
init(type: JNIStorageType) {
|
||||||
|
self.type = type
|
||||||
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
JNI.api.DeleteLocalRef(JNI.env, javaObject)
|
JNI.api.DeleteLocalRef(JNI.env, javaObject)
|
||||||
}
|
}
|
||||||
|
@ -404,9 +408,15 @@ class JavaEnumValueEncodingContainer: SingleValueEncodingContainer {
|
||||||
public func encode<T : Encodable>(_ value: T) throws {
|
public func encode<T : Encodable>(_ value: T) throws {
|
||||||
let rawValue = try self.encoder.box(value)
|
let rawValue = try self.encoder.box(value)
|
||||||
let clazz = try JNI.getJavaClass(javaClass)
|
let clazz = try JNI.getJavaClass(javaClass)
|
||||||
let valueOfMethodID = JNI.api.GetStaticMethodID(JNI.env, clazz, "valueOf", "(\(rawValue.type.sig))L\(javaClass);")
|
// If jniStorage.javaObject == nil its enum, else optionSet
|
||||||
JNI.api.DeleteLocalRef(JNI.env, jniStorage.javaObject)
|
if jniStorage.javaObject == nil {
|
||||||
jniStorage.javaObject = JNI.CallStaticObjectMethod(clazz, methodID: valueOfMethodID!, args: [jvalue(l: rawValue.javaObject)])!
|
let valueOfMethodID = JNI.api.GetStaticMethodID(JNI.env, clazz, "valueOf", "(\(rawValue.type.sig))L\(javaClass);")
|
||||||
|
jniStorage.javaObject = JNI.CallStaticObjectMethod(clazz, methodID: valueOfMethodID!, args: [jvalue(l: rawValue.javaObject)])!
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let filed = try JNI.getJavaField(forClass: self.javaClass, field: "rawValue", sig: rawValue.type.sig)
|
||||||
|
JNI.api.SetObjectField(JNI.env, self.jniStorage.javaObject, filed, rawValue.javaObject)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -503,6 +513,11 @@ extension JavaEncoder {
|
||||||
let uriObject = JNI.check(JNI.CallStaticObjectMethod(UriClass, methodID: UriConstructor!, args: args), &locals)
|
let uriObject = JNI.check(JNI.CallStaticObjectMethod(UriClass, methodID: UriConstructor!, args: args), &locals)
|
||||||
storage = JNIStorageObject.init(type: .object(className: UriClassname), javaObject: uriObject!)
|
storage = JNIStorageObject.init(type: .object(className: UriClassname), javaObject: uriObject!)
|
||||||
}
|
}
|
||||||
|
else if Mirror(reflecting: value).displayStyle == .enum {
|
||||||
|
let fullClassName = package + "/" + String(describing: type(of: value))
|
||||||
|
// We don't create object for enum. Should be created at JavaEnumValueEncodingContainer
|
||||||
|
storage = JNIStorageObject(type: .object(className: fullClassName))
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
let storageType: JNIStorageType
|
let storageType: JNIStorageType
|
||||||
let fullClassName: String
|
let fullClassName: String
|
||||||
|
|
Loading…
Reference in New Issue