T (Key<T> a, Owner owner, Param p) { T value = owner.getUserData(a); if (value == null) { RecursionGuard.StackStamp stamp = RecursionManager.markStack(); value = compute(owner, p); if (stamp.mayCacheNow()) { value = ((UserDataHolderEx)owner).putUserDataIfAbsent(a, value); } } return value; }