[committed] allow assert in inner class

Eric Blake ebb9@byu.net
Thu Feb 26 14:17:00 GMT 2004


Actually, for inner classes, they should be checking the assertion level of 
the enclosing class. There is a whole series of tests for correct semantics 
in jacks. And does your patch work for asserts inside an inner class of an 
interface, since interfaces can't have a static helper?
Also, 1.5 compliant VMs support the ldc bytecode with a CONSTANT_Class 
argument, alleviating the need for emitting the class$ helper method (although 
you still need this code to allow targeting older VMs). The 1.5 VM also 
expands the range of legal .classfile descriptors to include 
non-Java-characters, so that the compiler now has a reserved namespace (hence, 
javac now emits Foo+1.class instead of Foo1ドル.class, among others). Other VM 
additions include lots of new attributes: EnclosingMethod, AnnotationDefault, 
RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations, 
RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations. 
There are also new access flags (such as ACC_ATTRIBUTE, 0x2000).
Per Bothner wrote:
> If you use assert, the compiler generates some code
> that includes doing THIS_CLASS.class, which in turn
> is implemented by a static helper method named class$.
> If THIS_CLASS was an inner class, the compiler would
> lose because static methods aren't allowed in inner classes.
> The solution (which matches JDK) is to move the class$
> helper method to the outer class.
>> Tested on Fedora and checked into mainline.
>>> ------------------------------------------------------------------------
>> 2004年02月25日 Per Bothner <per@bothner.com>
>> 	* parse.y (build_assertion): If we're in an inner class, create the
> 	class$ helper routine in the outer class.
>> Index: parse.y
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/java/parse.y,v
> retrieving revision 1.469
> diff -u -p -r1.469 parse.y
> --- parse.y	19 Feb 2004 22:39:55 -0000	1.469
> +++ parse.y	26 Feb 2004 05:27:18 -0000
> @@ -15301,6 +15301,10 @@ build_assertion (int location, tree cond
> {
> tree field, classdollar, id, call;
> tree class_type = TREE_TYPE (klass);
> + tree outer_class = klass;
> + while (INNER_CLASS_DECL_P (outer_class))
> +	outer_class = DECL_CONTEXT (outer_class);
> + outer_class = TREE_TYPE (outer_class);
>> field = add_field (class_type,
> 			 get_identifier ("$assertionsDisabled"),
> @@ -15309,9 +15313,10 @@ build_assertion (int location, tree cond
> MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
> FIELD_SYNTHETIC (field) = 1;
>> - if (!TYPE_DOT_CLASS (class_type))
> -	build_dot_class_method (class_type);
> - classdollar = build_dot_class_method_invocation (class_type, class_type);
> + if (!TYPE_DOT_CLASS (outer_class))
> +	build_dot_class_method (outer_class);
> + classdollar
> +	= build_dot_class_method_invocation (outer_class, class_type);
>> /* Call CLASS.desiredAssertionStatus(). */
> id = build_wfl_node (get_identifier ("desiredAssertionStatus"));

-- 
Someday, I might put a cute statement here.
Eric Blake ebb9@byu.net


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /