[Vm-dev] VM Maker: VMMaker.oscog-eem.161.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Jun 7 19:16:23 UTC 2012
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!
More information about the Vm-dev
mailing list