Posted by
commits-2 on
May 21, 2021; 9:13am
URL: https://forum.world.st/FFI-FFI-Kernel-mt-163-mcz-tp5129909.html
Marcel Taeumel uploaded a new version of FFI-Kernel to project FFI:
http://source.squeak.org/FFI/FFI-Kernel-mt.163.mcz==================== Summary ====================
Name: FFI-Kernel-mt.163
Author: mt
Time: 21 May 2021, 11:13:45.365138 am
UUID: c175e00a-7423-de4a-8e42-e1fdf6ffb4c9
Ancestors: FFI-Kernel-mt.162
Adds out-of-bounds checks for byte-array handles in composite structures.
Adds #first: #last: #from: to ExternalData extract handles for backwards-filled buffers.
Relax #sizeCheck: in ExternalData to allow for moving back-and-forth in memory.
Complements FFI-Tests-mt.45.
=============== Diff against FFI-Kernel-mt.162 ===============
Item was added:
+ ----- Method: ByteArrayReadWriter>>checkAt: (in category 'private') -----
+ checkAt: nextByteOffset
+
+ | endOffset |
+ (endOffset := nextByteOffset + byteOffset) > (byteOffset + byteSize)
+ ifTrue: [self errorSubscriptBounds: endOffset].!
Item was added:
+ ----- Method: ByteArrayReadWriter>>checkAt:length: (in category 'private') -----
+ checkAt: nextByteOffset length: numBytes
+
+ | endOffset |
+ (endOffset := nextByteOffset + numBytes - 1) > (byteOffset + byteSize)
+ ifTrue: [self errorSubscriptBounds: endOffset].!
Item was changed:
----- Method: ByteArrayReadWriter>>doubleAt: (in category 'read/write atomics') -----
doubleAt: oByteOffset
+ self checkAt: oByteOffset.
^ byteArray doubleAt: oByteOffset + byteOffset!
Item was changed:
----- Method: ByteArrayReadWriter>>doubleAt:put: (in category 'read/write atomics') -----
doubleAt: oByteOffset put: value
+ self checkAt: oByteOffset.
^ byteArray doubleAt: oByteOffset + byteOffset put: value!
Item was changed:
----- Method: ByteArrayReadWriter>>floatAt: (in category 'read/write atomics') -----
floatAt: oByteOffset
+ self checkAt: oByteOffset.
^ byteArray floatAt: oByteOffset + byteOffset!
Item was changed:
----- Method: ByteArrayReadWriter>>floatAt:put: (in category 'read/write atomics') -----
floatAt: oByteOffset put: value
+ self checkAt: oByteOffset.
^ byteArray floatAt: oByteOffset + byteOffset put: value!
Item was changed:
----- Method: ByteArrayReadWriter>>integerAt:put:size:signed: (in category 'read/write atomics') -----
integerAt: oByteOffset put: value size: nBytes signed: aBoolean
+ self checkAt: oByteOffset.
^ byteArray integerAt: oByteOffset + byteOffset put: value size: nBytes signed: aBoolean!
Item was changed:
----- Method: ByteArrayReadWriter>>integerAt:size:signed: (in category 'read/write atomics') -----
integerAt: oByteOffset size: nBytes signed: aBoolean
+ self checkAt: oByteOffset.
^ byteArray integerAt: oByteOffset + byteOffset size: nBytes signed: aBoolean.!
Item was changed:
----- Method: ByteArrayReadWriter>>pointerAt:length: (in category 'read/write pointers') -----
pointerAt: oByteOffset length: numBytes
+ self checkAt: oByteOffset length: numBytes.
^ byteArray pointerAt: oByteOffset + byteOffset length: numBytes!
Item was changed:
----- Method: ByteArrayReadWriter>>pointerAt:put:length: (in category 'read/write pointers') -----
pointerAt: oByteOffset put: value length: numBytes
+ self checkAt: oByteOffset length: numBytes.
^ byteArray pointerAt: oByteOffset + byteOffset put: value length: numBytes!
Item was changed:
----- Method: ByteArrayReadWriter>>structAt:length: (in category 'read/write structs') -----
structAt: newByteOffset length: newLength
+ self checkAt: newByteOffset length: newLength.
^ ByteArrayReadWriter new
setArray: byteArray
offset: byteOffset + newByteOffset - 1
size: newLength!
Item was changed:
----- Method: ByteArrayReadWriter>>structAt:put:length: (in category 'read/write structs') -----
structAt: newByteOffset put: value length: newLength
+ self checkAt: newByteOffset length: newLength.
- (newByteOffset + newLength > byteSize)
- ifTrue: [self errorSubscriptBounds: newByteOffset + newLength].
-
^ byteArray
structAt: byteOffset + newByteOffset - 1
put: value
length: newLength!
Item was added:
+ ----- Method: ExternalData>>first: (in category 'accessing') -----
+ first: n
+ "Answer the first n elements of the receiver."
+
+ ^ self from: 1 to: n!
Item was added:
+ ----- Method: ExternalData>>from: (in category 'accessing') -----
+ from: firstIndex
+ "Move the start of this array. Size not needed."
+
+ | byteOffset numElements byteSize contentType |
+ contentType := self contentType.
+ byteOffset := ((firstIndex-1) * contentType byteSize)+1.
+ numElements := (self size ifNotNil: [:sz | sz - firstIndex + 1 max: 0]).
+ byteSize := numElements
+ ifNil: [contentType byteSize]
+ ifNotNil: [numElements * contentType byteSize].
+
+ ^ ExternalData
+ fromHandle: (handle structAt: byteOffset length: (byteSize ifNil: [1]))
+ type: contentType
+ size: numElements!
Item was added:
+ ----- Method: ExternalData>>last: (in category 'accessing') -----
+ last: n
+ "Answer the last n elements of the receiver."
+
+ | sz |
+ self sizeCheck.
+ ^ self from: (sz := self size) - n + 1 to: sz!
Item was changed:
----- Method: ExternalData>>sizeCheck: (in category 'private') -----
sizeCheck: index
+ "Negative indices should work to move back-and-forth in the memory."
+
-
| sz |
+ ((sz := self size) notNil and: [index > sz])
- ((1 > index) or: [(sz := self size) notNil and: [index > sz]])
ifTrue: [^ self errorSubscriptBounds: index].!