====== New things! ======
shared library (potential exhibit) + "wide" quantification (dynamic-analysis-like)
xpi Jps {
joinpointtype Object Creations(Class c);
// pointcut library of "meaningful pointcuts for the JPT"
pointcut creations(Class c) : call(* *.new(..)) && target(c);
// other alternative
joinpointtype Object Creations(Class c) defaults: call(* *.new(..)) && target(c);
}
module Collections {
contains java.util.*;
potentially-exhibits Object Jps.Creations(Class c) : creations(c);
//alternative using the default
potentially-exhibits Jps.Creations;
}
module M1 {
contains C;
}
class C {
void foo() {
m = new HashMap();
m.add(x); // creates objects within Collections
...
}
}
module M2 {
contains C;
exhibits Object Jps.Creations(Class c) : creations(c);
//alternative using the default
exhibits Jps.Creations;
}
module Aspect {
contains Asp;
}
aspect Asp {
around Object Jps.Creations(Class c) {
if (shouldBeCached(c)) ...pool...
else return proceed(c);
}
}
RESULT:
Asp does not see HashEntry creations caused by C@M1.
Asp sees HashEntry creations caused by C@M2, as well as the HashMap creation in C.
symmetric case, beyond levels (topological scoping a la membranes)
module Prof {
contains prof.*;
advises Base, Racer;
}
module Base {
contains ...;
exhibits Jps.Creations(..) : ...
exhibits Jps.FieldAccesses(..) : ...
}
module Racer {
contains racer.*;
advises Base;
exhibits Jps.Creations(..) : ...
}
RESULT: Prof sees creations in both base and racer (not feasible with levels without reintroducing loops)
now with transitive topological usage
module Prof {
advises M1;
}
module M1 {
contains D (that calls objects in M3)
exhibits X;
uses M3;
}
module M2 {
contains C (that calls objects in M3)
}
module M3 {
exhibits X;
}
RESULT:
Usage of M2 does not trigger X jps visible by Prof.
Instances of X in M3 are generated and seen by Prof only in the cflow of M1.
(removing "uses M3" in M1 would avoid this)