Code review for jigsaw/jake -> jdk9/dev sync up
Alan Bateman
Alan.Bateman at oracle.com
Tue Nov 29 08:02:38 UTC 2016
Thanks for going through the changes, a few comment/replies below.
On 28/11/2016 22:22, Paul Sandoz wrote:
> :
>
>
> What happens if you pass a primitive array?
>
> I think you need to specify what happens if an array class is passed and how the target class is obtained, and an IAE if the "element type" of the array is a primitive class.
Yeah, it's something that I've been looking at too, mostly trying to
decide whether to reject all array types for now. It is possible to
specify an array class to Lookup::in but there are issues, it triggers
at least one one assert that needs attention.
>
> (Separately i am looking forward to using this method to replace some Unsafe usages between Thread and other classes within the base module.)
>
>
> ModuleDescriptor
> —
>
> 241 private <T> Stream<String> toStringStream(Set<T> s) {
> 242 return s.stream().map(e -> e.toString().toLowerCase());
> 243 }
> 244
> 245 private <M> String toString(Set<M> mods, String what) {
> 246 return (Stream.concat(toStringStream(mods), Stream.of(what)))
> 247 .collect(Collectors.joining(" "));
> 248 }
>
> The above occurs three times. Suggest moving to the enclosing class as package private static methods.
Thanks, this is clean-up that wasn't done after going through several
iterations.
> : }
>
> Replace with
>
> ResolvedModule rm = findInParent(dm);
> if (rm != null)
> other = rm.reference();
>
>
> 532 Set<ResolvedModule> requiresTransitive= new HashSet<>();
>
> Formating glitch for “=“
Thanks.
>
>
> ServiceLoader
> —
>
> 1331 @Override
> 1332 @SuppressWarnings("unchecked")
> 1333 public boolean tryAdvance(Consumer<? super Provider<T>> action) {
> 1334 if (ServiceLoader.this.reloadCount != expectedReloadCount)
> 1335 throw new ConcurrentModificationException();
> 1336 Provider<T> next = null;
> 1337 if (index < loadedProviders.size()) {
> 1338 next = (Provider<T>) loadedProviders.get(index);
> 1339 } else if (iterator.hasNext()) {
> 1340 next = iterator.next();
> 1341 } else {
> 1342 loadedAllProviders = true;
> 1343 }
> 1344 index++;
>
> Move the index increment into the top if block, thereby it only gets increment appropriately (no crazy overflow possible).
I agree, this could cause a problem in some extreme scenario.
>
>
> 1353 @Override
> 1354 public int characteristics() {
> 1355 // need to decide on DISTINCT
> 1356 // not IMMUTABLE as structural interference possible
> 1357 return Spliterator.ORDERED + Spliterator.NONNULL;
> 1358 }
>
> Should probably be consistent (subset of) with the characteristics reported for loadedProviders.stream(), thus DISTINCT would not be appropriate in this case unless you changed the optimal case of when all providers are loaded.
When all loaded then the characteristics come from ArrayList's
spliterator and so will be ORDERED|SIZED|SUBSIZED. For consistency then
we limit the above to ORDERED. I've been tempted to do more here but I
think we need to get some real world usage of this method to see if
anything is needed (esp. when the #providers is usually small).
> :
>
>
> 1552 public Optional<S> findFirst() {
> 1553 Iterator<S> iterator = iterator();
> 1554 if (iterator.hasNext()) {
> 1555 return Optional.of(iterator.next());
> 1556 } else {
> 1557 return Optional.empty();
> 1558 }
> 1559 }
>
> return stream().findFirst() ?
>
The stream elements are Provider<S> rather than S so it could be
stream().findFirst().map(Provider::get). The reason it was based on
iterator is because it pre-dates stream but looking at it now then maybe
findFirst() should go away as it's trivial to do with the new stream method.
-Alan
More information about the jigsaw-dev
mailing list