- changed status to resolved
NTA proxy object aliasing in concurrent mode
Issue #290
resolved
Proxy objects that are created to enable inherited attribute evaluation for parameterized NTAs can become aliased between separate nodes after cloning a node. This can cause incorrect inherited attribute values for NTAs.
The cause of this error is that the AtomicReference
object containing the proxy reference is not reset when creating a fresh node.
A test case demonstrating this error:
aspect Test { syn nta B A.b(String id) = new B(id); inh String B.outer(); eq A.b().outer() = getID(); }
// Test that NTA proxy objects are not aliased between fresh nodes. // .grammar: { A ::= <ID>; B ::= <ID>; } // .options: concurrent=true import static runtime.Test.*; import java.util.ArrayList; public class Test { public static void main(String args[]) { A a = new A("oh hi"); // Proxy object is not aliased after copying (1). A a2 = a.treeCopyNoTransform(); a2.setID("bye"); // Proxy object is not aliased after copying (2). A a3 = a.treeCopyNoTransform(); a3.setID("x"); testEqual("oh hi", a.b("one").outer()); testEqual("bye", a2.b("one").outer()); testEqual("x", a3.b("one").outer()); testEqual("x", a3.b("two").outer()); testEqual("bye", a2.b("two").outer()); testEqual("oh hi", a.b("two").outer()); // Proxy object is reset after makeFreshNode. a.makeFreshNode(); a.setID("nope"); testEqual("nope", a.b("one").outer()); testEqual("nope", a.b("three").outer()); } }
Comments (1)
-
reporter - Log in to comment
Fix NTA proxy object aliasing in concurrent mode
This ensures that NTA proxy objects are fully reset when creating a fresh node.
Also fixed a compile error caused by using the wrong name for a proxy object (_list instead of _proxy).
fixes
#290(bitbucket)→ <<cset 53c693bd2980>>