Nicolas Cellier uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-nice.2565.mcz ==================== Summary ==================== Name: VMMaker.oscog-nice.2565 Author: nice Time: 18 September 2019, 11:18:16.74572 pm UUID: e21f30a8-9e63-4922-a3ae-c8f85d56e28e Ancestors: VMMaker.oscog-cb.2564 Add some simulation support (Socket) =============== Diff against VMMaker.oscog-cb.2564 =============== Item was added: + ----- Method: SocketPluginSimulator>>primitiveSocket:setOptions:value: (in category 'simulation') ----- + primitiveSocket: socket setOptions: optionName value: optionValue + "THIS BADLY NEEDS TO BE REWRITTEN TO TAKE Booleans AND Integers AS WELL AS (OR INSTEAD OF) Strings. + It is only used with booleans and integers and parsing these back out of strings in + sqSocketSetOptions:optionNameStart:optionNameSize:optionValueStart:optionValueSize:returnedValue: + is STUPID." + | s optionNameStart optionNameSize optionValueStart optionValueSize returnedValue errorCode results | + <var: #s type: #SocketPtr> + <var: #optionNameStart type: #'char *'> + <var: #optionValueStart type: #'char *'> + self primitive: 'primitiveSocketSetOptions' + parameters: #(Oop Oop Oop). + + s := self socketValueOf: socket. + interpreterProxy success: (interpreterProxy isBytes: optionName). + optionNameStart := self cCoerce: (interpreterProxy firstIndexableField: optionName) to: #'char *'. + optionNameSize := interpreterProxy slotSizeOf: optionName. + interpreterProxy success: (interpreterProxy isBytes: optionValue). + optionValueStart:= self cCoerce: (interpreterProxy firstIndexableField: optionValue) to: #'char *'. + optionValueSize := interpreterProxy slotSizeOf: optionValue. + + interpreterProxy failed ifTrue: [^nil]. + errorCode := 0. "?" + returnedValue := self sqSocket: s setOption: optionName value: optionValue. + returnedValue isNil ifTrue: [returnedValue := 0. errorCode := 1 "?"]. + + results := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 2. + interpreterProxy storePointer: 0 ofObject: results withValue: errorCode asSmallIntegerObj. + interpreterProxy storePointer: 1 ofObject: results withValue: returnedValue asSmallIntegerObj. + ^ results! Item was added: + ----- Method: SocketPluginSimulator>>primitiveSocketListenWithOrWithoutBacklog (in category 'simulation') ----- + primitiveSocketListenWithOrWithoutBacklog + interpreterProxy methodArgumentCount = 2 + ifTrue:[^simulator primitiveSocketListenOnPort] + ifFalse:[^simulator primitiveSocketListenOnPortBacklog]! Item was added: + ----- Method: SocketPluginSimulator>>sqSocket:ListenOnPort: (in category 'simulation') ----- + sqSocket: s ListenOnPort: port + ^[Socket basicNew + primSocket: s listenOn: port] + on: SocketPrimitiveFailed + do: [:ex| + interpreterProxy primitiveFail. + 0]! Item was added: + ----- Method: SocketPluginSimulator>>sqSocket:ListenOnPort:BacklogSize:Interface: (in category 'simulation') ----- + sqSocket: s ListenOnPort: port BacklogSize: backlog Interface: addr + ^[Socket basicNew + primSocket: s listenOn: port backlogSize: backlog interface: addr] + on: SocketPrimitiveFailed + do: [:ex| + interpreterProxy primitiveFail. + 0]! Item was added: + ----- Method: SocketPluginSimulator>>sqSocket:setOption:value: (in category 'simulation') ----- + sqSocket: s setOption: aString value: aStringValue + ^[Socket basicNew + primSocket: s setOption: aString value: aStringValue] + on: SocketPrimitiveFailed + do: [:ex| + interpreterProxy primitiveFail. + 0]! Item was added: + ----- Method: SocketPluginSimulator>>sqSocketError: (in category 'simulation') ----- + sqSocketError: s + ^[Socket basicNew + primSocketError: s] + on: SocketPrimitiveFailed + do: [:ex| + interpreterProxy primitiveFail. + -1]! Item was added: + ----- Method: SocketPluginSimulator>>sqSocketRemoteAddress: (in category 'simulation') ----- + sqSocketRemoteAddress: s + ^[Socket basicNew + primSocketRemoteAddress: s] + on: SocketPrimitiveFailed + do: [:ex| + interpreterProxy primitiveFail. + 0]! Item was changed: ----- Method: VMClass>>strncpy:_:_: (in category 'C library simulation') ----- strncpy: dest _: src _: n <doNotGenerate> "implementation of strncpy(3). See e.g. https://manpages.debian.org/stretch/manpages-dev/strncpy.3.en.html The C version always takes an address; the simulation allows a String, ByteArray, CArray or address within the simulation object memory (Positive Integer)" | getBlock setBlock count | count := n. "Determine the source and destination access blocks based on the parameter type" getBlock := src isCollection ifTrue: [count := count min: src size. src isString ifTrue: [[ :idx | src basicAt: idx]] "basicAt: answers integers" ifFalse: [src class == ByteArray ifTrue: [[ :idx | src at: idx]]]] ifFalse: [src isInteger ifTrue: [[ :idx | self byteAt: src + idx - 1]] ifFalse: [src isCArray ifTrue: [[ :idx | src at: idx - 1]]]]. getBlock ifNil: [self error: 'unhandled type of source string']. setBlock := dest isCollection ifTrue: [dest isString ifTrue: [[ :idx | dest basicAt: idx put: (getBlock value: idx)]] "basicAt:put: stores integers" ifFalse: [dest class == ByteArray ifTrue: [[ :idx | dest at: idx put: (getBlock value: idx)]]]] ifFalse: + [dest isInteger + ifTrue: [[ :idx | self byteAt: dest + idx - 1 put: (getBlock value: idx)]] + ifFalse: [dest isCArray ifTrue: + [[ :idx | dest at: idx - 1 put: (getBlock value: idx)]]]]. - [dest isInteger ifTrue: - [[ :idx | self byteAt: dest + idx - 1 put: (getBlock value: idx)]]]. setBlock ifNil: [self error: 'unhandled type of destination string']. 1 to: count do: setBlock. "SVr4, 4.3BSD, C89, C99 require the remainder of the buffer be filled with nulls" getBlock := [:idx| 0]. count + 1 to: n do: setBlock. ^dest! |
Free forum by Nabble | Edit this page |