On Jun 16, 2015, at 8:36 PM, David Holmes <david.hol...@oracle.com> wrote: > > On 17/06/2015 8:39 AM, John Rose wrote: >> What I'm suggesting is that a BC generator might emit a zero length name for >> a non-anon class, leading to confusion when C.isAnon is called. > > Is a zero-length "name" for a non-anonymous class valid?
For better or worse, the JVMS does not require anything more than that the inner class name be a valid CONSTANT_Utf8. (N.B. This is *not* the real bytecode name of the inner class. It is a simple name, as stored in the InnerClasses table.) In hindsight, we could have added a check to say that it has to be a valid identifier (ClassFileParser::verify_unqualified_name). > getSimpleName() is specified to return "" for anonymous classes. Seems broken > to allow "" for non-anonymous. I agree that it's broken to *do* this, but we need to allow it (however broken) if the JVMS allows it. Unless we amend the JVMS. — John > David > >> – John >> >>> On Jun 16, 2015, at 5:09 AM, Vladimir Ivanov <vladimir.x.iva...@oracle.com> >>> wrote: >>> >>> John, >>> >>>> >>>> That might be an issue here. Just as (String)null and (String)"" are >>>> distinct values in Java, in the class file a CP ref of zero differs from a >>>> CP ref to a CONSTANT_Utf8 of the empty string "". But the method >>>> Class.isAnonymousClass does not make a distinction between those two >>>> cases, which might sometimes lead to confusion. I would view this as a >>>> bug in Class.isAnonymousClass. >>> For non-top level classes, Class.getSimpleName calls >>> Class.getSimpleBinaryName which converts null to empty string, assuming >>> it's an anonymous class. So, callers should not see null values. >>> >>> Best regards, >>> Vladimir Ivanov