1 // defineclass.cc - defining a class from .class format.
3 /* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
12 Author: Kresten Krab Thorup <krab@gnu.org>
14 Written using the online versions of Java Language Specification (1st
15 ed.) and The Java Virtual Machine Specification (2nd ed.).
17 Future work may include reading (and handling) attributes which are
18 currently being ignored ("InnerClasses", "LineNumber", etc...).
23 #include <java-interp.h>
26 #include <java-cpool.h>
29 #include <java/lang/Class.h>
30 #include <java/lang/Float.h>
31 #include <java/lang/Double.h>
32 #include <java/lang/Character.h>
33 #include <java/lang/LinkageError.h>
34 #include <java/lang/InternalError.h>
35 #include <java/lang/ClassFormatError.h>
36 #include <java/lang/NoClassDefFoundError.h>
37 #include <java/lang/ClassCircularityError.h>
38 #include <java/lang/ClassNotFoundException.h>
39 #include <java/lang/IncompatibleClassChangeError.h>
40 #include <java/lang/reflect/Modifier.h>
46 // these go in some separate functions, to avoid having _Jv_InitClass
47 // inserted all over the place.
48 static void throw_internal_error (char *msg
)
49 __attribute__ ((__noreturn__
));
50 static void throw_no_class_def_found_error (jstring msg
)
51 __attribute__ ((__noreturn__
));
52 static void throw_no_class_def_found_error (char *msg
)
53 __attribute__ ((__noreturn__
));
54 static void throw_class_format_error (jstring msg
)
55 __attribute__ ((__noreturn__
));
56 static void throw_incompatible_class_change_error (jstring msg
)
57 __attribute__ ((__noreturn__
));
58 static void throw_class_circularity_error (jstring msg
)
59 __attribute__ ((__noreturn__
));
62 * We define class reading using a class. It is practical, since then
63 * the entire class-reader can be a friend of class Class (it needs to
64 * write all it's different structures); but also because this makes it
65 * easy to make class definition reentrant, and thus two threads can be
66 * defining classes at the same time. This class (_Jv_ClassReader) is
67 * never exposed outside this file, so we don't have to worry about
68 * public or private members here.
71 struct _Jv_ClassReader
{
73 // do verification? Currently, there is no option to disable this.
74 // This flag just controls the verificaiton done by the class loader;
75 // i.e., checking the integrity of the constant pool; and it is
76 // allways on. You always want this as far as I can see, but it also
77 // controls weither identifiers and type descriptors/signatures are
78 // verified as legal. This could be somewhat more expensive since it
79 // will call Characher.isJavaIdentifier{Start,Part} for each character
80 // in any identifier (field name or method name) it comes by. Thus,
81 // it might be useful to turn off this verification for classes that
82 // come from a trusted source. However, for GCJ, trusted classes are
83 // most likely to be linked in.
91 // current input position
94 // the constant pool data
97 unsigned int *offsets
;
99 // the class to define (see java-interp.h)
100 _Jv_InterpClass
*def
;
102 /* check that the given number of input bytes are available */
103 inline void check (int num
)
106 throw_class_format_error ("Premature end of data");
109 /* skip a given number of bytes in input */
110 inline void skip (int num
)
116 /* read an unsignend 1-byte unit */
117 inline static jint
get1u (unsigned char* bytes
)
122 /* read an unsigned 1-byte unit */
123 inline jint
read1u ()
126 return get1u (bytes
+pos
-1);
129 /* read an unsigned 2-byte unit */
130 inline static jint
get2u (unsigned char *bytes
)
132 return (((jint
)bytes
[0]) << 8) | ((jint
)bytes
[1]);
135 /* read an unsigned 2-byte unit */
136 inline jint
read2u ()
139 return get2u (bytes
+pos
-2);
142 /* read a 4-byte unit */
143 static jint
get4 (unsigned char *bytes
)
145 return (((jint
)bytes
[0]) << 24)
146 | (((jint
)bytes
[1]) << 16)
147 | (((jint
)bytes
[2]) << 8)
148 | (((jint
)bytes
[3]) << 0);
151 /* read a 4-byte unit, (we don't do that quite so often) */
155 return get4 (bytes
+pos
-4);
158 /* read a 8-byte unit */
159 static jlong
get8 (unsigned char* bytes
)
161 return (((jlong
)bytes
[0]) << 56)
162 | (((jlong
)bytes
[1]) << 48)
163 | (((jlong
)bytes
[2]) << 40)
164 | (((jlong
)bytes
[3]) << 32)
165 | (((jlong
)bytes
[4]) << 24)
166 | (((jlong
)bytes
[5]) << 16)
167 | (((jlong
)bytes
[6]) << 8)
168 | (((jlong
)bytes
[7]) << 0);
171 /* read a 8-byte unit */
172 inline jlong
read8 ()
175 return get8 (bytes
+pos
-8);
178 inline void check_tag (int index
, char expected_tag
)
181 || index
> pool_count
182 || tags
[index
] != expected_tag
)
183 throw_class_format_error ("erroneous constant pool tag");
186 inline void verify_identifier (_Jv_Utf8Const
* name
)
188 if (! _Jv_VerifyIdentifier (name
))
189 throw_class_format_error ("erroneous identifier");
192 inline void verify_classname (unsigned char* ptr
, _Jv_ushort length
)
194 if (! _Jv_VerifyClassName (ptr
, length
))
195 throw_class_format_error ("erroneous class name");
198 inline void verify_classname (_Jv_Utf8Const
*name
)
200 if (! _Jv_VerifyClassName (name
))
201 throw_class_format_error ("erroneous class name");
204 inline void verify_field_signature (_Jv_Utf8Const
*sig
)
206 if (! _Jv_VerifyFieldSignature (sig
))
207 throw_class_format_error ("erroneous type descriptor");
210 inline void verify_method_signature (_Jv_Utf8Const
*sig
)
212 if (! _Jv_VerifyMethodSignature (sig
))
213 throw_class_format_error ("erroneous type descriptor");
216 _Jv_ClassReader (jclass klass
, jbyteArray data
, jint offset
, jint length
)
218 if (klass
== 0 || length
< 0 || offset
+length
> data
->length
)
219 throw_internal_error ("arguments to _Jv_DefineClass");
222 bytes
= (unsigned char*) (elements (data
)+offset
);
225 def
= (_Jv_InterpClass
*) klass
;
228 /** and here goes the parser members defined out-of-line */
230 void read_constpool ();
231 void prepare_pool_entry (int index
, unsigned char tag
);
233 void read_methods ();
234 void read_one_class_attribute ();
235 void read_one_method_attribute (int method
);
236 void read_one_code_attribute (int method
);
237 void read_one_field_attribute (int field
);
238 void throw_class_format_error (char *msg
);
240 /** check an utf8 entry, without creating a Utf8Const object */
241 bool is_attribute_name (int index
, char *name
);
243 /** here goes the class-loader members defined out-of-line */
244 void handleConstantPool ();
245 void handleClassBegin (int, int, int);
246 void handleInterfacesBegin (int);
247 void handleInterface (int, int);
248 void handleFieldsBegin (int);
249 void handleField (int, int, int, int);
250 void handleFieldsEnd ();
251 void handleConstantValueAttribute (int,int);
252 void handleMethodsBegin (int);
253 void handleMethod (int, int, int, int);
254 void handleMethodsEnd ();
255 void handleCodeAttribute (int, int, int, int, int, int);
256 void handleExceptionTableEntry (int, int, int, int, int, int);
258 void checkExtends (jclass sub
, jclass super
);
259 void checkImplements (jclass sub
, jclass super
);
262 * FIXME: we should keep a hash table of utf8-strings, since many will
263 * be the same. It's a little tricky, however, because the hash table
264 * needs to interact gracefully with the garbage collector. Much
265 * memory is to be saved by this, however! perhaps the improvement
266 * could be implemented in prims.cc (_Jv_makeUtf8Const), since it
267 * computes the hash value anyway.
272 _Jv_DefineClass (jclass klass
, jbyteArray data
, jint offset
, jint length
)
274 _Jv_ClassReader
reader (klass
, data
, offset
, length
);
281 /** This section defines the parsing/scanning of the class data */
284 _Jv_ClassReader::parse ()
286 int magic
= read4 ();
288 /* FIXME: Decide which range of version numbers to allow */
290 /* int minor_version = */ read2u ();
291 /* int major_verson = */ read2u ();
293 if (magic
!= (int) 0xCAFEBABE)
294 throw_class_format_error ("bad magic number");
296 pool_count
= read2u ();
300 int access_flags
= read2u ();
301 int this_class
= read2u ();
302 int super_class
= read2u ();
304 check_tag (this_class
, JV_CONSTANT_Class
);
305 if (super_class
!= 0)
306 check_tag (super_class
, JV_CONSTANT_Class
);
308 handleClassBegin (access_flags
, this_class
, super_class
);
310 int interfaces_count
= read2u ();
312 handleInterfacesBegin (interfaces_count
);
314 for (int i
= 0; i
< interfaces_count
; i
++)
316 int iface
= read2u ();
317 check_tag (iface
, JV_CONSTANT_Class
);
318 handleInterface (i
, iface
);
324 int attributes_count
= read2u ();
326 for (int i
= 0; i
< attributes_count
; i
++)
328 read_one_class_attribute ();
332 throw_class_format_error ("unused data before end of file");
334 // tell everyone we're done.
335 def
->state
= JV_STATE_LOADED
;
340 void _Jv_ClassReader::read_constpool ()
342 tags
= (unsigned char*) _Jv_AllocBytes (pool_count
);
343 offsets
= (unsigned int *) _Jv_AllocBytes (sizeof (int)
346 /** first, we scan the constant pool, collecting tags and offsets */
347 tags
[0] = JV_CONSTANT_Undefined
;
349 for (int c
= 1; c
< pool_count
; c
++)
356 case JV_CONSTANT_String
:
357 case JV_CONSTANT_Class
:
361 case JV_CONSTANT_Fieldref
:
362 case JV_CONSTANT_Methodref
:
363 case JV_CONSTANT_InterfaceMethodref
:
364 case JV_CONSTANT_NameAndType
:
365 case JV_CONSTANT_Integer
:
366 case JV_CONSTANT_Float
:
370 case JV_CONSTANT_Double
:
371 case JV_CONSTANT_Long
:
373 tags
[++c
] = JV_CONSTANT_Undefined
;
376 case JV_CONSTANT_Utf8
:
383 case JV_CONSTANT_Unicode
:
384 throw_class_format_error ("unicode not supported");
388 throw_class_format_error ("erroneous constant pool tag");
392 handleConstantPool ();
396 void _Jv_ClassReader::read_fields ()
398 int fields_count
= read2u ();
399 handleFieldsBegin (fields_count
);
401 for (int i
= 0; i
< fields_count
; i
++)
403 int access_flags
= read2u ();
404 int name_index
= read2u ();
405 int descriptor_index
= read2u ();
406 int attributes_count
= read2u ();
408 check_tag (name_index
, JV_CONSTANT_Utf8
);
409 prepare_pool_entry (name_index
, JV_CONSTANT_Utf8
);
411 check_tag (descriptor_index
, JV_CONSTANT_Utf8
);
412 prepare_pool_entry (descriptor_index
, JV_CONSTANT_Utf8
);
414 handleField (i
, access_flags
, name_index
, descriptor_index
);
416 for (int j
= 0; j
< attributes_count
; j
++)
418 read_one_field_attribute (i
);
426 _Jv_ClassReader::is_attribute_name (int index
, char *name
)
428 check_tag (index
, JV_CONSTANT_Utf8
);
429 int len
= get2u (bytes
+offsets
[index
]);
430 if (len
!= (int) strlen (name
))
433 return !memcmp (bytes
+offsets
[index
]+2, name
, len
);
436 void _Jv_ClassReader::read_one_field_attribute (int field_index
)
438 int name
= read2u ();
439 int length
= read4 ();
441 if (is_attribute_name (name
, "ConstantValue"))
447 && (tags
[cv
] == JV_CONSTANT_Integer
448 || tags
[cv
] == JV_CONSTANT_Float
449 || tags
[cv
] == JV_CONSTANT_Long
450 || tags
[cv
] == JV_CONSTANT_Double
451 || tags
[cv
] == JV_CONSTANT_String
))
453 handleConstantValueAttribute (field_index
, cv
);
457 throw_class_format_error ("erroneous ConstantValue attribute");
461 throw_class_format_error ("erroneous ConstantValue attribute");
470 void _Jv_ClassReader::read_methods ()
472 int methods_count
= read2u ();
474 handleMethodsBegin (methods_count
);
476 for (int i
= 0; i
< methods_count
; i
++)
478 int access_flags
= read2u ();
479 int name_index
= read2u ();
480 int descriptor_index
= read2u ();
481 int attributes_count
= read2u ();
483 check_tag (name_index
, JV_CONSTANT_Utf8
);
484 prepare_pool_entry (descriptor_index
, JV_CONSTANT_Utf8
);
486 check_tag (name_index
, JV_CONSTANT_Utf8
);
487 prepare_pool_entry (descriptor_index
, JV_CONSTANT_Utf8
);
489 handleMethod (i
, access_flags
, name_index
,
492 for (int j
= 0; j
< attributes_count
; j
++)
494 read_one_method_attribute (i
);
501 void _Jv_ClassReader::read_one_method_attribute (int method_index
)
503 int name
= read2u ();
504 int length
= read4 ();
506 if (is_attribute_name (name
, "Exceptions"))
508 _Jv_Method
*method
= reinterpret_cast<_Jv_Method
*>
509 (&def
->methods
[method_index
]);
510 if (method
->throws
!= NULL
)
511 throw_class_format_error ("only one Exceptions attribute allowed per method");
513 int num_exceptions
= read2u ();
514 // We use malloc here because the GC won't scan the method
515 // objects. FIXME this means a memory leak if we GC a class.
516 // (Currently we never do.)
517 _Jv_Utf8Const
**exceptions
=
518 (_Jv_Utf8Const
**) _Jv_Malloc ((num_exceptions
+ 1) * sizeof (_Jv_Utf8Const
*));
521 _Jv_word
*pool_data
= def
->constants
.data
;
522 for (int i
= 0; i
< num_exceptions
; ++i
)
527 // JLS 2nd Ed. 4.7.5 requires that the tag not be 0.
530 check_tag (ndx
, JV_CONSTANT_Class
);
531 exceptions
[out
++] = pool_data
[ndx
].utf8
;
534 catch (java::lang::Throwable
*exc
)
536 _Jv_Free (exceptions
);
540 exceptions
[out
] = NULL
;
541 method
->throws
= exceptions
;
544 else if (is_attribute_name (name
, "Code"))
547 int max_stack
= read2u ();
548 int max_locals
= read2u ();
549 int code_length
= read4 ();
551 int code_start
= pos
;
553 int exception_table_length
= read2u ();
555 handleCodeAttribute (method_index
,
556 max_stack
, max_locals
,
557 code_start
, code_length
,
558 exception_table_length
);
561 for (int i
= 0; i
< exception_table_length
; i
++)
563 int start_pc
= read2u ();
564 int end_pc
= read2u ();
565 int handler_pc
= read2u ();
566 int catch_type
= read2u ();
568 if (start_pc
> end_pc
570 // END_PC can be equal to CODE_LENGTH.
571 // See JVM Spec 4.7.4.
572 || end_pc
> code_length
573 || handler_pc
>= code_length
)
574 throw_class_format_error ("erroneous exception handler info");
576 if (! (tags
[catch_type
] == JV_CONSTANT_Class
577 || tags
[catch_type
] == 0))
579 throw_class_format_error ("erroneous exception handler info");
582 handleExceptionTableEntry (method_index
,
591 int attributes_count
= read2u ();
593 for (int i
= 0; i
< attributes_count
; i
++)
595 read_one_code_attribute (method_index
);
598 if ((pos
- start_off
) != length
)
599 throw_class_format_error ("code attribute too short");
604 /* ignore unknown attributes */
609 void _Jv_ClassReader::read_one_code_attribute (int /*method*/)
611 /* ignore for now, ... later we may want to pick up
612 line number information, for debugging purposes;
613 in fact, the whole debugger issue is open! */
615 /* int name = */ read2u ();
616 int length
= read4 ();
621 void _Jv_ClassReader::read_one_class_attribute ()
623 /* we also ignore the class attributes, ...
624 some day we'll add inner-classes support. */
626 /* int name = */ read2u ();
627 int length
= read4 ();
634 /* this section defines the semantic actions of the parser */
636 void _Jv_ClassReader::handleConstantPool ()
638 /** now, we actually define the class' constant pool */
640 // the pool is scanned explicitly by the collector
641 jbyte
*pool_tags
= (jbyte
*) _Jv_AllocBytes (pool_count
);
643 = (_Jv_word
*) _Jv_AllocBytes (pool_count
* sizeof (_Jv_word
));
645 def
->constants
.tags
= pool_tags
;
646 def
->constants
.data
= pool_data
;
647 def
->constants
.size
= pool_count
;
649 // Here we make a pass to collect the strings! We do this, because
650 // internally in the GCJ runtime, classes are encoded with .'s not /'s.
651 // Therefore, we first collect the strings, and then translate the rest
652 // of the utf8-entries (thus not representing strings) from /-notation
654 for (int i
= 1; i
< pool_count
; i
++)
656 if (tags
[i
] == JV_CONSTANT_String
)
658 unsigned char* str_data
= bytes
+ offsets
[i
];
659 int utf_index
= get2u (str_data
);
660 check_tag (utf_index
, JV_CONSTANT_Utf8
);
661 unsigned char *utf_data
= bytes
+ offsets
[utf_index
];
662 int len
= get2u (utf_data
);
663 pool_data
[i
].utf8
= _Jv_makeUtf8Const ((char*)(utf_data
+2), len
);
664 pool_tags
[i
] = JV_CONSTANT_String
;
668 pool_tags
[i
] = JV_CONSTANT_Undefined
;
672 // and now, we scan everything else but strings & utf8-entries. This
673 // leaves out those utf8-entries which are not used; which will be left
674 // with a tag of JV_CONSTANT_Undefined in the class definition.
675 for (int index
= 1; index
< pool_count
; index
++)
679 case JV_CONSTANT_Undefined
:
680 case JV_CONSTANT_String
:
681 case JV_CONSTANT_Utf8
:
685 prepare_pool_entry (index
, tags
[index
]);
691 /* this is a recursive procedure, which will prepare pool entries as needed.
692 Which is how we avoid initializing those entries which go unused. */
694 _Jv_ClassReader::prepare_pool_entry (int index
, unsigned char this_tag
)
696 /* these two, pool_data and pool_tags, point into the class
697 structure we are currently defining */
699 unsigned char *pool_tags
= (unsigned char*) def
->constants
.tags
;
700 _Jv_word
*pool_data
= def
->constants
.data
;
702 /* this entry was already prepared */
703 if (pool_tags
[index
] == this_tag
)
706 /* this_data points to the constant-pool information for the current
707 constant-pool entry */
709 unsigned char *this_data
= bytes
+ offsets
[index
];
713 case JV_CONSTANT_Utf8
:
715 // If we came here, it is because some other tag needs this
716 // utf8-entry for type information! Thus, we translate /'s to .'s in
717 // order to accomondate gcj's internal representation.
719 int len
= get2u (this_data
);
720 char *buffer
= (char*) __builtin_alloca (len
);
721 char *s
= ((char*) this_data
)+2;
723 /* FIXME: avoid using a buffer here */
724 for (int i
= 0; i
< len
; i
++)
729 buffer
[i
] = (char) s
[i
];
732 pool_data
[index
].utf8
= _Jv_makeUtf8Const (buffer
, len
);
733 pool_tags
[index
] = JV_CONSTANT_Utf8
;
737 case JV_CONSTANT_Class
:
739 int utf_index
= get2u (this_data
);
740 check_tag (utf_index
, JV_CONSTANT_Utf8
);
741 prepare_pool_entry (utf_index
, JV_CONSTANT_Utf8
);
744 verify_classname (pool_data
[utf_index
].utf8
);
746 pool_data
[index
].utf8
= pool_data
[utf_index
].utf8
;
747 pool_tags
[index
] = JV_CONSTANT_Class
;
751 case JV_CONSTANT_String
:
752 // already handled before...
755 case JV_CONSTANT_Fieldref
:
756 case JV_CONSTANT_Methodref
:
757 case JV_CONSTANT_InterfaceMethodref
:
759 int class_index
= get2u (this_data
);
760 int nat_index
= get2u (this_data
+2);
762 check_tag (class_index
, JV_CONSTANT_Class
);
763 prepare_pool_entry (class_index
, JV_CONSTANT_Class
);
765 check_tag (nat_index
, JV_CONSTANT_NameAndType
);
766 prepare_pool_entry (nat_index
, JV_CONSTANT_NameAndType
);
768 // here, verify the signature and identifier name
771 _Jv_ushort name_index
, type_index
;
772 _Jv_loadIndexes (&pool_data
[nat_index
],
773 name_index
, type_index
);
775 if (this_tag
== JV_CONSTANT_Fieldref
)
776 _Jv_VerifyFieldSignature (pool_data
[type_index
].utf8
);
778 _Jv_VerifyMethodSignature (pool_data
[type_index
].utf8
);
780 _Jv_Utf8Const
* name
= pool_data
[name_index
].utf8
;
782 if (this_tag
!= JV_CONSTANT_Fieldref
783 && ( _Jv_equalUtf8Consts (name
, clinit_name
)
784 || _Jv_equalUtf8Consts (name
, init_name
)))
787 verify_identifier (pool_data
[name_index
].utf8
);
790 _Jv_storeIndexes (&pool_data
[index
], class_index
, nat_index
);
791 pool_tags
[index
] = this_tag
;
795 case JV_CONSTANT_NameAndType
:
797 _Jv_ushort name_index
= get2u (this_data
);
798 _Jv_ushort type_index
= get2u (this_data
+2);
800 check_tag (name_index
, JV_CONSTANT_Utf8
);
801 prepare_pool_entry (name_index
, JV_CONSTANT_Utf8
);
803 check_tag (type_index
, JV_CONSTANT_Utf8
);
804 prepare_pool_entry (type_index
, JV_CONSTANT_Utf8
);
806 _Jv_storeIndexes (&pool_data
[index
], name_index
, type_index
);
807 pool_tags
[index
] = JV_CONSTANT_NameAndType
;
811 case JV_CONSTANT_Float
:
813 jfloat f
= java::lang::Float::intBitsToFloat ((jint
) get4 (this_data
));
814 _Jv_storeFloat (&pool_data
[index
], f
);
815 pool_tags
[index
] = JV_CONSTANT_Float
;
819 case JV_CONSTANT_Integer
:
821 int i
= get4 (this_data
);
822 _Jv_storeInt (&pool_data
[index
], i
);
823 pool_tags
[index
] = JV_CONSTANT_Integer
;
827 case JV_CONSTANT_Double
:
830 = java::lang::Double::longBitsToDouble ((jlong
) get8 (this_data
));
831 _Jv_storeDouble (&pool_data
[index
], d
);
832 pool_tags
[index
] = JV_CONSTANT_Double
;
836 case JV_CONSTANT_Long
:
838 jlong i
= get8 (this_data
);
839 _Jv_storeLong (&pool_data
[index
], i
);
840 pool_tags
[index
] = JV_CONSTANT_Long
;
845 throw_class_format_error ("erroneous constant pool tag");
851 _Jv_ClassReader::handleClassBegin
852 (int access_flags
, int this_class
, int super_class
)
854 using namespace java::lang::reflect
;
856 unsigned char *pool_tags
= (unsigned char*) def
->constants
.tags
;
857 _Jv_word
*pool_data
= def
->constants
.data
;
859 check_tag (this_class
, JV_CONSTANT_Class
);
860 _Jv_Utf8Const
*loadedName
= pool_data
[this_class
].utf8
;
862 // was ClassLoader.defineClass called with an expected class name?
865 jclass orig
= _Jv_FindClassInCache (loadedName
, def
->loader
);
869 def
->name
= loadedName
;
873 jstring msg
= JvNewStringUTF ("anonymous "
874 "class data denotes "
876 msg
= msg
->concat (orig
->getName ());
878 throw_no_class_def_found_error (msg
);
882 // assert that the loaded class has the expected name, 5.3.5
883 else if (! _Jv_equalUtf8Consts (loadedName
, def
->name
))
885 jstring msg
= JvNewStringUTF ("loaded class ");
886 msg
= msg
->concat (def
->getName ());
887 msg
= msg
->concat (_Jv_NewStringUTF (" was in fact named "));
888 jstring klass_name
= _Jv_NewStringUTF (loadedName
->data
);
889 msg
= msg
->concat (klass_name
);
891 throw_no_class_def_found_error (msg
);
894 def
->accflags
= access_flags
;
895 pool_data
[this_class
].clazz
= def
;
896 pool_tags
[this_class
] = JV_CONSTANT_ResolvedClass
;
898 if (super_class
== 0 && ! (access_flags
& Modifier::INTERFACE
))
900 // FIXME: Consider this carefully!
901 if (! _Jv_equalUtf8Consts (def
->name
, java::lang::Object::class$
.name
))
902 throw_no_class_def_found_error ("loading java.lang.Object");
905 // In the pre-loading state, it can be looked up in the
906 // cache only by this thread! This allows the super-class
907 // to include references to this class.
909 def
->state
= JV_STATE_PRELOADING
;
912 JvSynchronize
sync (&java::lang::Class::class$
);
913 _Jv_RegisterClass (def
);
916 if (super_class
!= 0)
918 // Load the superclass.
919 check_tag (super_class
, JV_CONSTANT_Class
);
920 _Jv_Utf8Const
* super_name
= pool_data
[super_class
].utf8
;
922 // Load the superclass using our defining loader.
923 jclass the_super
= _Jv_FindClass (super_name
,
926 // This will establish that we are allowed to be a subclass,
927 // and check for class circularity error.
928 checkExtends (def
, the_super
);
930 // Note: for an interface we will find Object as the
931 // superclass. We still check it above to ensure class file
932 // validity, but we simply assign `null' to the actual field in
934 def
->superclass
= (((access_flags
& Modifier::INTERFACE
))
936 pool_data
[super_class
].clazz
= the_super
;
937 pool_tags
[super_class
] = JV_CONSTANT_ResolvedClass
;
940 // Now we've come past the circularity problem, we can
941 // now say that we're loading.
943 def
->state
= JV_STATE_LOADING
;
947 ///// implements the checks described in sect. 5.3.5.3
949 _Jv_ClassReader::checkExtends (jclass sub
, jclass super
)
951 using namespace java::lang::reflect
;
953 // having an interface or a final class as a superclass is no good
954 if ((super
->accflags
& (Modifier::INTERFACE
| Modifier::FINAL
)) != 0)
956 throw_incompatible_class_change_error (sub
->getName ());
959 // if the super class is not public, we need to check some more
960 if ((super
->accflags
& Modifier::PUBLIC
) == 0)
962 // With package scope, the classes must have the same
964 if ( sub
->loader
!= super
->loader
965 || !_Jv_ClassNameSamePackage (sub
->name
, super
->name
))
967 throw_incompatible_class_change_error (sub
->getName ());
971 for (; super
!= 0; super
= super
->superclass
)
974 throw_class_circularity_error (sub
->getName ());
980 void _Jv_ClassReader::handleInterfacesBegin (int count
)
982 def
->interfaces
= (jclass
*) _Jv_AllocBytes (count
*sizeof (jclass
));
983 def
->interface_count
= count
;
986 void _Jv_ClassReader::handleInterface (int if_number
, int offset
)
988 _Jv_word
* pool_data
= def
->constants
.data
;
989 unsigned char * pool_tags
= (unsigned char*) def
->constants
.tags
;
991 jclass the_interface
;
993 if (pool_tags
[offset
] == JV_CONSTANT_Class
)
995 _Jv_Utf8Const
* name
= pool_data
[offset
].utf8
;
996 the_interface
= _Jv_FindClass (name
, def
->loader
);
998 else if (pool_tags
[offset
] == JV_CONSTANT_ResolvedClass
)
1000 the_interface
= pool_data
[offset
].clazz
;
1004 throw_no_class_def_found_error ("erroneous constant pool tag");
1007 // checks the validity of the_interface, and that we are in fact
1008 // allowed to implement that interface.
1009 checkImplements (def
, the_interface
);
1011 pool_data
[offset
].clazz
= the_interface
;
1012 pool_tags
[offset
] = JV_CONSTANT_ResolvedClass
;
1014 def
->interfaces
[if_number
] = the_interface
;
1018 _Jv_ClassReader::checkImplements (jclass sub
, jclass super
)
1020 using namespace java::lang::reflect
;
1022 // well, it *must* be an interface
1023 if ((super
->accflags
& Modifier::INTERFACE
) == 0)
1025 throw_incompatible_class_change_error (sub
->getName ());
1028 // if it has package scope, it must also be defined by the
1030 if ((super
->accflags
& Modifier::PUBLIC
) == 0)
1032 if ( sub
->loader
!= super
->loader
1033 || !_Jv_ClassNameSamePackage (sub
->name
, super
->name
))
1035 throw_incompatible_class_change_error (sub
->getName ());
1039 // FIXME: add interface circularity check here
1042 throw_class_circularity_error (sub
->getName ());
1046 void _Jv_ClassReader::handleFieldsBegin (int count
)
1048 def
->fields
= (_Jv_Field
*)
1049 _Jv_AllocBytes (count
* sizeof (_Jv_Field
));
1050 def
->field_count
= count
;
1051 def
->field_initializers
= (_Jv_ushort
*)
1052 _Jv_AllocBytes (count
* sizeof (_Jv_ushort
));
1053 for (int i
= 0; i
< count
; i
++)
1054 def
->field_initializers
[i
] = (_Jv_ushort
) 0;
1057 void _Jv_ClassReader::handleField (int field_no
,
1062 using namespace java::lang::reflect
;
1064 _Jv_word
*pool_data
= def
->constants
.data
;
1066 _Jv_Field
*field
= &def
->fields
[field_no
];
1067 _Jv_Utf8Const
*field_name
= pool_data
[name
].utf8
;
1069 #ifndef COMPACT_FIELDS
1070 field
->name
= field_name
;
1072 field
->nameIndex
= name
;
1076 verify_identifier (field_name
);
1078 // ignore flags we don't know about.
1079 field
->flags
= flags
& Modifier::ALL_FLAGS
;
1083 if (field
->flags
& (Modifier::SYNCHRONIZED
1085 | Modifier::INTERFACE
1086 | Modifier::ABSTRACT
))
1087 throw_class_format_error ("erroneous field access flags");
1089 if (1 < ( ((field
->flags
& Modifier::PUBLIC
) ? 1 : 0)
1090 +((field
->flags
& Modifier::PRIVATE
) ? 1 : 0)
1091 +((field
->flags
& Modifier::PROTECTED
) ? 1 : 0)))
1092 throw_class_format_error ("erroneous field access flags");
1095 _Jv_Utf8Const
* sig
= pool_data
[desc
].utf8
;
1098 _Jv_VerifyFieldSignature (sig
);
1100 // field->type is really a jclass, but while it is still
1101 // unresolved we keep an _Jv_Utf8Const* instead.
1102 field
->type
= (jclass
) sig
;
1103 field
->flags
|= _Jv_FIELD_UNRESOLVED_FLAG
;
1104 field
->u
.boffset
= 0;
1108 void _Jv_ClassReader::handleConstantValueAttribute (int field_index
,
1111 using namespace java::lang::reflect
;
1113 _Jv_Field
*field
= &def
->fields
[field_index
];
1115 if ((field
->flags
& (Modifier::STATIC
1117 | Modifier::PRIVATE
)) == 0)
1119 // Ignore, as per vmspec #4.7.2
1123 // do not allow multiple constant fields!
1124 if (field
->flags
& _Jv_FIELD_CONSTANT_VALUE
)
1125 throw_class_format_error ("field has multiple ConstantValue attributes");
1127 field
->flags
|= _Jv_FIELD_CONSTANT_VALUE
;
1128 def
->field_initializers
[field_index
] = value
;
1130 /* type check the initializer */
1132 if (value
<= 0 || value
>= pool_count
)
1133 throw_class_format_error ("erroneous ConstantValue attribute");
1135 /* FIXME: do the rest */
1138 void _Jv_ClassReader::handleFieldsEnd ()
1140 using namespace java::lang::reflect
;
1142 // We need to reorganize the fields so that the static ones are first,
1143 // to conform to GCJ class layout.
1146 int high
= def
->field_count
-1;
1147 _Jv_Field
*fields
= def
->fields
;
1148 _Jv_ushort
*inits
= def
->field_initializers
;
1150 // this is kind of a raw version of quicksort.
1153 // go forward on low, while it's a static
1154 while (low
< high
&& (fields
[low
].flags
& Modifier::STATIC
) != 0)
1157 // go backwards on high, while it's a non-static
1158 while (low
< high
&& (fields
[high
].flags
& Modifier::STATIC
) == 0)
1164 _Jv_Field tmp
= fields
[low
];
1165 _Jv_ushort itmp
= inits
[low
];
1167 fields
[low
] = fields
[high
];
1168 inits
[low
] = inits
[high
];
1177 if ((fields
[low
].flags
& Modifier::STATIC
) != 0)
1180 def
->static_field_count
= low
;
1186 _Jv_ClassReader::handleMethodsBegin (int count
)
1188 def
->methods
= (_Jv_Method
*)
1189 _Jv_AllocBytes (sizeof (_Jv_Method
)*count
);
1191 def
->interpreted_methods
1192 = (_Jv_MethodBase
**) _Jv_AllocBytes (sizeof (_Jv_MethodBase
*)
1195 for (int i
= 0; i
< count
; i
++)
1196 def
->interpreted_methods
[i
] = 0;
1198 def
->method_count
= count
;
1202 void _Jv_ClassReader::handleMethod
1203 (int mth_index
, int accflags
, int name
, int desc
)
1205 using namespace java::lang::reflect
;
1207 _Jv_word
*pool_data
= def
->constants
.data
;
1208 _Jv_Method
*method
= &def
->methods
[mth_index
];
1210 check_tag (name
, JV_CONSTANT_Utf8
);
1211 prepare_pool_entry (name
, JV_CONSTANT_Utf8
);
1212 method
->name
= pool_data
[name
].utf8
;
1214 check_tag (desc
, JV_CONSTANT_Utf8
);
1215 prepare_pool_entry (desc
, JV_CONSTANT_Utf8
);
1216 method
->signature
= pool_data
[desc
].utf8
;
1218 // ignore unknown flags
1219 method
->accflags
= accflags
& Modifier::ALL_FLAGS
;
1223 method
->throws
= NULL
;
1227 if (_Jv_equalUtf8Consts (method
->name
, clinit_name
)
1228 || _Jv_equalUtf8Consts (method
->name
, init_name
))
1231 verify_identifier (method
->name
);
1233 _Jv_VerifyMethodSignature (method
->signature
);
1235 if (method
->accflags
& (Modifier::VOLATILE
1236 | Modifier::TRANSIENT
1237 | Modifier::INTERFACE
))
1238 throw_class_format_error ("erroneous method access flags");
1240 if (1 < ( ((method
->accflags
& Modifier::PUBLIC
) ? 1 : 0)
1241 +((method
->accflags
& Modifier::PRIVATE
) ? 1 : 0)
1242 +((method
->accflags
& Modifier::PROTECTED
) ? 1 : 0)))
1243 throw_class_format_error ("erroneous method access flags");
1247 void _Jv_ClassReader::handleCodeAttribute
1248 (int method_index
, int max_stack
, int max_locals
,
1249 int code_start
, int code_length
, int exc_table_length
)
1251 int size
= _Jv_InterpMethod::size (exc_table_length
, code_length
);
1252 _Jv_InterpMethod
*method
=
1253 (_Jv_InterpMethod
*) (_Jv_AllocBytes (size
));
1255 method
->max_stack
= max_stack
;
1256 method
->max_locals
= max_locals
;
1257 method
->code_length
= code_length
;
1258 method
->exc_count
= exc_table_length
;
1259 method
->defining_class
= def
;
1260 method
->self
= &def
->methods
[method_index
];
1261 method
->prepared
= NULL
;
1263 // grab the byte code!
1264 memcpy ((void*) method
->bytecode (),
1265 (void*) (bytes
+code_start
),
1268 def
->interpreted_methods
[method_index
] = method
;
1271 void _Jv_ClassReader::handleExceptionTableEntry
1272 (int method_index
, int exc_index
,
1273 int start_pc
, int end_pc
, int handler_pc
, int catch_type
)
1275 _Jv_InterpMethod
*method
= reinterpret_cast<_Jv_InterpMethod
*>
1276 (def
->interpreted_methods
[method_index
]);
1277 _Jv_InterpException
*exc
= method
->exceptions ();
1279 exc
[exc_index
].start_pc
.i
= start_pc
;
1280 exc
[exc_index
].end_pc
.i
= end_pc
;
1281 exc
[exc_index
].handler_pc
.i
= handler_pc
;
1282 exc
[exc_index
].handler_type
.i
= catch_type
;
1285 void _Jv_ClassReader::handleMethodsEnd ()
1287 using namespace java::lang::reflect
;
1289 for (int i
= 0; i
< def
->method_count
; i
++)
1291 _Jv_Method
*method
= &def
->methods
[i
];
1292 if ((method
->accflags
& Modifier::NATIVE
) != 0)
1294 if (def
->interpreted_methods
[i
] != 0)
1295 throw_class_format_error ("code provided for native method");
1298 _Jv_JNIMethod
*m
= (_Jv_JNIMethod
*)
1299 _Jv_AllocBytes (sizeof (_Jv_JNIMethod
));
1300 m
->defining_class
= def
;
1303 def
->interpreted_methods
[i
] = m
;
1306 else if ((method
->accflags
& Modifier::ABSTRACT
) != 0)
1308 if (def
->interpreted_methods
[i
] != 0)
1309 throw_class_format_error ("code provided for abstract method");
1313 if (def
->interpreted_methods
[i
] == 0)
1314 throw_class_format_error ("method with no code");
1319 void _Jv_ClassReader::throw_class_format_error (char *msg
)
1322 if (def
->name
!= NULL
)
1324 jsize mlen
= strlen (msg
);
1325 unsigned char* data
= (unsigned char*) def
->name
->data
;
1326 int ulen
= def
->name
->length
;
1327 unsigned char* limit
= data
+ ulen
;
1328 jsize nlen
= _Jv_strLengthUtf8 ((char *) data
, ulen
);
1329 jsize len
= nlen
+ mlen
+ 3;
1330 str
= JvAllocString(len
);
1331 jchar
*chrs
= JvGetStringChars(str
);
1332 while (data
< limit
)
1333 *chrs
++ = UTF8_GET(data
, limit
);
1341 *chrs
++ = c
& 0xFFFF;
1346 str
= JvNewStringLatin1 (msg
);
1347 ::throw_class_format_error (str
);
1350 /** Here we define the exceptions that can be thrown */
1353 throw_no_class_def_found_error (jstring msg
)
1356 ? new java::lang::NoClassDefFoundError (msg
)
1357 : new java::lang::NoClassDefFoundError
);
1361 throw_no_class_def_found_error (char *msg
)
1363 throw_no_class_def_found_error (JvNewStringLatin1 (msg
));
1367 throw_class_format_error (jstring msg
)
1370 ? new java::lang::ClassFormatError (msg
)
1371 : new java::lang::ClassFormatError
);
1375 throw_internal_error (char *msg
)
1377 throw new java::lang::InternalError (JvNewStringLatin1 (msg
));
1380 static void throw_incompatible_class_change_error (jstring msg
)
1382 throw new java::lang::IncompatibleClassChangeError (msg
);
1385 static void throw_class_circularity_error (jstring msg
)
1387 throw new java::lang::ClassCircularityError (msg
);
1390 #endif /* INTERPRETER */
1394 /** This section takes care of verifying integrity of identifiers,
1395 signatures, field ddescriptors, and class names */
1397 #define UTF8_PEEK(PTR, LIMIT) \
1398 ({ unsigned char* xxkeep = (PTR); \
1399 int xxch = UTF8_GET(PTR,LIMIT); \
1400 PTR = xxkeep; xxch; })
1402 /* Verify one element of a type descriptor or signature. */
1403 static unsigned char*
1404 _Jv_VerifyOne (unsigned char* ptr
, unsigned char* limit
, bool void_ok
)
1409 int ch
= UTF8_GET (ptr
, limit
);
1417 case 'S': case 'B': case 'I': case 'J':
1418 case 'Z': case 'C': case 'F': case 'D':
1423 unsigned char *start
= ptr
, *end
;
1431 if ((ch
= UTF8_GET (ptr
, limit
)) == -1)
1436 if (! _Jv_VerifyClassName (start
, (unsigned short) (end
-start
)))
1442 return _Jv_VerifyOne (ptr
, limit
, false);
1452 /* Verification and loading procedures. */
1454 _Jv_VerifyFieldSignature (_Jv_Utf8Const
*sig
)
1456 unsigned char* ptr
= (unsigned char*) sig
->data
;
1457 unsigned char* limit
= ptr
+ sig
->length
;
1459 ptr
= _Jv_VerifyOne (ptr
, limit
, false);
1461 return ptr
== limit
;
1465 _Jv_VerifyMethodSignature (_Jv_Utf8Const
*sig
)
1467 unsigned char* ptr
= (unsigned char*) sig
->data
;
1468 unsigned char* limit
= ptr
+ sig
->length
;
1470 if (ptr
== limit
|| UTF8_GET(ptr
,limit
) != '(')
1473 while (ptr
&& UTF8_PEEK (ptr
, limit
) != ')')
1474 ptr
= _Jv_VerifyOne (ptr
, limit
, false);
1476 if (UTF8_GET (ptr
, limit
) != ')')
1479 // get the return type
1480 ptr
= _Jv_VerifyOne (ptr
, limit
, true);
1482 return ptr
== limit
;
1485 /* We try to avoid calling the Character methods all the time, in
1486 fact, they will only be called for non-standard things. */
1487 static __inline__
int
1488 is_identifier_start (int c
)
1490 unsigned int ch
= (unsigned)c
;
1492 if ((ch
- 0x41U
) < 29U) /* A ... Z */
1494 if ((ch
- 0x61U
) < 29U) /* a ... z */
1496 if (ch
== 0x5FU
) /* _ */
1499 return java::lang::Character::isJavaIdentifierStart ((jchar
) ch
);
1502 static __inline__
int
1503 is_identifier_part (int c
)
1505 unsigned int ch
= (unsigned)c
;
1507 if ((ch
- 0x41U
) < 29U) /* A ... Z */
1509 if ((ch
- 0x61U
) < 29U) /* a ... z */
1511 if ((ch
- 0x30) < 10U) /* 0 .. 9 */
1513 if (ch
== 0x5FU
|| ch
== 0x24U
) /* _ $ */
1516 return java::lang::Character::isJavaIdentifierStart ((jchar
) ch
);
1520 _Jv_VerifyIdentifier (_Jv_Utf8Const
* name
)
1522 unsigned char *ptr
= (unsigned char*) name
->data
;
1523 unsigned char *limit
= ptr
+ name
->length
;
1526 if ((ch
= UTF8_GET (ptr
, limit
))==-1
1527 || ! is_identifier_start (ch
))
1530 while (ptr
!= limit
)
1532 if ((ch
= UTF8_GET (ptr
, limit
))==-1
1533 || ! is_identifier_part (ch
))
1540 _Jv_VerifyClassName (unsigned char* ptr
, _Jv_ushort length
)
1542 unsigned char *limit
= ptr
+length
;
1545 if ('[' == UTF8_PEEK (ptr
, limit
))
1547 unsigned char *end
= _Jv_VerifyOne (++ptr
, limit
, false);
1548 // _Jv_VerifyOne must leave us looking at the terminating nul
1558 if ((ch
= UTF8_GET (ptr
, limit
))==-1)
1560 if (! is_identifier_start (ch
))
1565 else if ((ch
= UTF8_GET (ptr
, limit
))==-1)
1569 else if (! is_identifier_part (ch
))
1576 _Jv_VerifyClassName (_Jv_Utf8Const
*name
)
1578 return _Jv_VerifyClassName ((unsigned char*)&name
->data
[0],
1579 (_Jv_ushort
) name
->length
);
1582 /* Returns true, if NAME1 and NAME2 represent classes in the same
1585 _Jv_ClassNameSamePackage (_Jv_Utf8Const
*name1
, _Jv_Utf8Const
*name2
)
1587 unsigned char* ptr1
= (unsigned char*) name1
->data
;
1588 unsigned char* limit1
= ptr1
+ name1
->length
;
1590 unsigned char* last1
= ptr1
;
1592 // scan name1, and find the last occurrence of '.'
1593 while (ptr1
< limit1
) {
1594 int ch1
= UTF8_GET (ptr1
, limit1
);
1603 // Now the length of NAME1's package name is LEN.
1604 int len
= last1
- (unsigned char*) name1
->data
;
1606 // If this is longer than NAME2, then we're off.
1607 if (len
> name2
->length
)
1610 // Then compare the first len bytes for equality.
1611 if (memcmp ((void*) name1
->data
, (void*) name2
->data
, len
) == 0)
1613 // Check that there are no .'s after position LEN in NAME2.
1615 unsigned char* ptr2
= (unsigned char*) name2
->data
+ len
;
1616 unsigned char* limit2
=
1617 (unsigned char*) name2
->data
+ name2
->length
;
1619 while (ptr2
< limit2
)
1621 int ch2
= UTF8_GET (ptr2
, limit2
);
1622 if (ch2
== -1 || ch2
== '.')