[squeak-dev] [Environments] ScriptEncoder>>associationForClass problem // globals
Levente Uzonyi
leves at caesar.elte.hu
Sat Oct 14 21:22:44 UTC 2017
The cause of the issue is ScriptEncoder >> #init:context:notifying:
explicitly setting Smalltalk to be the environment instead of Smalltalk
environment.
Levente
On Sat, 14 Oct 2017, H. Hirzel wrote:
> Hello
>
> after loading a Etoys project into a most recent trunk image
> incrementing a tile value actually generates an updated script which
> is to be compiled.
>
> Recompiling the script causes an error in
>
> ScriptEncoder>>associationForClass
>
> | assoc |
> assoc := self environment associationAt: cue getClass name ifAbsent: [nil].
> ^assoc value == cue getClass
> ifTrue: [assoc]
> ifFalse: [Association new value: cue getClass]
>
>
> Replacing
>
> assoc := self environment associationAt: cue getClass name ifAbsent: [nil].
>
> with
>
> assoc := self environment globals associationAt: cue getClass
> name ifAbsent: [nil].
>
>
> Made the script to work but errors later on came up at the same place
> for other reasons. In particular it was not possible to commit the
> changed 'Compiler' package to the inbox.
>
> Do you have any suggestions how to deal with this problem?
>
> Kind regards
> Hannes
>
>
> ----------------------------------------------------
> The use case in details
> ----------------------------------------------------
>
> I drop an Etoys project into a fully updated trunk image.
>
>
> If I click an arrow the following message is sent to aTileMorph
>
> TileMorph>>arrowAction:
>
> If it is a number a new value is set, for example
>
>
> aTileMorph literal: 9
>
>
> TileMorph>>literal
>
> is
>
> TileMorph>>literal: anObject
>
> literal := anObject.
> self updateLiteralLabel.
> self acceptNewLiteral. "Show that we are out of date,
> install is needed"
>
> #acceptNewLiteral looks for the topScript, i.e. the top morph
> containing the tiles
>
>
> then it calls
>
> topScript installWithNewLiteral
>
>
> The topScript is a "ScriptEditor for #script1 player: Car"
>
>
> ScriptEditorMorph>>installWithNewLiteral
>
> self removeSpaces.
> scriptName ifNotNil:
> [playerScripted ifNotNil:
> [playerScripted acceptScript: self topEditor
> for: scriptName]]
>
>
> playerScripted is aPlayer (Model subclass: #Player)
>
> In
> playerScripted acceptScript: self topEditor for: scriptName
>
> the playerScripted gets a node (class MethodNode) from aScriptEditorMorph
>
> The node is told to #generate: the method for aCompiledMethodTrailer
> which has the data
>
>
> 'script1
> (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
> 0.936 b: 0.936))
> ifFalse: [self turn: 160 + 40 random].
> self forward: 9.
> self turn: 1.
> self bounce: ''silence'''
>
> The node in turn asks aScriptEncoder
>
>
> generateMethodOfClass: aCompiledMethodClass trailer: trailer
> from: methodNode
>
>
> aScriptEncoder asks
>
> self allLiterals
>
> and within that
>
>
> self associationForClass
>
>
>
> ScriptEncoder>>associationForClass
> | assoc |
> assoc := self environment associationAt: cue getClass name ifAbsent: [nil].
> ^assoc value == cue getClass
> ifTrue: [assoc]
> ifFalse: [Association new value: cue getClass]
>
>
> This is the place where the code breaks
>
> cue getClass
>
> is
> Player140132117123
>
>
> self environment
>
> is
> SmalltalkImage
>
>
> First a change from
>
>
> assoc := self environment associationAt: cue getClass name
> ifAbsent: [nil].
>
> to
>
> assoc := self environment globals associationAt: cue getClass
> name ifAbsent: [nil].
>
> worked after adding in addition
>
>
> I could increment and decrement values in a tile.
>
>
> However it was not possible to commit the changes to the inbox. An
> error message appeared at the same place.
More information about the Squeak-dev
mailing list
|