[squeak-dev] [Environments] ScriptEncoder>>associationForClass problem // globals

H. Hirzel hannes.hirzel at gmail.com
Sat Oct 14 17:11:10 UTC 2017


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