Review Request: 7193406 - Clean-up JDK Build Warnings in java.util, java.io
Stuart Marks
stuart.marks at oracle.com
Wed Aug 29 23:20:03 UTC 2012
On 8/29/12 4:36 AM, Ulf Zibis wrote:
>>> 436 switch (actions) {
>>> 437 case SecurityConstants.FILE_READ_ACTION:
>>> 438 return READ;
>
> Oops, you have reverted the change to use switch-on-Strings by webrev.03. Why?
A fair question. I had instigated some internal conversation about reverting
this change, so here's the explanation. (Good catch, by the way.)
The original code was like this:
427 private static int getMask(String actions) {
...
435 // Check against use of constants (used heavily within the JDK)
436 if (actions == SecurityConstants.FILE_READ_ACTION) {
437 return READ;
438 } else if (actions == SecurityConstants.FILE_WRITE_ACTION) {
The various SecurityConstants being used here are Strings.
Note that this is doing String comparisons using == which is usually a bug. But
this code is relying on String interning to provide object identity for equal
string literals, in order to provide a fast path optimization for these common
cases. Changing this code to use switch-over-strings would be semantically
equivalent, but it would probably slow things down, since switch provides
equals() semantics instead of == semantics.
The permissions code is quite performance-sensitive, so I've asked Dan to
revert this change.
>> @SuppressWarnings("fallthrough") is put to suppress warnings generated by
>> another switch/case statements
> Can't you move it from method scope to there?
>
>> while (i >= matchlen && !seencomma) {
>> switch(a[i-matchlen]) {
>> case ',':
>> seencomma = true;
>> /*FALLTHROUGH*/
>> case ' ': case '\r': case '\n':
>> case '\f': case '\t':
>> break;
>> default:
>> throw new IllegalArgumentException(
>> "invalid permission: " + actions);
>> }
>> i--;
>> }
Unfortunately there is no suitable place to put the annotation. Annotations can
only be placed on declarations, and the narrowest enclosing declaration around
this switch statement is, unfortunately, the entire method. One might consider
refactoring the switch statement into its own method, but that kind of
refactoring is too large a change for warnings cleanup.
s'marks
More information about the core-libs-dev
mailing list