Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.161.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.161 Author: eem Time: 7 June 2012, 12:13:51.191 pm UUID: d9d960b4-9f66-43a2-9d90-4fb58d541adc Ancestors: VMMaker.oscog-eem.160
Integrate ipv6 socket prims. Fix a typo.
=============== Diff against VMMaker.oscog-eem.160 ===============
Item was changed: ----- Method: NewspeakStackDepthFinder>>interpretNextNewspeakInstructionFor: (in category 'decoding') ----- interpretNextNewspeakInstructionFor: client "Send to the argument, client, a message that specifies the type of the next instruction."
| byte type offset method | method := self method. byte := method at: pc. type := byte // 16. offset := byte \ 16. pc := pc+1. "We do an inline binary search on each of the possible 16 values of type: + The old, cleaner but slow code is retained as a comment below" - The old, cleaner but slowe code is retained as a comment below" type < 8 ifTrue: [type < 4 ifTrue: [type < 2 ifTrue: [type < 1 ifTrue: ["type = 0" ^ client pushReceiverVariable: offset] ifFalse: ["type = 1" ^ client pushTemporaryVariable: offset]] ifFalse: [type < 3 ifTrue: ["type = 2" ^ client pushConstant: (method literalAt: offset + 1)] ifFalse: ["type = 3" ^ client pushConstant: (method literalAt: offset + 17)]]] ifFalse: [type < 6 ifTrue: [type < 5 ifTrue: ["type = 4" ^ client pushLiteralVariable: (method literalAt: offset + 1)] ifFalse: ["type = 5" ^ client pushLiteralVariable: (method literalAt: offset + 17)]] ifFalse: [type < 7 ifTrue: ["type = 6" offset < 8 ifTrue: [^ client popIntoReceiverVariable: offset] ifFalse: [^ client popIntoTemporaryVariable: offset - 8]] ifFalse: ["type = 7" offset = 0 ifTrue: [^ client pushReceiver]. offset < 8 ifTrue: [^ client pushConstant: (SpecialConstants at: offset)]. offset = 8 ifTrue: [^ client methodReturnReceiver]. offset < 12 ifTrue: [^ client methodReturnConstant: (SpecialConstants at: offset - 8)]. offset = 12 ifTrue: [^ client methodReturnTop]. offset = 13 ifTrue: [^ client blockReturnTop]. offset = 14 ifTrue: [| byte2 | byte := method at: pc. pc := pc+1. byte2 := method at: pc. pc := pc+1. ^client sendToDynamicSuperclass: (method literalAt: byte2 + 1) numArgs: byte]. offset = 15 ifTrue: [byte := method at: pc. pc := pc+1. ^client pushImplicitReceiverForMessage: (method literalAt: byte + 1)]. ^self error: 'unusedBytecode']]]] ifFalse: [type < 12 ifTrue: [type < 10 ifTrue: [type < 9 ifTrue: ["type = 8" ^ self interpretNewspeakExtension: offset in: method for: client] ifFalse: ["type = 9 (short jumps)" offset < 8 ifTrue: [^ client jump: offset + 1]. ^ client jump: offset - 8 + 1 if: false]] ifFalse: [type < 11 ifTrue: ["type = 10 (long jumps)" byte := method at: pc. pc := pc + 1. offset < 8 ifTrue: [^ client jump: offset - 4 * 256 + byte]. ^ client jump: (offset bitAnd: 3) * 256 + byte if: offset < 12] ifFalse: ["type = 11" ^ client send: (Smalltalk specialSelectorAt: offset + 1) super: false numArgs: (Smalltalk specialNargsAt: offset + 1)]]] ifFalse: [type = 12 ifTrue: [^ client send: (Smalltalk specialSelectorAt: offset + 17) super: false numArgs: (Smalltalk specialNargsAt: offset + 17)] ifFalse: ["type = 13, 14 or 15" ^ client send: (method literalAt: offset + 1) super: false numArgs: type - 13]]]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetAddressInfoFamily (in category 'ipv6 primitives') ----- + primitiveResolverGetAddressInfoFamily + + | family | + self primitive: 'primitiveResolverGetAddressInfoFamily' + parameters: #(). + interpreterProxy failed + ifFalse: + [family := self sqResolverGetAddressInfoFamily. + ^family asSmallIntegerObj]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetAddressInfoHost:service:flags:family:type:protocol: (in category 'ipv6 primitives') ----- + primitiveResolverGetAddressInfoHost: hostName service: servName flags: flags family: family type: type protocol: protocol + + | hostSize servSize | + self primitive: 'primitiveResolverGetAddressInfo' + parameters: #(String String SmallInteger SmallInteger SmallInteger SmallInteger). + interpreterProxy failed + ifFalse: + [hostSize := interpreterProxy byteSizeOf: hostName cPtrAsOop. + servSize := interpreterProxy byteSizeOf: servName cPtrAsOop. + self + sqResolverGetAddressInfoHost: hostName Size: hostSize Service: servName Size: servSize + Flags: flags Family: family Type: type Protocol: protocol]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetAddressInfoNext (in category 'ipv6 primitives') ----- + primitiveResolverGetAddressInfoNext + + | more | + self primitive: 'primitiveResolverGetAddressInfoNext' + parameters: #(). + more := self sqResolverGetAddressInfoNext. + interpreterProxy failed ifTrue: [^nil]. + ^more asBooleanObj!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetAddressInfoProtocol (in category 'ipv6 primitives') ----- + primitiveResolverGetAddressInfoProtocol + + | protocol | + self primitive: 'primitiveResolverGetAddressInfoProtocol' + parameters: #(). + interpreterProxy failed + ifFalse: + [protocol := self sqResolverGetAddressInfoProtocol. + ^protocol asSmallIntegerObj]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetAddressInfoResult: (in category 'ipv6 primitives') ----- + primitiveResolverGetAddressInfoResult: socketAddress + + | addrSize | + self primitive: 'primitiveResolverGetAddressInfoResult' + parameters: #(ByteArray). + interpreterProxy failed + ifFalse: + [addrSize := interpreterProxy byteSizeOf: socketAddress cPtrAsOop. + self sqResolverGetAddressInfoResult: socketAddress Size: addrSize]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetAddressInfoSize (in category 'ipv6 primitives') ----- + primitiveResolverGetAddressInfoSize + + | size | + self primitive: 'primitiveResolverGetAddressInfoSize' + parameters: #(). + interpreterProxy failed + ifFalse: + [size := self sqResolverGetAddressInfoSize. + ^size asSmallIntegerObj]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetAddressInfoType (in category 'ipv6 primitives') ----- + primitiveResolverGetAddressInfoType + + | type | + self primitive: 'primitiveResolverGetAddressInfoType' + parameters: #(). + interpreterProxy failed + ifFalse: + [type := self sqResolverGetAddressInfoType. + ^type asSmallIntegerObj]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetNameInfo:flags: (in category 'ipv6 primitives') ----- + primitiveResolverGetNameInfo: socketAddress flags: flags + + | addrSize addrBase | + <var: #addrBase type: 'char *'> + self primitive: 'primitiveResolverGetNameInfo' + parameters: #(Oop SmallInteger). + interpreterProxy failed + ifFalse: + [addrSize := interpreterProxy byteSizeOf: socketAddress. + addrBase := self cCoerce: (interpreterProxy firstIndexableField: socketAddress) to: 'char *'. + self sqResolverGetNameInfo: addrBase Size: addrSize Flags: flags]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetNameInfoHostResult: (in category 'ipv6 primitives') ----- + primitiveResolverGetNameInfoHostResult: socketName + + | addrSize | + self primitive: 'primitiveResolverGetNameInfoHostResult' + parameters: #(String). + interpreterProxy failed + ifFalse: + [addrSize := interpreterProxy byteSizeOf: socketName cPtrAsOop. + self sqResolverGetNameInfoHostResult: socketName Size: addrSize]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetNameInfoHostSize (in category 'ipv6 primitives') ----- + primitiveResolverGetNameInfoHostSize + + | size | + self primitive: 'primitiveResolverGetNameInfoHostSize' + parameters: #(). + interpreterProxy failed + ifFalse: + [size := self sqResolverGetNameInfoHostSize. + ^size asSmallIntegerObj]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetNameInfoServiceResult: (in category 'ipv6 primitives') ----- + primitiveResolverGetNameInfoServiceResult: socketName + + | addrSize | + self primitive: 'primitiveResolverGetNameInfoServiceResult' + parameters: #(String). + interpreterProxy failed + ifFalse: + [addrSize := interpreterProxy byteSizeOf: socketName cPtrAsOop. + self sqResolverGetNameInfoServiceResult: socketName Size: addrSize]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverGetNameInfoServiceSize (in category 'ipv6 primitives') ----- + primitiveResolverGetNameInfoServiceSize + + | size | + self primitive: 'primitiveResolverGetNameInfoServiceSize' + parameters: #(). + interpreterProxy failed + ifFalse: + [size := self sqResolverGetNameInfoServiceSize. + ^size asSmallIntegerObj]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverHostNameResult: (in category 'ipv6 primitives') ----- + primitiveResolverHostNameResult: nameString + + | nameSize | + self primitive: 'primitiveResolverHostNameResult' + parameters: #(String). + interpreterProxy failed + ifFalse: + [nameSize := interpreterProxy byteSizeOf: nameString cPtrAsOop. + self sqResolverHostNameResult: nameString Size: nameSize]!
Item was added: + ----- Method: SocketPlugin>>primitiveResolverHostNameSize (in category 'ipv6 primitives') ----- + primitiveResolverHostNameSize + + | size | + self primitive: 'primitiveResolverHostNameSize' + parameters: #(). + interpreterProxy failed + ifFalse: + [size := self sqResolverHostNameSize. + interpreterProxy failed ifFalse: [^size asSmallIntegerObj]]!
Item was added: + ----- Method: SocketPlugin>>primitiveSocket:bindTo: (in category 'ipv6 primitives') ----- + primitiveSocket: socket bindTo: socketAddress + + | addrSize addrBase s | + <var: #addrBase type: 'char *'> + <var: #s type: 'SocketPtr'> + self primitive: 'primitiveSocketBindTo' parameters: #(#Oop #Oop). + s := self socketValueOf: socket. + addrSize := interpreterProxy byteSizeOf: socketAddress. + addrBase := self cCoerce: (interpreterProxy firstIndexableField: socketAddress) to: 'char *'. + interpreterProxy failed ifFalse: [self sqSocket: s BindToAddress: addrBase Size: addrSize]!
Item was added: + ----- Method: SocketPlugin>>primitiveSocket:connectTo: (in category 'ipv6 primitives') ----- + primitiveSocket: socket connectTo: socketAddress + + | addrSize addrBase s | + <var: #addrBase type: 'char *'> + <var: #s type: 'SocketPtr'> + self primitive: 'primitiveSocketConnectTo' parameters: #(#Oop #Oop). + s := self socketValueOf: socket. + addrSize := interpreterProxy byteSizeOf: socketAddress. + addrBase := self cCoerce: (interpreterProxy firstIndexableField: socketAddress) to: 'char *'. + interpreterProxy failed ifFalse: [self sqSocket: s ConnectToAddress: addrBase Size: addrSize]!
Item was changed: ----- Method: SocketPlugin>>primitiveSocket:listenOnPort: (in category 'primitives') ----- primitiveSocket: socket listenOnPort: port "one part of the wierdass dual prim primitiveSocketListenOnPort which was warped by some demented evil person determined to twist the very nature of reality" | s okToListen | <var: #s type: 'SocketPtr '> self primitive: 'primitiveSocketListenOnPort' parameters: #(#Oop #SmallInteger ). s := self socketValueOf: socket. "If the security plugin can be loaded, use it to check for permission. If not, assume it's ok" sCCLOPfn ~= 0 ifTrue: [okToListen := self cCode: ' ((int (*) (SocketPtr, int)) sCCLOPfn)(s, port)'. okToListen ifFalse: [^ interpreterProxy primitiveFail]]. + interpreterProxy failed ifFalse:[self sqSocket: s ListenOnPort: port]! - self sqSocket: s ListenOnPort: port!
Item was added: + ----- Method: SocketPlugin>>primitiveSocket:listenWithBacklog: (in category 'ipv6 primitives') ----- + primitiveSocket: socket listenWithBacklog: backlogSize + + | s | + <var: #s type: 'SocketPtr'> + self primitive: 'primitiveSocketListenWithBacklog' parameters: #(#Oop #SmallInteger). + s := self socketValueOf: socket. + interpreterProxy failed ifFalse: [self sqSocket: s ListenBacklog: backlogSize]!
Item was added: + ----- Method: SocketPlugin>>primitiveSocket:localAddressResult: (in category 'ipv6 primitives') ----- + primitiveSocket: socket localAddressResult: socketAddress + + | addrSize addrBase s | + <var: #addrBase type: 'char *'> + <var: #s type: 'SocketPtr'> + self primitive: 'primitiveSocketLocalAddressResult' parameters: #(#Oop #Oop). + s := self socketValueOf: socket. + addrSize := interpreterProxy byteSizeOf: socketAddress. + addrBase := self cCoerce: (interpreterProxy firstIndexableField: socketAddress) to: 'char *'. + interpreterProxy failed ifFalse: [self sqSocket: s LocalAddressResult: addrBase Size: addrSize]!
Item was added: + ----- Method: SocketPlugin>>primitiveSocket:remoteAddressResult: (in category 'ipv6 primitives') ----- + primitiveSocket: socket remoteAddressResult: socketAddress + + | addrSize addrBase s | + <var: #addrBase type: 'char *'> + <var: #s type: 'SocketPtr'> + self primitive: 'primitiveSocketRemoteAddressResult' parameters: #(#Oop #Oop). + s := self socketValueOf: socket. + addrSize := interpreterProxy byteSizeOf: socketAddress. + addrBase := self cCoerce: (interpreterProxy firstIndexableField: socketAddress) to: 'char *'. + interpreterProxy failed ifFalse: [self sqSocket: s RemoteAddressResult: addrBase Size: addrSize]!
Item was added: + ----- Method: SocketPlugin>>primitiveSocketAddressGetPort (in category 'ipv6 primitives') ----- + primitiveSocketAddressGetPort + + | addr addrSize addrBase port | + <var: #addrBase type: 'char *'> + addr := self primitive: 'primitiveSocketAddressGetPort' parameters: #() receiver: #Oop. + addrSize := interpreterProxy byteSizeOf: addr. + addrBase := self cCoerce: (interpreterProxy firstIndexableField: addr) to: 'char *'. + interpreterProxy failed + ifFalse: + [port := self sqSocketAddress: addrBase SizeGetPort: addrSize. + interpreterProxy failed ifFalse: [^port asSmallIntegerObj]]!
Item was added: + ----- Method: SocketPlugin>>primitiveSocketAddressSetPort: (in category 'ipv6 primitives') ----- + primitiveSocketAddressSetPort: portNumber + + | addr addrSize addrBase | + <var: #addrBase type: 'char *'> + addr := self primitive: 'primitiveSocketAddressSetPort' parameters: #(SmallInteger) receiver: #Oop. + addrSize := interpreterProxy byteSizeOf: addr. + addrBase := self cCoerce: (interpreterProxy firstIndexableField: addr) to: 'char *'. + interpreterProxy failed ifFalse: [self sqSocketAddress: addrBase Size: addrSize SetPort: portNumber]!
Item was added: + ----- Method: SocketPlugin>>primitiveSocketLocalAddressSize: (in category 'ipv6 primitives') ----- + primitiveSocketLocalAddressSize: socket + + | s size | + <var: #s type: 'SocketPtr'> + self primitive: 'primitiveSocketLocalAddressSize' parameters: #(#Oop). + s := self socketValueOf: socket. + interpreterProxy failed ifTrue: [^nil]. + size := self sqSocketLocalAddressSize: s. + interpreterProxy failed ifTrue: [^nil]. + ^size asSmallIntegerObj!
Item was added: + ----- Method: SocketPlugin>>primitiveSocketRemoteAddressSize: (in category 'ipv6 primitives') ----- + primitiveSocketRemoteAddressSize: socket + + | s size | + <var: #s type: 'SocketPtr'> + self primitive: 'primitiveSocketRemoteAddressSize' parameters: #(#Oop). + s := self socketValueOf: socket. + interpreterProxy failed ifTrue: [^nil]. + size := self sqSocketRemoteAddressSize: s. + interpreterProxy failed ifTrue: [^nil]. + ^size asSmallIntegerObj!
Item was changed: ----- Method: SocketPlugin>>socketValueOf: (in category 'primitives') ----- socketValueOf: socketOop "Return a pointer to the first byte of of the socket record within the + given Smalltalk object, or nil if socketOop is not a socket record." - given Smalltalk object, or nil if socketOop is not a socket record." - | socketIndex | <returnTypeC: 'SocketPtr'> - <var: #socketIndex type: 'void *'> interpreterProxy success: ((interpreterProxy isBytes: socketOop) and: [(interpreterProxy byteSizeOf: socketOop) = self socketRecordSize]). + ^interpreterProxy failed + ifTrue: [nil] + ifFalse: [self cCoerce: (interpreterProxy firstIndexableField: socketOop) to: 'SocketPtr']! - interpreterProxy failed ifTrue: - [^ nil]. - socketIndex := self cCoerce: (interpreterProxy firstIndexableField: socketOop) to: 'SocketPtr'. - ^socketIndex!
vm-dev@lists.squeakfoundation.org