FFI: FFI-Kernel-mt.143.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

FFI: FFI-Kernel-mt.143.mcz

commits-2
Marcel Taeumel uploaded a new version of FFI-Kernel to project FFI:
http://source.squeak.org/FFI/FFI-Kernel-mt.143.mcz

==================== Summary ====================

Name: FFI-Kernel-mt.143
Author: mt
Time: 14 May 2021, 3:01:53.90276 pm
UUID: 94cef049-a4ee-534b-ad41-145d09816d5d
Ancestors: FFI-Kernel-mt.142

Adds a generic way to compare external objects for identity and equality.

=============== Diff against FFI-Kernel-mt.142 ===============

Item was added:
+ ----- Method: ByteArray>>ffiEqual: (in category '*FFI-Kernel-comparing') -----
+ ffiEqual: other
+
+ ^ self = other withoutReadWriter!

Item was added:
+ ----- Method: ByteArray>>ffiIdentical: (in category '*FFI-Kernel-comparing') -----
+ ffiIdentical: other
+
+ ^ self == other withoutReadWriter!

Item was added:
+ ----- Method: ExternalData>>ffiEqual: (in category 'comparing') -----
+ ffiEqual: other
+ "WARNING!! EXPENSIVE!! We can compare bytes if the types are compatible."
+
+ (self ffiIdentical: other) ifTrue: [^ true].
+
+ self flag: #todo. "mt: Which types are actually compatible? :-)"
+ self externalType asNonPointerType = other externalType asNonPointerType ifFalse: [^ false].
+
+ self flag: #todo. "mt: Follow pointers? Detect cycles? Hmmm... :-) See #free as inspiration."
+ ^ self copy getHandle ffiEqual: other copy getHandle!

Item was added:
+ ----- Method: ExternalData>>ffiEqualityHash (in category 'comparing') -----
+ ffiEqualityHash
+ "WARNING!! EXPENSIVE!!"
+
+ self ffiIdentityHash
+ bitXor: self copy getHandle hash!

Item was added:
+ ----- Method: ExternalObject>>= (in category 'comparing') -----
+ = other
+ "By default, we use the not-so-expensive check for external indentity like Object does. Subclasses can choose to use #ffiEqual:, which compares types and bytes, or implement their own domain-specific notion of equality."
+
+ ^ self ffiIdentical: other!

Item was added:
+ ----- Method: ExternalObject>>ffiEqual: (in category 'comparing') -----
+ ffiEqual: other
+ "We do not know better."
+
+ ^ self ffiIdentical: other!

Item was added:
+ ----- Method: ExternalObject>>ffiEqualityHash (in category 'comparing') -----
+ ffiEqualityHash
+
+ ^ self ffiIdentityHash!

Item was added:
+ ----- Method: ExternalObject>>ffiIdentical: (in category 'comparing') -----
+ ffiIdentical: other
+ "Define identity for external objects. External objects sharing an external address are considered 'externally identical.' "
+
+ self == other ifTrue: [^ true].
+ other isExternalObject ifFalse: [^ false].
+ self getHandle species = other getHandle species ifFalse: [^ false].
+
+ ^ (self getHandle ffiIdentical: other getHandle) or: [
+ self checkHandle. other checkHandle.
+ self getHandle isExternalAddress
+ and: [other getHandle isExternalAddress]
+ and: [self getHandle = other getHandle]]!

Item was added:
+ ----- Method: ExternalObject>>ffiIdentityHash (in category 'comparing') -----
+ ffiIdentityHash
+
+ ^ self species scaledIdentityHash bitXor: self getHandle scaledIdentityHash!

Item was added:
+ ----- Method: ExternalObject>>hash (in category 'comparing') -----
+ hash
+
+ ^ self ffiIdentityHash!

Item was added:
+ ----- Method: ExternalStructure>>ffiEqual: (in category 'comparing') -----
+ ffiEqual: other
+ "We can compare bytes if the types are compatible."
+
+ (self ffiIdentical: other) ifTrue: [^ true].
+ self externalType asNonPointerType = other externalType asNonPointerType ifFalse: [^ false].
+ ^ self asArray ffiEqual: other asArray!

Item was added:
+ ----- Method: ExternalStructure>>ffiEqualityHash (in category 'comparing') -----
+ ffiEqualityHash
+
+ ^ self ffiIdentityHash
+ bitXor: self asArray ffiEqualityHash!

Item was added:
+ ----- Method: ExternalStructure>>ffiIdentical: (in category 'comparing') -----
+ ffiIdentical: other
+ "Overwritten to also check the receiver's external type."
+
+ (super ffiIdentical: other) ifFalse: [^ false].
+ ^ self externalType = other externalType!

Item was added:
+ ----- Method: ExternalStructure>>ffiIdentityHash (in category 'comparing') -----
+ ffiIdentityHash
+
+ ^ super ffiIdentityHash bitXor: self externalType scaledIdentityHash!

Item was removed:
- ----- Method: ExternalTypeAlias>>= (in category 'comparing') -----
- = anExternalTypeAlias
- ^self class = anExternalTypeAlias class and: [self value = anExternalTypeAlias value]!

Item was removed:
- ----- Method: ExternalTypeAlias>>hash (in category 'comparing') -----
- hash
- ^self class hash hashMultiply bitXor: self value hash!

Item was added:
+ ----- Method: Object>>ffiEqual: (in category '*FFI-Kernel') -----
+ ffiEqual: other
+
+ ^ self = other!

Item was added:
+ ----- Method: Object>>ffiIdentical: (in category '*FFI-Kernel') -----
+ ffiIdentical: other
+
+ ^ self == other!

Item was changed:
  (PackageInfo named: 'FFI-Kernel') postscript: 'Smalltalk removeFromStartUpList: ExternalAddress.
  Smalltalk removeFromStartUpList: ExternalObject.
 
+ ExternalType resetAllTypes.
- "Adds housekeeping for array types."
- ExternalType resetAllStructureTypes.
 
  "Re-generate all field accessors because in ExternalData, #size: was replaced with #setSet: and a new constructors for content and container types."
  ExternalStructure defineAllFields.
  '!