[squeak-dev] FFI: FFI-Tools-mt.30.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri May 14 13:04:43 UTC 2021
Marcel Taeumel uploaded a new version of FFI-Tools to project FFI:
http://source.squeak.org/FFI/FFI-Tools-mt.30.mcz
==================== Summary ====================
Name: FFI-Tools-mt.30
Author: mt
Time: 14 May 2021, 3:04:42.77076 pm
UUID: 7076b5d3-0e8a-2648-a430-bdda981b628f
Ancestors: FFI-Tools-mt.29
Complements FFI-Kernel-mt.142
=============== Diff against FFI-Tools-mt.29 ===============
Item was added:
+ ----- Method: ExternalData>>explorerContents (in category '*FFI-Tools') -----
+ explorerContents
+ "Prefix all instance variables and append extra meta information (e.g., the external type) as well as all structure fields as defined in #fields."
+
+ | basicExplorerFields |
+ basicExplorerFields := super explorerContents.
+ basicExplorerFields do: [:explorerField |
+ explorerField itemName = '_type' ifTrue: [
+ explorerField itemName: '_containerType']].
+ ^ basicExplorerFields!
Item was changed:
----- Method: ExternalData>>explorerContentsMetaFields (in category '*FFI-Tools') -----
explorerContentsMetaFields
"Skip _type because our external type is already in the basic explorer fields because it is an instance variable. Add _contentType for clarification."
^ {
- ObjectExplorerWrapper with: self containerType name: '_containerType' model: self.
ObjectExplorerWrapper with: self contentType name: '_contentType' model: self.
}!
Item was changed:
----- Method: ExternalData>>explorerContentsStructFields (in category '*FFI-Tools') -----
explorerContentsStructFields
"In case some data interpretation omitted to convert char*, which is a (null-terminated) C string, to Smalltalk string."
+ (self size notNil and: [self isNull not]) ifTrue: [
- size notNil ifTrue: [
^ self withIndexCollect: [:each :index |
ObjectExplorerWrapper
with: each
name: index printString
model: self]].
^ (ExternalStructureInspector readCStrings and: [self mightBeCString]) ifFalse: [#()] ifTrue: [
{ObjectExplorerWrapper
with: ([self fromCString] ifError: [:msg | '<', msg, '>'])
name: 'as C string'
model: self}]!
Item was added:
+ ----- Method: ExternalData>>explorerOkToClose (in category '*FFI-Tools') -----
+ explorerOkToClose
+ "Overwritten to also check by content type. That is, a byte array full of pointers is also managed here."
+
+ ^ ((handle isExternalAddress or: [self contentType isPointerType])
+ and: [self isNull not])
+ ifTrue: [self confirmFree]
+ ifFalse: [true]!
Item was changed:
----- Method: ExternalData>>hasContentsInExplorer (in category '*FFI-Tools') -----
hasContentsInExplorer
^ super hasContentsInExplorer
+ or: [self size notNil or: [ExternalStructureInspector readCStrings and: [self mightBeCString]]]!
- or: [size notNil or: [ExternalStructureInspector readCStrings and: [self mightBeCString]]]!
Item was added:
+ ----- Method: ExternalStructure>>confirmFree (in category '*FFI-Tools') -----
+ confirmFree
+ "Ask the user whether we should free the receivers handle."
+
+ | byteSize |
+ (Project uiManager
+ confirm: ('There are <b>{1}</b> bytes addressed.<br>Do you want to <b>free</b> the allocated memory?'
+ translated format: {
+ (byteSize := self byteSize) notNil
+ ifTrue: [byteSize] ifFalse: ['an unknown number of']. }) asTextFromHtml
+ orCancel: [^ false]
+ title: 'External Pointer Detected' translated)
+ ifTrue: [self free].
+
+ ^ true!
Item was changed:
----- Method: ExternalStructure>>explorerOkToClose (in category '*FFI-Tools') -----
explorerOkToClose
"We are being explored and that explorer wants to close. If we point to external memory, ask the user whether we should free it to avoid leaks."
+
+ ^ (self externalType isPointerType and: [self isNull not])
+ ifTrue: [self confirmFree]
+ ifFalse: [true]!
-
- | byteSize |
- (handle isExternalAddress and: [handle isNull not]) ifTrue: [
- (Project uiManager
- confirm: ('There are <b>{1}</b> bytes addressed.<br>Do you want to <b>free</b> the allocated memory?'
- translated format: {
- (byteSize := self externalType byteSize) > 0
- ifTrue: [byteSize] ifFalse: ['an unknown number of']. }) asTextFromHtml
- orCancel: [^ false]
- title: 'External Address Detected' translated)
- ifTrue: [self free]].
-
- ^ true!
Item was changed:
----- Method: ExternalStructureType>>explorerContents (in category '*FFI-Tools') -----
explorerContents
+ | basicExplorerFields fieldTypeFields |
- | basicExplorerFields originalTypeField fieldTypeFields |
basicExplorerFields := super explorerContents.
-
- self isTypeAlias ifTrue: [
- originalTypeField := ObjectExplorerWrapper
- with: self originalType
- name: '_originalType'
- model: self.
- ^ {originalTypeField}, basicExplorerFields].
fieldTypeFields := Array streamContents: [:s |
self typesDo: [:type :fieldName |
s nextPut: (ObjectExplorerWrapper
with: type
name: (fieldName ifNil: ['__'] ifNotNil: ['_', fieldName])
model: self)]].
^ fieldTypeFields, basicExplorerFields!
Item was changed:
----- Method: ExternalStructureType>>typesDo: (in category '*FFI-Tools-enumerating') -----
typesDo: block
+ (self isTypeAlias or: [self isTypeAliasReferenced])
+ ifTrue: [^ self originalType typesDo: block].
- self assert: [self isPointerType not].
- self assert: [self referentClass notNil].
+ self referentClass fields do: [:spec |
+ | fieldName typeName type |
+ fieldName := spec first.
+ typeName := spec second.
+ type := ExternalType typeNamed: typeName.
+ block cull: type cull: fieldName].!
- (self isTypeAlias
- ifTrue: [
- "Add a custom role to emphasize it in #allTypes."
- {{#'_aliasFor' . self referentClass fields second}}]
- ifFalse: [self referentClass fields])
- do: [:spec |
- | fieldName typeName type |
- fieldName := spec first.
- typeName := spec second.
- type := ExternalType typeNamed: typeName.
- block cull: type cull: fieldName].!
Item was changed:
----- Method: ExternalType>>explorerContents (in category '*FFI-Tools') -----
explorerContents
+ | basicExplorerFields originalTypeField |
- | basicExplorerFields |
basicExplorerFields := super explorerContents.
basicExplorerFields do: [:explorerField |
explorerField itemName = 'compiledSpec' ifTrue: [
explorerField changeClassTo: CompiledSpecWrapper]].
+
+ self isTypeAlias ifTrue: [
+ originalTypeField := ObjectExplorerWrapper
+ with: self originalType
+ name: '_originalType'
+ model: self.
+ ^ {originalTypeField}, basicExplorerFields].
+
^ basicExplorerFields!
Item was added:
+ ----- Method: ExternalUnknownType>>explorerContents (in category '*FFI-Tools') -----
+ explorerContents
+ "Overwritten to just list fields for the instVars."
+
+ | basicExplorerFields |
+ basicExplorerFields := self perform: #explorerContents withArguments: #() inSuperclass: Object.
+ basicExplorerFields do: [:explorerField |
+ explorerField itemName = 'compiledSpec' ifTrue: [
+ explorerField changeClassTo: CompiledSpecWrapper]].
+
+ ^ basicExplorerFields!
More information about the Squeak-dev
mailing list
|