Innermost binds terms outside of its scope.

A sample application is probably more explanatory:

main =
  testVar := EntityNoSuper(None(), [Property("x", None(), None(), None())])
; where(innermost(test-strategy))
; debug(!"Result: ")
; <debug(!"Result2: ")> testVar
test-strategy: Property(a,b,c,d) -> Prop(a,b,c,d,None())

Results in

Result: EntityNoSuper(None,[Prop("x",None,None,None,None)])
Result2: EntityNoSuper(None,[Prop("x",None,None,None,None)])

This happens only in the interpreter, the compiled (java) version works fine.

Submitted by Nathan Bruning on 8 April 2010 at 20:42

On 8 April 2010 at 23:52 Nathan Bruning commented:

I guess the problem boils down to org.spoofax.interpreter.stratego.All, which performs an in-place update on line 74.

Note that this bug also effectively nullifies the usage of origin-track-forced.

On 9 April 2010 at 09:09 Lennart Kats commented:

You’re right, the problem does seem to be in However, it doesn’t change lists in place it in place: it first creates an array copy of them, and changes the array in place. For StrategoAppls, however, the implementation assumes that getAllSubterms() creates a defensive copy of the term arguments. This is no longer the case with the new StrategoTerm library. I changed the implementation of accordingly.

(For performance, it would be better to use the strategy of to implement ‘all’ in the future, which doesn’t rely so much on copying terms.)

Fixed in r20756.

Log in to post comments