[Pharo-project] 1.3 OneCick with Cog VM
Igor Stasenko
siguctua at gmail.com
Fri Sep 9 20:55:24 CEST 2011
On 9 September 2011 20:43, John Toohey <jt at parspro.com> wrote:
> This happened after a VM crash, when I try to restart I get this in
> the log. Isn't the error caused by the isEmptyOrNil primitive? Is
> there anyway for me to access the image now?
>
an error caused by a primitive failure with invalid socket:
SocketStream>>receiveData
>> Receiver: SocketStream[inbuf:4kb/outbuf:4kb]
>> Arguments and temporary variables:
>>
>> Receiver's instance variables:
>> recentlyRead: 716
>> socket: a Socket[invalidSocketHandle]
>> inBuffer: 'CONNECTED
>> session:ID:John-Tooheys-MacBook-Pro.local-56368-1315585750...etc...
>> outBuffer: 'SUBSCRIBE
>> destination: /topic/parspro-core.juliet-core-events
looks like your image was saved with socket being open and upon
restart it tries to read data from it.
This , of course , causing failure and leads to error signaled.
If you want to track down the error, there is an option in system settings:
'Make a snapshot of new version before quit
On unhandled exception, save a new version of image before quit'
in 'Headless mode' group.
> On Fri, Sep 9, 2011 at 14:38, Igor Stasenko <siguctua at gmail.com> wrote:
>> On 9 September 2011 20:31, John Toohey <jt at parspro.com> wrote:
>>> I am experiencing a lot of random crashes with this VM on OSX 10.6. It
>>> just crashed again, and this time I cannot get it to restart. It seems
>>> to be crashing in a socket receive class. The stack trace is here :-
>>>
>>
>> This is not a crash, it just quits to OS due to error at startup.
>> To avoid imminent leave to OS, put an error handler around your startup code
>> (i guess it is in CoreMQStompConnection somewhere?).
>>
>>
>>
>>> THERE_BE_DRAGONS_HERE
>>> MessageNotUnderstood: PrimitiveFailed>>isEmptyOrNil
>>> 9 September 2011 2:28:41 pm
>>>
>>> VM: Mac OS - intel - 1067 - Croquet Closure Cog VM [CoInterpreter
>>> VMMaker-oscog-IgorStasenko.123] 21.0
>>> Image: Pharo1.3 [Latest update: #13298]
>>>
>>> PrimitiveFailed(Object)>>doesNotUnderstand: #isEmptyOrNil
>>> Receiver: PrimitiveFailed: primitive #primSocketReceiveDataAvailable:
>>> in a Socket[invalidSocketHandl...etc...
>>> Arguments and temporary variables:
>>> t1: isEmptyOrNil
>>> t2: MessageNotUnderstood: PrimitiveFailed>>isEmptyOrNil
>>> t3: nil
>>> Receiver's instance variables:
>>> messageText: 'primitive #primSocketReceiveDataAvailable: in a
>>> Socket[invalidSoc...etc...
>>> tag: nil
>>> signaler: a Socket[invalidSocketHandle]
>>> signalContext: PrimitiveFailed(Exception)>>signal
>>> handlerContext: BlockClosure>>on:do:
>>> outerContext: nil
>>> selector: #primSocketReceiveDataAvailable:
>>>
>>>
>>> [:t1 |
>>> | t2 |
>>> t1 << self class name.
>>> (t2 := self messageText) isEmptyOrNil
>>> ifFalse: [t1 << ': ' << t2]] in Error(Exception)>>description
>>> Receiver: <<error during printing>>
>>> Arguments and temporary variables:
>>> t1: a WriteStream 'Error'
>>> t2: PrimitiveFailed: primitive #primSocketReceiveDataAvailable: in
>>> a Socket[inv...etc...
>>> Receiver's instance variables:
>>> messageText: PrimitiveFailed: primitive
>>> #primSocketReceiveDataAvailable: in a S...etc...
>>> tag: nil
>>> signaler: a CoreMQStompConnection connectResponse: CONNECTED
>>> session: ID:John-T...etc...
>>> signalContext: Error(Exception)>>signal
>>> handlerContext: nil
>>> outerContext: nil
>>>
>>>
>>> String class(SequenceableCollection class)>>new:streamContents:
>>> Receiver: String
>>> Arguments and temporary variables:
>>> t1: 100
>>> t2: [:t1 |
>>> | t2 |
>>> t1 << self class name.
>>> (t2 := self messageText) isEmptyOrNi...etc...
>>> t3: a WriteStream 'Error'
>>> Receiver's instance variables:
>>> superclass: ArrayedCollection
>>> methodDict: a MethodDictionary(size 303)
>>> format: 2
>>> instanceVariables: nil
>>> organization: ('*Compiler-Kernel' inviolateInstanceVariableNames
>>> isLegalInstVar...etc...
>>> subclasses: {ByteString. WideString. Symbol}
>>> name: #String
>>> classPool: a Dictionary(#AsciiOrder->#[0 1 2 3 4 5 6 7 8 9 10 11 12
>>> 13 14 15 16...etc...
>>> sharedPools: nil
>>> environment: a SystemDictionary(lots of globals)
>>> category: #'Collections-Strings'
>>> traitComposition: {}
>>> localSelectors: nil
>>>
>>>
>>> String class(SequenceableCollection class)>>streamContents:
>>> Receiver: String
>>> Arguments and temporary variables:
>>> t1: [:t1 |
>>> | t2 |
>>> t1 << self class name.
>>> (t2 := self messageText) isEmptyOrNi...etc...
>>> Receiver's instance variables:
>>> superclass: ArrayedCollection
>>> methodDict: a MethodDictionary(size 303)
>>> format: 2
>>> instanceVariables: nil
>>> organization: ('*Compiler-Kernel' inviolateInstanceVariableNames
>>> isLegalInstVar...etc...
>>> subclasses: {ByteString. WideString. Symbol}
>>> name: #String
>>> classPool: a Dictionary(#AsciiOrder->#[0 1 2 3 4 5 6 7 8 9 10 11 12
>>> 13 14 15 16...etc...
>>> sharedPools: nil
>>> environment: a SystemDictionary(lots of globals)
>>> category: #'Collections-Strings'
>>> traitComposition: {}
>>> localSelectors: nil
>>>
>>>
>>> Error(Exception)>>description
>>> Receiver: <<error during printing>>
>>> Arguments and temporary variables:
>>>
>>> Receiver's instance variables:
>>> messageText: PrimitiveFailed: primitive
>>> #primSocketReceiveDataAvailable: in a S...etc...
>>> tag: nil
>>> signaler: a CoreMQStompConnection connectResponse: CONNECTED
>>> session: ID:John-T...etc...
>>> signalContext: Error(Exception)>>signal
>>> handlerContext: nil
>>> outerContext: nil
>>>
>>>
>>> StartupUIManager(NonInteractiveUIManager)>>unhandledErrorDefaultAction:
>>> Receiver: a StartupUIManager
>>> Arguments and temporary variables:
>>> <<error during printing>
>>> Receiver's instance variables:
>>> uiManager: a MorphicUIManager
>>> doNotQuitOnRestart: false
>>>
>>>
>>> UnhandledError>>defaultAction
>>> Receiver: UnhandledError
>>> Arguments and temporary variables:
>>>
>>> Receiver's instance variables:
>>> messageText: nil
>>> tag: nil
>>> signaler: <<error during printing>>
>>>
>>> UndefinedObject>>handleSignal:
>>> Receiver: nil
>>> Arguments and temporary variables:
>>> t1: UnhandledError
>>> Receiver's instance variables:
>>> nil
>>>
>>> MethodContext(ContextPart)>>handleSignal:
>>> Receiver: BlockClosure>>on:do:
>>> Arguments and temporary variables:
>>> t1: UnhandledError
>>> t2: nil
>>> Receiver's instance variables:
>>> sender: [[[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | nil...etc...
>>> pc: 17
>>> stackp: 3
>>> method: (BlockClosure>>#on:do: "a CompiledMethod(137625600)")
>>> closureOrNil: nil
>>> receiver: [[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | ni...etc...
>>>
>>>
>>> MethodContext(ContextPart)>>handleSignal:
>>> Receiver: BlockClosure>>on:do:
>>> Arguments and temporary variables:
>>> t1: UnhandledError
>>> t2: nil
>>> Receiver's instance variables:
>>> sender: [[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | nil]...etc...
>>> pc: 17
>>> stackp: 3
>>> method: (BlockClosure>>#on:do: "a CompiledMethod(137625600)")
>>> closureOrNil: nil
>>> receiver: [self announceNextCommand]
>>>
>>>
>>> UnhandledError(Exception)>>signal
>>> Receiver: UnhandledError
>>> Arguments and temporary variables:
>>>
>>> Receiver's instance variables:
>>> messageText: nil
>>> tag: nil
>>> signaler: <<error during printing>>
>>>
>>> UnhandledError class>>signalForException:
>>> Receiver: UnhandledError
>>> Arguments and temporary variables:
>>> <<error during printing>
>>> Receiver's instance variables:
>>> superclass: Exception
>>> methodDict: a
>>> MethodDictionary(#defaultAction->(UnhandledError>>#defaultAction
>>> ...etc...
>>> format: 144
>>> instanceVariables: #('exception')
>>> organization: ('*UIManager' defaultAction)
>>> ('as yet unclassified' exception exc...etc...
>>> subclasses: nil
>>> name: #UnhandledError
>>> classPool: nil
>>> sharedPools: nil
>>> environment: a SystemDictionary(lots of globals)
>>> category: #'Kernel-Exceptions'
>>> traitComposition: nil
>>> localSelectors: nil
>>>
>>>
>>> Error>>defaultAction
>>> Receiver: <<error during printing>>
>>> Arguments and temporary variables:
>>>
>>> Receiver's instance variables:
>>> messageText: PrimitiveFailed: primitive
>>> #primSocketReceiveDataAvailable: in a S...etc...
>>> tag: nil
>>> signaler: a CoreMQStompConnection connectResponse: CONNECTED
>>> session: ID:John-T...etc...
>>> signalContext: Error(Exception)>>signal
>>> handlerContext: nil
>>> outerContext: nil
>>>
>>>
>>> UndefinedObject>>handleSignal:
>>> Receiver: nil
>>> Arguments and temporary variables:
>>> <<error during printing>
>>> Receiver's instance variables:
>>> nil
>>>
>>> MethodContext(ContextPart)>>handleSignal:
>>> Receiver: BlockClosure>>on:do:
>>> Arguments and temporary variables:
>>> <<error during printing>
>>> Receiver's instance variables:
>>> sender: [[[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | nil...etc...
>>> pc: 17
>>> stackp: 3
>>> method: (BlockClosure>>#on:do: "a CompiledMethod(137625600)")
>>> closureOrNil: nil
>>> receiver: [[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | ni...etc...
>>>
>>>
>>> MethodContext(ContextPart)>>handleSignal:
>>> Receiver: BlockClosure>>on:do:
>>> Arguments and temporary variables:
>>> <<error during printing>
>>> Receiver's instance variables:
>>> sender: [[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | nil]...etc...
>>> pc: 17
>>> stackp: 3
>>> method: (BlockClosure>>#on:do: "a CompiledMethod(137625600)")
>>> closureOrNil: nil
>>> receiver: [self announceNextCommand]
>>>
>>>
>>> Error(Exception)>>signal
>>> Receiver: <<error during printing>>
>>> Arguments and temporary variables:
>>>
>>> Receiver's instance variables:
>>> messageText: PrimitiveFailed: primitive
>>> #primSocketReceiveDataAvailable: in a S...etc...
>>> tag: nil
>>> signaler: a CoreMQStompConnection connectResponse: CONNECTED
>>> session: ID:John-T...etc...
>>> signalContext: Error(Exception)>>signal
>>> handlerContext: nil
>>> outerContext: nil
>>>
>>>
>>> Error(Exception)>>signal:
>>> Receiver: <<error during printing>>
>>> Arguments and temporary variables:
>>> t1: PrimitiveFailed: primitive #primSocketReceiveDataAvailable: in
>>> a Socket[inv...etc...
>>> Receiver's instance variables:
>>> messageText: PrimitiveFailed: primitive
>>> #primSocketReceiveDataAvailable: in a S...etc...
>>> tag: nil
>>> signaler: a CoreMQStompConnection connectResponse: CONNECTED
>>> session: ID:John-T...etc...
>>> signalContext: Error(Exception)>>signal
>>> handlerContext: nil
>>> outerContext: nil
>>>
>>>
>>> CoreMQStompConnection(Object)>>error:
>>> Receiver: a CoreMQStompConnection connectResponse: CONNECTED
>>> session: ID:John-Tooheys-MacBook-Pro.lo...etc...
>>> Arguments and temporary variables:
>>> t1: PrimitiveFailed: primitive #primSocketReceiveDataAvailable: in
>>> a Socket[inv...etc...
>>> Receiver's instance variables:
>>> stream: SocketStream[inbuf:4kb/outbuf:4kb]
>>> connectResponse: CONNECTED
>>> session: ID:John-Tooheys-MacBook-Pro.local-56368-131...etc...
>>> subscriptions: an OrderedCollection('/topic/parspro-core.juliet-core-events')
>>> commandDestination: '/topic/parspro-core.juliet-core-events'
>>> process: a Process in nil
>>> logger: a JulietLogger
>>>
>>>
>>> [:t1 |
>>> self logger error: 'Error in startAnnouncing e --> ' , t1 greaseString.
>>> self error: t1.
>>> t1 return] in [[[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | nil]] repeat.
>>> nil]
>>> on: Error
>>> do: [:t1 |
>>> self logger error: 'Error in startAnnouncing e --> ' , t1 greaseString.
>>> self error: t1.
>>> t1 return]] in CoreMQStompConnection>>startAnnouncing
>>> Receiver: a CoreMQStompConnection connectResponse: CONNECTED
>>> session: ID:John-Tooheys-MacBook-Pro.lo...etc...
>>> Arguments and temporary variables:
>>> t1: PrimitiveFailed: primitive #primSocketReceiveDataAvailable: in
>>> a Socket[inv...etc...
>>> Receiver's instance variables:
>>> stream: SocketStream[inbuf:4kb/outbuf:4kb]
>>> connectResponse: CONNECTED
>>> session: ID:John-Tooheys-MacBook-Pro.local-56368-131...etc...
>>> subscriptions: an OrderedCollection('/topic/parspro-core.juliet-core-events')
>>> commandDestination: '/topic/parspro-core.juliet-core-events'
>>> process: a Process in nil
>>> logger: a JulietLogger
>>>
>>>
>>> BlockClosure>>cull:
>>> Receiver: [:t1 |
>>> self logger error: 'Error in startAnnouncing e --> ' , t1 greaseString.
>>> self erro...etc...
>>> Arguments and temporary variables:
>>> t1: PrimitiveFailed: primitive #primSocketReceiveDataAvailable: in
>>> a Socket[inv...etc...
>>> Receiver's instance variables:
>>> outerContext: [[[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1...etc...
>>> startpc: 118
>>> numArgs: 1
>>>
>>>
>>> [(self tempAt: 2)
>>> cull: t1] in MethodContext(ContextPart)>>handleSignal:
>>> Receiver: BlockClosure>>on:do:
>>> Arguments and temporary variables:
>>> t1: PrimitiveFailed: primitive #primSocketReceiveDataAvailable: in
>>> a Socket[inv...etc...
>>> Receiver's instance variables:
>>> sender: [[[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | nil...etc...
>>> pc: 17
>>> stackp: 3
>>> method: (BlockClosure>>#on:do: "a CompiledMethod(137625600)")
>>> closureOrNil: nil
>>> receiver: [[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | ni...etc...
>>>
>>>
>>> BlockClosure>>ensure:
>>> Receiver: [(self tempAt: 2)
>>> cull: t1]
>>> Arguments and temporary variables:
>>> aBlock: [self tempAt: 3 put: true]
>>> complete: nil
>>> returnValue: nil
>>> Receiver's instance variables:
>>> outerContext: MethodContext(ContextPart)>>handleSignal:
>>> startpc: 98
>>> numArgs: 0
>>>
>>>
>>> MethodContext(ContextPart)>>handleSignal:
>>> Receiver: BlockClosure>>on:do:
>>> Arguments and temporary variables:
>>> t1: PrimitiveFailed: primitive #primSocketReceiveDataAvailable: in
>>> a Socket[inv...etc...
>>> t2: nil
>>> Receiver's instance variables:
>>> sender: [[[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | nil...etc...
>>> pc: 17
>>> stackp: 3
>>> method: (BlockClosure>>#on:do: "a CompiledMethod(137625600)")
>>> closureOrNil: nil
>>> receiver: [[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | ni...etc...
>>>
>>>
>>> MethodContext(ContextPart)>>handleSignal:
>>> Receiver: BlockClosure>>on:do:
>>> Arguments and temporary variables:
>>> t1: PrimitiveFailed: primitive #primSocketReceiveDataAvailable: in
>>> a Socket[inv...etc...
>>> t2: nil
>>> Receiver's instance variables:
>>> sender: [[[self announceNextCommand]
>>> on: ConnectionTimedOut
>>> do: [:t1 | nil]...etc...
>>> pc: 17
>>> stackp: 3
>>> method: (BlockClosure>>#on:do: "a CompiledMethod(137625600)")
>>> closureOrNil: nil
>>> receiver: [self announceNextCommand]
>>>
>>>
>>> PrimitiveFailed(Exception)>>signal
>>> Receiver: PrimitiveFailed: primitive #primSocketReceiveDataAvailable:
>>> in a Socket[invalidSocketHandl...etc...
>>> Arguments and temporary variables:
>>>
>>> Receiver's instance variables:
>>> messageText: 'primitive #primSocketReceiveDataAvailable: in a
>>> Socket[invalidSoc...etc...
>>> tag: nil
>>> signaler: a Socket[invalidSocketHandle]
>>> signalContext: PrimitiveFailed(Exception)>>signal
>>> handlerContext: BlockClosure>>on:do:
>>> outerContext: nil
>>> selector: #primSocketReceiveDataAvailable:
>>>
>>>
>>> PrimitiveFailed class(SelectorException class)>>signalFor:
>>> Receiver: PrimitiveFailed
>>> Arguments and temporary variables:
>>> t1: #primSocketReceiveDataAvailable:
>>> Receiver's instance variables:
>>> superclass: SelectorException
>>> methodDict: a
>>> MethodDictionary(#standardMessageText->(PrimitiveFailed>>#standar...etc...
>>> format: 144
>>> instanceVariables: nil
>>> organization: ('printing' standardMessageText)
>>>
>>> subclasses: nil
>>> name: #PrimitiveFailed
>>> classPool: nil
>>> sharedPools: nil
>>> environment: a SystemDictionary(lots of globals)
>>> category: #'Kernel-Exceptions'
>>> traitComposition: {}
>>> localSelectors: nil
>>>
>>>
>>> Socket(Object)>>primitiveFailed:
>>> Receiver: a Socket[invalidSocketHandle]
>>> Arguments and temporary variables:
>>> t1: #primSocketReceiveDataAvailable:
>>> Receiver's instance variables:
>>> semaphore: a Semaphore()
>>> socketHandle: #[162 57 106 78 0 0 0 0 128 42 86 0]
>>> readSemaphore: a Semaphore()
>>> writeSemaphore: a Semaphore()
>>>
>>>
>>> Socket(Object)>>primitiveFailed
>>> Receiver: a Socket[invalidSocketHandle]
>>> Arguments and temporary variables:
>>>
>>> Receiver's instance variables:
>>> semaphore: a Semaphore()
>>> socketHandle: #[162 57 106 78 0 0 0 0 128 42 86 0]
>>> readSemaphore: a Semaphore()
>>> writeSemaphore: a Semaphore()
>>>
>>>
>>> Socket>>primSocketReceiveDataAvailable:
>>> Receiver: a Socket[invalidSocketHandle]
>>> Arguments and temporary variables:
>>> t1: #[162 57 106 78 0 0 0 0 128 42 86 0]
>>> Receiver's instance variables:
>>> semaphore: a Semaphore()
>>> socketHandle: #[162 57 106 78 0 0 0 0 128 42 86 0]
>>> readSemaphore: a Semaphore()
>>> writeSemaphore: a Semaphore()
>>>
>>>
>>> Socket>>waitForDataFor:ifClosed:ifTimedOut:
>>> Receiver: a Socket[invalidSocketHandle]
>>> Arguments and temporary variables:
>>> t1: 45
>>> t2: [ConnectionClosed signal: 'Connection closed while waiting for data.']
>>> t3: [ConnectionTimedOut signal: 'Data receive timed out.']
>>> t4: 2210099
>>> t5: 45000
>>> Receiver's instance variables:
>>> semaphore: a Semaphore()
>>> socketHandle: #[162 57 106 78 0 0 0 0 128 42 86 0]
>>> readSemaphore: a Semaphore()
>>> writeSemaphore: a Semaphore()
>>>
>>>
>>> Socket>>waitForDataFor:
>>> Receiver: a Socket[invalidSocketHandle]
>>> Arguments and temporary variables:
>>> t1: 45
>>> Receiver's instance variables:
>>> semaphore: a Semaphore()
>>> socketHandle: #[162 57 106 78 0 0 0 0 128 42 86 0]
>>> readSemaphore: a Semaphore()
>>> writeSemaphore: a Semaphore()
>>>
>>>
>>> Socket>>receiveDataSignallingTimeout:into:startingAt:
>>> Receiver: a Socket[invalidSocketHandle]
>>> Arguments and temporary variables:
>>> t1: 45
>>> t2: 'CONNECTED
>>> session:ID:John-Tooheys-MacBook-Pro.local-56368-1315585750288-4:...etc...
>>> t3: 796
>>> Receiver's instance variables:
>>> semaphore: a Semaphore()
>>> socketHandle: #[162 57 106 78 0 0 0 0 128 42 86 0]
>>> readSemaphore: a Semaphore()
>>> writeSemaphore: a Semaphore()
>>>
>>>
>>> SocketStream>>receiveData
>>> Receiver: SocketStream[inbuf:4kb/outbuf:4kb]
>>> Arguments and temporary variables:
>>>
>>> Receiver's instance variables:
>>> recentlyRead: 716
>>> socket: a Socket[invalidSocketHandle]
>>> inBuffer: 'CONNECTED
>>> session:ID:John-Tooheys-MacBook-Pro.local-56368-1315585750...etc...
>>> outBuffer: 'SUBSCRIBE
>>> destination: /topic/parspro-core.juliet-core-events
>>>
>>>
>>>
>>> On Thu, Sep 8, 2011 at 10:05, Marcus Denker <marcus.denker at inria.fr> wrote:
>>>>
>>>> On Sep 8, 2011, at 3:59 PM, John Toohey wrote:
>>>>
>>>>> Hi,
>>>>> Is there a 1.3 OneClick build available with the Cog VM, or should I
>>>>> just down load the linux and OSX Cog builds from the Jenkins server?
>>>>
>>>> The script on the hudson is old... we need to update it. And move everything
>>>> from hudson to jenkins. And, and...
>>>>
>>>> So for now:
>>>>
>>>> https://gforge.inria.fr/frs/download.php/28922/Pharo-1.3-OneClick.zip
>>>>
>>>> hand-build one-click with Cog as build from https://ci.lille.inria.fr/pharo/view/Cog/
>>>>
>>>>> often run into problems with having different VMs/Plugin on different
>>>>> servers, and like the idea of having both Liux and OSX supported in
>>>>> one package, where I can just update the image.
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Marcus Denker -- http://marcusdenker.de
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> ~JT
>>>
>>>
>>
>>
>>
>> --
>> Best regards,
>> Igor Stasenko AKA sig.
>>
>
>
>
> --
> ~JT
>
--
Best regards,
Igor Stasenko AKA sig.
More information about the Pharo-project
mailing list