Dev: avoid calling empty constructor for enums

This commit is contained in:
Andrew Druk 2017-11-16 10:17:35 +02:00
parent 3ca42ffc06
commit 4fce9fa47b
1 changed files with 19 additions and 4 deletions

View File

@ -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