Skip to content

Commit de1c0d4

Browse files
committed
implement hashCode()
1 parent b2f527e commit de1c0d4

3 files changed

Lines changed: 25 additions & 0 deletions

File tree

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaBindingsPrinting.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,10 @@ extension JNISwift2JavaGenerator {
380380
return false;
381381
}
382382
383+
public int hashCode() {
384+
return SwiftObjects.hashCode(this.$memoryAddress(), this.$typeMetadataAddress());
385+
}
386+
383387
public java.lang.String toString() {
384388
return SwiftObjects.toString(this.$memoryAddress(), this.$typeMetadataAddress());
385389
}

Sources/SwiftJava/SwiftObjects.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,24 @@ extension SwiftObjects {
135135
}
136136
return perform(lhsType: lhsMetatype, rhsType: rhsMetatype)
137137
}
138+
139+
@JavaMethod
140+
public static func hashCode(environment: UnsafeMutablePointer<JNIEnv?>!, selfPointer: Int64, selfTypePointer: Int64) -> Int32 {
141+
guard let selfType$ = UnsafeRawPointer(bitPattern: Int(selfTypePointer)) else {
142+
fatalError("selfType metadata address was null")
143+
}
144+
let typeMetadata = unsafeBitCast(selfType$, to: Any.Type.self)
145+
guard let typeMetadata = typeMetadata as? (any Hashable.Type) else {
146+
// For value types, different instances may return different hash codes even if the values are same.
147+
return Int32(truncatingIfNeeded: selfPointer.hashValue)
148+
}
149+
150+
func perform<T: Hashable>(as type: T.Type) -> Int32 {
151+
guard let self$ = UnsafeMutablePointer<T>(bitPattern: Int(selfPointer)) else {
152+
fatalError("self memory address was null")
153+
}
154+
return Int32(truncatingIfNeeded: self$.pointee.hashValue)
155+
}
156+
return perform(as: typeMetadata)
157+
}
138158
}

SwiftKitCore/src/main/java/org/swift/swiftkit/core/SwiftObjects.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@ public static void requireNonZero(long number, String name) {
3030
public static native void destroy(long selfPointer, long selfTypePointer);
3131
public static native String typeDescription(long selfTypePointer);
3232
public static native boolean equals(long lhsPointer, long lhsTypePointer, long rhsPointer, long rhsTypePointer);
33+
public static native int hashCode(long selfPointer, long selfTypePointer);
3334
}

0 commit comments

Comments
 (0)