On 16 Oct 2014, at 17:26, Marcus Denker <marcus.denker@inria.fr> wrote:
On 16 Oct 2014, at 16:43, Marcus Denker <marcus.denker@inria.fr <mailto:marcus.denker@inria.fr>> wrote:
1. sometimes the debugger can not inspect a single tempvar (list of all temps is working) 2. number of temp vars (in method header) is wrong:
| a b c | a := 1. b := 2. c := 3. [[a asString] on: Error do: [:ex | a value: a value: b value: c]. c < 0] whileTrue.
method header numtemps 1
| a b c | a := 1. b := 2. c := 3. c < 0 ifTrue: [ [ a asString ] on: Error do: [ :ex | a value: a value: b value: c ]. c < 0 ]. ^ a
method header numtemps 3
both methods define a block with a nested block. In the first method it is the receiver of #whileTrue: the second method it is the argument to #ifTrue: I think both blocks are optimized, but somehow the block receiving the whileTrue: message makes the computation for the number of tempvars wronng
What is happening is that the variables are wrongly put in a temp vector... in the case of loops.
the one temp is this vector.
this should be fixed.
I think the problem is that what we did is to mark a variables as escaping when it as *read* in an optimised block.
But what we should do is to mark only all *writes* to a variable that happens in a loop as escaping vars even in the case when they happen in the same scope.
this means the read is simpler:
visitVariableNode: aVariableNode | var | var := (self lookupVariableForRead: aVariableNode) ifNil: [(self undeclaredVariable: aVariableNode)]. aVariableNode binding: var. var isUninitialized ifTrue: [self uninitializedVariable: aVariableNode].
While in the write we need to mark:
lookupVariableForWrite: aVariableNode
| var |
var := scope lookupVar: aVariableNode name.
var ifNil: [^var]. var isSpecialVariable ifTrue: [ self storeIntoSpecialVariable: aVariableNode ]. var isWritable ifFalse: [ self storeIntoReadOnlyVariable: aVariableNode ].
var isTemp ifTrue: [ "when in a loop, all writes escape" scope outerScope isInsideOptimizedLoop ifTrue: [ var markEscapingWrite ]. "else only escaping when they will end up in different closures" (var scope outerNotOptimizedScope ~= scope outerNotOptimizedScope) ifTrue: [ var markEscapingWrite]]. ^var
I checked that all Opal tests that are failing are actually testing wrong, and I double checked that all those methods are now compiled like with the old old compiler⦠Now recompilng the image.
Hmm⦠nopeâ¦. something wrong. Marcus