[squeak-dev] Closure testers needed

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
23 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Re: [squeak-dev] Closure testers needed

Eliot Miranda-2
Hi Ken,

On Thu, Jul 16, 2009 at 1:58 PM, Ken Causey <[hidden email]> wrote:
What '3.9 final image' are you referring to?  I see none of these
methods in 3.9-7067.  Why are we talking about 3.9 anyway?

You reported a failure in trying to load the closure configuration in an image that was equipped with traits, specifically an MNU for variablesAndOffsetsDo:.   I took the nearest traits-equipped image I have to hand, which is Squeak3.9-final-7067.image and looked.  I was then able to explain that this method and a couple of others could be copied from Behavior & ClassDescription into TraitBehavior and TraitDescription to fix the problem.

Does that help?

best
Eliot
 


Ken

On Thu, 2009-07-16 at 12:31 -0700, Eliot Miranda wrote:
> So someone needs to implement variablesAndOffsetsDo: for TraitBehavior
> analogous to Behavior>> variablesAndOffsetsDo:.
> variablesAndOffsetsDo: is the interface I added between the compiler
> and the class its compiling in to abstract away from instance
> variable/slot implementation.  See Encoder>>init:context:notifying:
> ...
> class variablesAndOffsetsDo:
> [:variable "<String|CFieldDefinition>" :offset "<Integer|nil>" |
> offset isNil
> ifTrue: [scopeTable at: variable name put: (FieldNode new
> fieldDefinition: variable)]
> ifFalse: [scopeTable
> at: variable
> put: (offset >= 0
> ifTrue: [InstanceVariableNode new
> name: variable index: offset]
> ifFalse: [MaybeContextInstanceVariableNode new
> name: variable index: offset negated])]].
> ...
>
>
> FieldNode is the Tweak compiler extension that compiles Tweak property
> access as message sends to slot accessors.  The negative offset hack
> allows ContextPart (actually InstructionStream and subclasses) to
> access its instance variables specially, allowing the VM to hide
> context-to-sack mapping and make contexts appear like normal objects
> even though inside the VM they may actually be proxies for stack
> frames.
>
>
> Quickly looking at the 3.9 final image I'd say that you'd do the
> following copies:
> Behavior variablesAndOffsetsDo: => TraitBehavior
> Behavior instVarNamesAndOffsetsDo: -> TraitBehavior
> ClassDescription instVarNamesAndOffsetsDo: -> TraitDescription
>
>
> and then things have a good chance of working.
>
>
> HTH
> Eliot
>
> On Thu, Jul 16, 2009 at 10:47 AM, Ken Causey <[hidden email]>
> wrote:
>         So I decided I would try to run all the tests and almost
>         immediately I
>         got a debugger.  This is with an image built using the
>         directions
>         running on 32-bit linux with exupery 0.15.1 VM.  The failure
>         seems to be
>         in the setup of TraitsResource
>
>         Ken
>
>         SecurityManager state:
>         Restricted: false
>         FileAccess: true
>         SocketAccess: true
>         Working Dir /home/ken/projects/squeak/ncdm
>         Trusted Dir /home/ken/projects/squeak/ncdm/secure
>         Untrusted Dir /home/ken/projects/squeak/ncdm/My Squeak
>
>         ClassTrait(Object)>>doesNotUnderstand: #variablesAndOffsetsDo:
>                Receiver: T2 classTrait
>                Arguments and temporary variables:
>                        aMessage:       variablesAndOffsetsDo:
>         [closure] in
>         EncoderForV3PlusClosures(Encoder)...etc...
>                Receiver's instance variables:
>                        methodDict:     a MethodDictionary()
>                        traitComposition:       {}
>                        localSelectors:         nil
>                        users:  an IdentitySet()
>                        organization:   nil
>                        baseTrait:      T2
>
>         EncoderForV3PlusClosures(Encoder)>>init:context:notifying:
>                Receiver: {an EncoderForV3PlusClosures}
>                Arguments and temporary variables:
>                        aClass:         T2 classTrait
>                        aContext:       nil
>                        req:    a Parser
>                        homeNode:       nil
>                Receiver's instance variables:
>                        comment:        nil
>                        pc:     nil
>                        scopeTable:     a Dictionary('false'->{false}
>         'nil'->{nil} 'self'->{self}
>         'super'->...etc...
>                        nTemps:         0
>                        supered:        false
>                        requestor:      a Parser
>                        class:  T2 classTrait
>                        selector:       nil
>                        literalStream:  a WriteStream #()
>                        selectorSet:    a Dictionary(#*->{*} #+->{+}
>         #-->{-} #/->{/} #'//'->{//}
>         #<->{<} #...etc...
>                        litIndSet:      a Dictionary()
>                        litSet:         a LiteralDictionary(-1->{-1}
>         0->{0} 1->{1} 2->{2} )
>                        sourceRanges:   nil
>                        globalSourceRanges:     nil
>                        stream:         nil
>                        position:       nil
>                        rootNode:       nil
>                        blockExtentsToLocals:   nil
>
>         [] in
>         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>                Receiver: a Parser
>                Arguments and temporary variables:
>         <<error during printing>
>                Receiver's instance variables:
>                        source:         a ReadStream 'm2ClassSide: a
>         ^a'
>                        mark:   14
>                        hereChar:       Character space
>                        aheadChar:      $^
>                        token:  'a'
>                        tokenType:      #word
>                        currentComment:         nil
>                        buffer:         a WriteStream 'a'
>                        typeTable:      #(#xBinary #xBinary #xBinary
>         #xBinary #xBinary #xBinary
>         #xBinary #xB...etc...
>                        here:   'm2ClassSide:'
>                        hereType:       #keyword
>                        hereMark:       1
>                        hereEnd:        12
>                        prevMark:       1
>                        prevEnd:        nil
>                        encoder:        {an EncoderForV3PlusClosures}
>                        requestor:      nil
>                        parseNode:      nil
>                        failBlock:      [closure] in
>         Compiler>>translate:noPattern:ifFail:
>                        requestorOffset:        0
>                        tempsMark:      nil
>                        doitFlag:       false
>                        properties:     nil
>                        category:       #'as yet unclassified'
>
>         BlockClosure>>on:do:
>                Receiver: [closure] in
>         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>                Arguments and temporary variables:
>                        exception:      ReparseAfterSourceEditing
>                        handlerAction:  [closure] in
>         Parser>>parse:class:category:noPattern:context:noti...etc...
>                        handlerActive:  true
>                Receiver's instance variables:
>                        outerContext:
>         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>                        startpc:        131
>                        numArgs:        0
>
>
>         --- The full stack ---
>         ClassTrait(Object)>>doesNotUnderstand: #variablesAndOffsetsDo:
>         EncoderForV3PlusClosures(Encoder)>>init:context:notifying:
>         [] in
>         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>         BlockClosure>>on:do:
>          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>         - -
>         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>         Compiler>>translate:noPattern:ifFail:
>         Compiler>>compile:in:classified:notifying:ifFail:
>         ClassTrait(TraitBehavior)>>compile:classified:notifying:trailer:ifFail:
>         ClassTrait(TraitDescription)>>compile:classified:withStamp:notifying:logSource:
>         ClassTrait>>compile:classified:withStamp:notifying:logSource:
>         ClassTrait(TraitDescription)>>compile:classified:withStamp:notifying:
>         ClassTrait(TraitDescription)>>compile:classified:notifying:
>         ClassTrait(TraitDescription)>>compile:notifying:
>         ClassTrait(TraitBehavior)>>compile:
>         [] in TraitsResource>>setUp
>         [] in SystemChangeNotifier>>doSilently:
>         BlockClosure>>ensure:
>         SystemChangeNotifier>>doSilently:
>         TraitsResource>>setUp
>         TraitsResource(TestResource)>>initialize
>         TraitsResource class(Behavior)>>new
>         TraitsResource class(TestResource class)>>current
>         TraitsResource class(TestResource class)>>isAvailable
>         [] in TestRunner>>basicSetUpSuite:
>         Set>>do:
>         TestRunner>>basicSetUpSuite:
>         TestRunner>>basicRunSuite:do:
>         TestRunner>>runSuite:
>         TestRunner>>runAll
>         PluggableButtonMorphPlus(PluggableButtonMorph)>>performAction
>         PluggableButtonMorphPlus>>performAction
>         [] in PluggableButtonMorphPlus(PluggableButtonMorph)>>mouseUp:
>         ...etc...
>
>
>
>
>
>



Reply | Threaded
Open this post in threaded view
|

Re: [squeak-dev] Closure testers needed

Nicolas Cellier
These methods are in Pharo and stamped eem (almost one year old).
I presume Andreas just missed a 3.9 specific changeSet.

Trait>>variablesAndOffsetsDo: aBinaryBlock
        "This is the interface between the compiler and a class's instance or
field names.  The
         class should enumerate aBinaryBlock with the field definitions (with
nil offsets) followed
         by the instance variable name strings and their integer offsets
(1-relative).  The order is
         important; names evaluated later will override the same names
occurring earlier."

        "Since Traits don't confer state there is nothing to do here."

2009/7/16 Eliot Miranda <[hidden email]>:

> Hi Ken,
>
> On Thu, Jul 16, 2009 at 1:58 PM, Ken Causey <[hidden email]> wrote:
>>
>> What '3.9 final image' are you referring to?  I see none of these
>> methods in 3.9-7067.  Why are we talking about 3.9 anyway?
>
> You reported a failure in trying to load the closure configuration in an
> image that was equipped with traits, specifically an MNU for
> variablesAndOffsetsDo:.   I took the nearest traits-equipped image I have to
> hand, which is Squeak3.9-final-7067.image and looked.  I was then able to
> explain that this method and a couple of others could be copied from
> Behavior & ClassDescription into TraitBehavior and TraitDescription to fix
> the problem.
> Does that help?
> best
> Eliot
>
>>
>> Ken
>>
>> On Thu, 2009-07-16 at 12:31 -0700, Eliot Miranda wrote:
>> > So someone needs to implement variablesAndOffsetsDo: for TraitBehavior
>> > analogous to Behavior>> variablesAndOffsetsDo:.
>> > variablesAndOffsetsDo: is the interface I added between the compiler
>> > and the class its compiling in to abstract away from instance
>> > variable/slot implementation.  See Encoder>>init:context:notifying:
>> > ...
>> > class variablesAndOffsetsDo:
>> > [:variable "<String|CFieldDefinition>" :offset "<Integer|nil>" |
>> > offset isNil
>> > ifTrue: [scopeTable at: variable name put: (FieldNode new
>> > fieldDefinition: variable)]
>> > ifFalse: [scopeTable
>> > at: variable
>> > put: (offset >= 0
>> > ifTrue: [InstanceVariableNode new
>> > name: variable index: offset]
>> > ifFalse: [MaybeContextInstanceVariableNode new
>> > name: variable index: offset negated])]].
>> > ...
>> >
>> >
>> > FieldNode is the Tweak compiler extension that compiles Tweak property
>> > access as message sends to slot accessors.  The negative offset hack
>> > allows ContextPart (actually InstructionStream and subclasses) to
>> > access its instance variables specially, allowing the VM to hide
>> > context-to-sack mapping and make contexts appear like normal objects
>> > even though inside the VM they may actually be proxies for stack
>> > frames.
>> >
>> >
>> > Quickly looking at the 3.9 final image I'd say that you'd do the
>> > following copies:
>> > Behavior variablesAndOffsetsDo: => TraitBehavior
>> > Behavior instVarNamesAndOffsetsDo: -> TraitBehavior
>> > ClassDescription instVarNamesAndOffsetsDo: -> TraitDescription
>> >
>> >
>> > and then things have a good chance of working.
>> >
>> >
>> > HTH
>> > Eliot
>> >
>> > On Thu, Jul 16, 2009 at 10:47 AM, Ken Causey <[hidden email]>
>> > wrote:
>> >         So I decided I would try to run all the tests and almost
>> >         immediately I
>> >         got a debugger.  This is with an image built using the
>> >         directions
>> >         running on 32-bit linux with exupery 0.15.1 VM.  The failure
>> >         seems to be
>> >         in the setup of TraitsResource
>> >
>> >         Ken
>> >
>> >         SecurityManager state:
>> >         Restricted: false
>> >         FileAccess: true
>> >         SocketAccess: true
>> >         Working Dir /home/ken/projects/squeak/ncdm
>> >         Trusted Dir /home/ken/projects/squeak/ncdm/secure
>> >         Untrusted Dir /home/ken/projects/squeak/ncdm/My Squeak
>> >
>> >         ClassTrait(Object)>>doesNotUnderstand: #variablesAndOffsetsDo:
>> >                Receiver: T2 classTrait
>> >                Arguments and temporary variables:
>> >                        aMessage:       variablesAndOffsetsDo:
>> >         [closure] in
>> >         EncoderForV3PlusClosures(Encoder)...etc...
>> >                Receiver's instance variables:
>> >                        methodDict:     a MethodDictionary()
>> >                        traitComposition:       {}
>> >                        localSelectors:         nil
>> >                        users:  an IdentitySet()
>> >                        organization:   nil
>> >                        baseTrait:      T2
>> >
>> >         EncoderForV3PlusClosures(Encoder)>>init:context:notifying:
>> >                Receiver: {an EncoderForV3PlusClosures}
>> >                Arguments and temporary variables:
>> >                        aClass:         T2 classTrait
>> >                        aContext:       nil
>> >                        req:    a Parser
>> >                        homeNode:       nil
>> >                Receiver's instance variables:
>> >                        comment:        nil
>> >                        pc:     nil
>> >                        scopeTable:     a Dictionary('false'->{false}
>> >         'nil'->{nil} 'self'->{self}
>> >         'super'->...etc...
>> >                        nTemps:         0
>> >                        supered:        false
>> >                        requestor:      a Parser
>> >                        class:  T2 classTrait
>> >                        selector:       nil
>> >                        literalStream:  a WriteStream #()
>> >                        selectorSet:    a Dictionary(#*->{*} #+->{+}
>> >         #-->{-} #/->{/} #'//'->{//}
>> >         #<->{<} #...etc...
>> >                        litIndSet:      a Dictionary()
>> >                        litSet:         a LiteralDictionary(-1->{-1}
>> >         0->{0} 1->{1} 2->{2} )
>> >                        sourceRanges:   nil
>> >                        globalSourceRanges:     nil
>> >                        stream:         nil
>> >                        position:       nil
>> >                        rootNode:       nil
>> >                        blockExtentsToLocals:   nil
>> >
>> >         [] in
>> >         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>> >                Receiver: a Parser
>> >                Arguments and temporary variables:
>> >         <<error during printing>
>> >                Receiver's instance variables:
>> >                        source:         a ReadStream 'm2ClassSide: a
>> >         ^a'
>> >                        mark:   14
>> >                        hereChar:       Character space
>> >                        aheadChar:      $^
>> >                        token:  'a'
>> >                        tokenType:      #word
>> >                        currentComment:         nil
>> >                        buffer:         a WriteStream 'a'
>> >                        typeTable:      #(#xBinary #xBinary #xBinary
>> >         #xBinary #xBinary #xBinary
>> >         #xBinary #xB...etc...
>> >                        here:   'm2ClassSide:'
>> >                        hereType:       #keyword
>> >                        hereMark:       1
>> >                        hereEnd:        12
>> >                        prevMark:       1
>> >                        prevEnd:        nil
>> >                        encoder:        {an EncoderForV3PlusClosures}
>> >                        requestor:      nil
>> >                        parseNode:      nil
>> >                        failBlock:      [closure] in
>> >         Compiler>>translate:noPattern:ifFail:
>> >                        requestorOffset:        0
>> >                        tempsMark:      nil
>> >                        doitFlag:       false
>> >                        properties:     nil
>> >                        category:       #'as yet unclassified'
>> >
>> >         BlockClosure>>on:do:
>> >                Receiver: [closure] in
>> >         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>> >                Arguments and temporary variables:
>> >                        exception:      ReparseAfterSourceEditing
>> >                        handlerAction:  [closure] in
>> >         Parser>>parse:class:category:noPattern:context:noti...etc...
>> >                        handlerActive:  true
>> >                Receiver's instance variables:
>> >                        outerContext:
>> >         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>> >                        startpc:        131
>> >                        numArgs:        0
>> >
>> >
>> >         --- The full stack ---
>> >         ClassTrait(Object)>>doesNotUnderstand: #variablesAndOffsetsDo:
>> >         EncoderForV3PlusClosures(Encoder)>>init:context:notifying:
>> >         [] in
>> >         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>> >         BlockClosure>>on:do:
>> >          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>> >         - -
>> >         Parser>>parse:class:category:noPattern:context:notifying:ifFail:
>> >         Compiler>>translate:noPattern:ifFail:
>> >         Compiler>>compile:in:classified:notifying:ifFail:
>> >
>> > ClassTrait(TraitBehavior)>>compile:classified:notifying:trailer:ifFail:
>> >
>> > ClassTrait(TraitDescription)>>compile:classified:withStamp:notifying:logSource:
>> >         ClassTrait>>compile:classified:withStamp:notifying:logSource:
>> >
>> > ClassTrait(TraitDescription)>>compile:classified:withStamp:notifying:
>> >         ClassTrait(TraitDescription)>>compile:classified:notifying:
>> >         ClassTrait(TraitDescription)>>compile:notifying:
>> >         ClassTrait(TraitBehavior)>>compile:
>> >         [] in TraitsResource>>setUp
>> >         [] in SystemChangeNotifier>>doSilently:
>> >         BlockClosure>>ensure:
>> >         SystemChangeNotifier>>doSilently:
>> >         TraitsResource>>setUp
>> >         TraitsResource(TestResource)>>initialize
>> >         TraitsResource class(Behavior)>>new
>> >         TraitsResource class(TestResource class)>>current
>> >         TraitsResource class(TestResource class)>>isAvailable
>> >         [] in TestRunner>>basicSetUpSuite:
>> >         Set>>do:
>> >         TestRunner>>basicSetUpSuite:
>> >         TestRunner>>basicRunSuite:do:
>> >         TestRunner>>runSuite:
>> >         TestRunner>>runAll
>> >         PluggableButtonMorphPlus(PluggableButtonMorph)>>performAction
>> >         PluggableButtonMorphPlus>>performAction
>> >         [] in PluggableButtonMorphPlus(PluggableButtonMorph)>>mouseUp:
>> >         ...etc...
>> >
>> >
>> >
>> >
>> >
>> >
>
>
>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: [squeak-dev] Closure testers needed

Bryce Kampjes
In reply to this post by Mariano Martinez Peck
On Thu, 2009-07-16 at 13:03 -0100, Mariano Martinez Peck wrote:

>
>
> On Thu, Jul 16, 2009 at 5:28 AM, Andreas Raab <[hidden email]>
> wrote:
>         Folks -
>        
>         I have a closure version for the trunk that's ready for
>         testing. Since converting an image to closures is tricky I
>         would like a couple of people to give it a test run before I
>         push it for real. I am interested in both positive feedback
>         ("works for me") as well as negative feedback ("crashes,
>         hangs, core-dumps when trying to load x,y,z") in particular if
>         you use custom 3.10[.2] based images.
>        
>         In order to test the load process you need to:
>        
>         1) Get a closure-enabled VM from:
>         http://squeakvm.org/win32/release/SqueakVM-Win32-3.11.3-bin.zip (win)
>         ftp://ftp.smalltalkconsulting.com/Squeak%
>         204.1.1beta2U.app.zip  (mac)
>
> I am on Linux. In Pharo we have to use Exupery VM because  it was
> compiled with Closure changes and Standard VM doesn't. If someone
> makes a binary of Linux I can give it a try.

You should be able to use the Exupery VM for squeak-dev images too. I
supplied it to enable closure images to be built and debugged.

It does have a few extra changes from the base VM that can be safely
ignored.

Bryce


12