* config/ia64/sysv4.h (DBX_DEBUGGING_INFO): Undef.
[official-gcc.git] / libjava / defineclass.cc
blob3a6eaba92276c306f1ec8360ec0ab9ff0f02dc45
1 // defineclass.cc - defining a class from .class format.
3 /* Copyright (C) 1999, 2000, 2001 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
9 details. */
11 /*
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...).
21 #include <config.h>
23 #include <java-interp.h>
25 #include <stdlib.h>
26 #include <java-cpool.h>
27 #include <gcj/cni.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>
42 using namespace gcj;
44 #ifdef INTERPRETER
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__));
61 /**
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.
85 bool verify;
87 // input data.
88 unsigned char *bytes;
89 int len;
91 // current input position
92 int pos;
94 // the constant pool data
95 int pool_count;
96 unsigned char *tags;
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)
105 if (pos + num > len)
106 throw_class_format_error ("Premature end of data");
109 /* skip a given number of bytes in input */
110 inline void skip (int num)
112 check (num);
113 pos += num;
116 /* read an unsignend 1-byte unit */
117 inline static jint get1u (unsigned char* bytes)
119 return bytes[0];
122 /* read an unsigned 1-byte unit */
123 inline jint read1u ()
125 skip (1);
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 ()
138 skip (2);
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) */
152 inline jint read4 ()
154 skip (4);
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 ()
174 skip (8);
175 return get8 (bytes+pos-8);
178 inline void check_tag (int index, char expected_tag)
180 if (index < 0
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");
221 verify = true;
222 bytes = (unsigned char*) (elements (data)+offset);
223 len = length;
224 pos = 0;
225 def = (_Jv_InterpClass*) klass;
228 /** and here goes the parser members defined out-of-line */
229 void parse ();
230 void read_constpool ();
231 void prepare_pool_entry (int index, unsigned char tag);
232 void read_fields ();
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.
271 /* This is used for the isJavaIdentifierStart & isJavaIdentifierPart
272 methods, so we avoid doing _Jv_InitClass all the time */
274 static const java::lang::Character *character = 0;
275 static void prepare_character ();
277 void
278 _Jv_DefineClass (jclass klass, jbyteArray data, jint offset, jint length)
280 if (character == 0)
281 prepare_character ();
283 _Jv_ClassReader reader (klass, data, offset, length);
284 reader.parse();
286 /* that's it! */
289 /** put it after _Jv_DefineClass, so it doesn't get inlined */
290 static void prepare_character ()
292 character = new java::lang::Character ('!');
296 /** This section defines the parsing/scanning of the class data */
298 void
299 _Jv_ClassReader::parse ()
301 int magic = read4 ();
303 /* FIXME: Decide which range of version numbers to allow */
305 /* int minor_version = */ read2u ();
306 /* int major_verson = */ read2u ();
308 if (magic != (int) 0xCAFEBABE)
309 throw_class_format_error ("bad magic number");
311 pool_count = read2u ();
313 read_constpool ();
315 int access_flags = read2u ();
316 int this_class = read2u ();
317 int super_class = read2u ();
319 check_tag (this_class, JV_CONSTANT_Class);
320 if (super_class != 0)
321 check_tag (super_class, JV_CONSTANT_Class);
323 handleClassBegin (access_flags, this_class, super_class);
325 int interfaces_count = read2u ();
327 handleInterfacesBegin (interfaces_count);
329 for (int i = 0; i < interfaces_count; i++)
331 int iface = read2u ();
332 check_tag (iface, JV_CONSTANT_Class);
333 handleInterface (i, iface);
336 read_fields ();
337 read_methods ();
339 int attributes_count = read2u ();
341 for (int i = 0; i < attributes_count; i++)
343 read_one_class_attribute ();
346 if (pos != len)
347 throw_class_format_error ("unused data before end of file");
349 // tell everyone we're done.
350 def->state = JV_STATE_LOADED;
351 def->notifyAll ();
355 void _Jv_ClassReader::read_constpool ()
357 tags = (unsigned char*) _Jv_AllocBytes (pool_count);
358 offsets = (unsigned int *) _Jv_AllocBytes (sizeof (int)
359 * pool_count) ;
361 /** first, we scan the constant pool, collecting tags and offsets */
362 tags[0] = JV_CONSTANT_Undefined;
363 offsets[0] = pos;
364 for (int c = 1; c < pool_count; c++)
366 tags[c] = read1u ();
367 offsets[c] = pos;
369 switch (tags[c])
371 case JV_CONSTANT_String:
372 case JV_CONSTANT_Class:
373 skip (2);
374 break;
376 case JV_CONSTANT_Fieldref:
377 case JV_CONSTANT_Methodref:
378 case JV_CONSTANT_InterfaceMethodref:
379 case JV_CONSTANT_NameAndType:
380 case JV_CONSTANT_Integer:
381 case JV_CONSTANT_Float:
382 skip (4);
383 break;
385 case JV_CONSTANT_Double:
386 case JV_CONSTANT_Long:
387 skip (8);
388 tags[++c] = JV_CONSTANT_Undefined;
389 break;
391 case JV_CONSTANT_Utf8:
393 int len = read2u ();
394 skip (len);
396 break;
398 case JV_CONSTANT_Unicode:
399 throw_class_format_error ("unicode not supported");
400 break;
402 default:
403 throw_class_format_error ("erroneous constant pool tag");
407 handleConstantPool ();
411 void _Jv_ClassReader::read_fields ()
413 int fields_count = read2u ();
414 handleFieldsBegin (fields_count);
416 for (int i = 0; i < fields_count; i++)
418 int access_flags = read2u ();
419 int name_index = read2u ();
420 int descriptor_index = read2u ();
421 int attributes_count = read2u ();
423 check_tag (name_index, JV_CONSTANT_Utf8);
424 prepare_pool_entry (name_index, JV_CONSTANT_Utf8);
426 check_tag (descriptor_index, JV_CONSTANT_Utf8);
427 prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8);
429 handleField (i, access_flags, name_index, descriptor_index);
431 for (int j = 0; j < attributes_count; j++)
433 read_one_field_attribute (i);
437 handleFieldsEnd ();
440 bool
441 _Jv_ClassReader::is_attribute_name (int index, char *name)
443 check_tag (index, JV_CONSTANT_Utf8);
444 int len = get2u (bytes+offsets[index]);
445 if (len != (int) strlen (name))
446 return false;
447 else
448 return !memcmp (bytes+offsets[index]+2, name, len);
451 void _Jv_ClassReader::read_one_field_attribute (int field_index)
453 int name = read2u ();
454 int length = read4 ();
456 if (is_attribute_name (name, "ConstantValue"))
458 int cv = read2u ();
460 if (cv < pool_count
461 && cv > 0
462 && (tags[cv] == JV_CONSTANT_Integer
463 || tags[cv] == JV_CONSTANT_Float
464 || tags[cv] == JV_CONSTANT_Long
465 || tags[cv] == JV_CONSTANT_Double
466 || tags[cv] == JV_CONSTANT_String))
468 handleConstantValueAttribute (field_index, cv);
470 else
472 throw_class_format_error ("erroneous ConstantValue attribute");
475 if (length != 2)
476 throw_class_format_error ("erroneous ConstantValue attribute");
479 else
481 skip (length);
485 void _Jv_ClassReader::read_methods ()
487 int methods_count = read2u ();
489 handleMethodsBegin (methods_count);
491 for (int i = 0; i < methods_count; i++)
493 int access_flags = read2u ();
494 int name_index = read2u ();
495 int descriptor_index = read2u ();
496 int attributes_count = read2u ();
498 check_tag (name_index, JV_CONSTANT_Utf8);
499 prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8);
501 check_tag (name_index, JV_CONSTANT_Utf8);
502 prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8);
504 handleMethod (i, access_flags, name_index,
505 descriptor_index);
507 for (int j = 0; j < attributes_count; j++)
509 read_one_method_attribute (i);
513 handleMethodsEnd ();
516 void _Jv_ClassReader::read_one_method_attribute (int method_index)
518 int name = read2u ();
519 int length = read4 ();
521 if (is_attribute_name (name, "Exceptions"))
523 _Jv_Method *method = reinterpret_cast<_Jv_Method *>
524 (&def->methods[method_index]);
525 if (method->throws != NULL)
526 throw_class_format_error ("only one Exceptions attribute allowed per method");
528 int num_exceptions = read2u ();
529 // We use malloc here because the GC won't scan the method
530 // objects. FIXME this means a memory leak if we GC a class.
531 // (Currently we never do.)
532 _Jv_Utf8Const **exceptions =
533 (_Jv_Utf8Const **) _Jv_Malloc ((num_exceptions + 1) * sizeof (_Jv_Utf8Const *));
535 int out = 0;
536 _Jv_word *pool_data = def->constants.data;
537 for (int i = 0; i < num_exceptions; ++i)
541 int ndx = read2u ();
542 // JLS 2nd Ed. 4.7.5 requires that the tag not be 0.
543 if (ndx != 0)
545 check_tag (ndx, JV_CONSTANT_Class);
546 exceptions[out++] = pool_data[ndx].utf8;
549 catch (java::lang::Throwable *exc)
551 _Jv_Free (exceptions);
552 throw exc;
555 exceptions[out] = NULL;
556 method->throws = exceptions;
559 else if (is_attribute_name (name, "Code"))
561 int start_off = pos;
562 int max_stack = read2u ();
563 int max_locals = read2u ();
564 int code_length = read4 ();
566 int code_start = pos;
567 skip (code_length);
568 int exception_table_length = read2u ();
570 handleCodeAttribute (method_index,
571 max_stack, max_locals,
572 code_start, code_length,
573 exception_table_length);
576 for (int i = 0; i < exception_table_length; i++)
578 int start_pc = read2u ();
579 int end_pc = read2u ();
580 int handler_pc = read2u ();
581 int catch_type = read2u ();
583 if (start_pc > end_pc
584 || start_pc < 0
585 || end_pc >= code_length
586 || handler_pc >= code_length)
587 throw_class_format_error ("erroneous exception handler info");
589 if (! (tags[catch_type] == JV_CONSTANT_Class
590 || tags[catch_type] == 0))
592 throw_class_format_error ("erroneous exception handler info");
595 handleExceptionTableEntry (method_index,
597 start_pc,
598 end_pc,
599 handler_pc,
600 catch_type);
604 int attributes_count = read2u ();
606 for (int i = 0; i < attributes_count; i++)
608 read_one_code_attribute (method_index);
611 if ((pos - start_off) != length)
612 throw_class_format_error ("code attribute too short");
615 else
617 /* ignore unknown attributes */
618 skip (length);
622 void _Jv_ClassReader::read_one_code_attribute (int /*method*/)
624 /* ignore for now, ... later we may want to pick up
625 line number information, for debugging purposes;
626 in fact, the whole debugger issue is open! */
628 /* int name = */ read2u ();
629 int length = read4 ();
630 skip (length);
634 void _Jv_ClassReader::read_one_class_attribute ()
636 /* we also ignore the class attributes, ...
637 some day we'll add inner-classes support. */
639 /* int name = */ read2u ();
640 int length = read4 ();
641 skip (length);
647 /* this section defines the semantic actions of the parser */
649 void _Jv_ClassReader::handleConstantPool ()
651 /** now, we actually define the class' constant pool */
653 // the pool is scanned explicitly by the collector
654 jbyte *pool_tags = (jbyte*) _Jv_AllocBytes (pool_count);
655 _Jv_word *pool_data
656 = (_Jv_word*) _Jv_AllocBytes (pool_count * sizeof (_Jv_word));
658 def->constants.tags = pool_tags;
659 def->constants.data = pool_data;
660 def->constants.size = pool_count;
662 // Here we make a pass to collect the strings! We do this, because
663 // internally in the GCJ runtime, classes are encoded with .'s not /'s.
664 // Therefore, we first collect the strings, and then translate the rest
665 // of the utf8-entries (thus not representing strings) from /-notation
666 // to .-notation.
667 for (int i = 1; i < pool_count; i++)
669 if (tags[i] == JV_CONSTANT_String)
671 unsigned char* str_data = bytes + offsets [i];
672 int utf_index = get2u (str_data);
673 check_tag (utf_index, JV_CONSTANT_Utf8);
674 unsigned char *utf_data = bytes + offsets[utf_index];
675 int len = get2u (utf_data);
676 pool_data[i].utf8 = _Jv_makeUtf8Const ((char*)(utf_data+2), len);
677 pool_tags[i] = JV_CONSTANT_String;
679 else
681 pool_tags[i] = JV_CONSTANT_Undefined;
685 // and now, we scan everything else but strings & utf8-entries. This
686 // leaves out those utf8-entries which are not used; which will be left
687 // with a tag of JV_CONSTANT_Undefined in the class definition.
688 for (int index = 1; index < pool_count; index++)
690 switch (tags[index])
692 case JV_CONSTANT_Undefined:
693 case JV_CONSTANT_String:
694 case JV_CONSTANT_Utf8:
695 continue;
697 default:
698 prepare_pool_entry (index, tags[index]);
704 /* this is a recursive procedure, which will prepare pool entries as needed.
705 Which is how we avoid initializing those entries which go unused. */
706 void
707 _Jv_ClassReader::prepare_pool_entry (int index, unsigned char this_tag)
709 /* these two, pool_data and pool_tags, point into the class
710 structure we are currently defining */
712 unsigned char *pool_tags = (unsigned char*) def->constants.tags;
713 _Jv_word *pool_data = def->constants.data;
715 /* this entry was already prepared */
716 if (pool_tags[index] == this_tag)
717 return;
719 /* this_data points to the constant-pool information for the current
720 constant-pool entry */
722 unsigned char *this_data = bytes + offsets[index];
724 switch (this_tag)
726 case JV_CONSTANT_Utf8:
728 // If we came here, it is because some other tag needs this
729 // utf8-entry for type information! Thus, we translate /'s to .'s in
730 // order to accomondate gcj's internal representation.
732 int len = get2u (this_data);
733 char *buffer = (char*) __builtin_alloca (len);
734 char *s = ((char*) this_data)+2;
736 /* FIXME: avoid using a buffer here */
737 for (int i = 0; i < len; i++)
739 if (s[i] == '/')
740 buffer[i] = '.';
741 else
742 buffer[i] = (char) s[i];
745 pool_data[index].utf8 = _Jv_makeUtf8Const (buffer, len);
746 pool_tags[index] = JV_CONSTANT_Utf8;
748 break;
750 case JV_CONSTANT_Class:
752 int utf_index = get2u (this_data);
753 check_tag (utf_index, JV_CONSTANT_Utf8);
754 prepare_pool_entry (utf_index, JV_CONSTANT_Utf8);
756 if (verify)
757 verify_classname (pool_data[utf_index].utf8);
759 pool_data[index].utf8 = pool_data[utf_index].utf8;
760 pool_tags[index] = JV_CONSTANT_Class;
762 break;
764 case JV_CONSTANT_String:
765 // already handled before...
766 break;
768 case JV_CONSTANT_Fieldref:
769 case JV_CONSTANT_Methodref:
770 case JV_CONSTANT_InterfaceMethodref:
772 int class_index = get2u (this_data);
773 int nat_index = get2u (this_data+2);
775 check_tag (class_index, JV_CONSTANT_Class);
776 prepare_pool_entry (class_index, JV_CONSTANT_Class);
778 check_tag (nat_index, JV_CONSTANT_NameAndType);
779 prepare_pool_entry (nat_index, JV_CONSTANT_NameAndType);
781 // here, verify the signature and identifier name
782 if (verify)
784 _Jv_ushort name_index, type_index;
785 _Jv_loadIndexes (&pool_data[nat_index],
786 name_index, type_index);
788 if (this_tag == JV_CONSTANT_Fieldref)
789 _Jv_VerifyFieldSignature (pool_data[type_index].utf8);
790 else
791 _Jv_VerifyMethodSignature (pool_data[type_index].utf8);
793 _Jv_Utf8Const* name = pool_data[name_index].utf8;
795 if (this_tag != JV_CONSTANT_Fieldref
796 && ( _Jv_equalUtf8Consts (name, clinit_name)
797 || _Jv_equalUtf8Consts (name, init_name)))
798 /* ignore */;
799 else
800 verify_identifier (pool_data[name_index].utf8);
803 _Jv_storeIndexes (&pool_data[index], class_index, nat_index);
804 pool_tags[index] = this_tag;
806 break;
808 case JV_CONSTANT_NameAndType:
810 _Jv_ushort name_index = get2u (this_data);
811 _Jv_ushort type_index = get2u (this_data+2);
813 check_tag (name_index, JV_CONSTANT_Utf8);
814 prepare_pool_entry (name_index, JV_CONSTANT_Utf8);
816 check_tag (type_index, JV_CONSTANT_Utf8);
817 prepare_pool_entry (type_index, JV_CONSTANT_Utf8);
819 _Jv_storeIndexes (&pool_data[index], name_index, type_index);
820 pool_tags[index] = JV_CONSTANT_NameAndType;
822 break;
824 case JV_CONSTANT_Float:
826 jfloat f = java::lang::Float::intBitsToFloat ((jint) get4 (this_data));
827 _Jv_storeFloat (&pool_data[index], f);
828 pool_tags[index] = JV_CONSTANT_Float;
830 break;
832 case JV_CONSTANT_Integer:
834 int i = get4 (this_data);
835 _Jv_storeInt (&pool_data[index], i);
836 pool_tags[index] = JV_CONSTANT_Integer;
838 break;
840 case JV_CONSTANT_Double:
842 jdouble d
843 = java::lang::Double::longBitsToDouble ((jlong) get8 (this_data));
844 _Jv_storeDouble (&pool_data[index], d);
845 pool_tags[index] = JV_CONSTANT_Double;
847 break;
849 case JV_CONSTANT_Long:
851 jlong i = get8 (this_data);
852 _Jv_storeLong (&pool_data[index], i);
853 pool_tags[index] = JV_CONSTANT_Long;
855 break;
857 default:
858 throw_class_format_error ("erroneous constant pool tag");
863 void
864 _Jv_ClassReader::handleClassBegin
865 (int access_flags, int this_class, int super_class)
867 using namespace java::lang::reflect;
869 unsigned char *pool_tags = (unsigned char*) def->constants.tags;
870 _Jv_word *pool_data = def->constants.data;
872 check_tag (this_class, JV_CONSTANT_Class);
873 _Jv_Utf8Const *loadedName = pool_data[this_class].utf8;
875 // was ClassLoader.defineClass called with an expected class name?
876 if (def->name == 0)
878 jclass orig = _Jv_FindClassInCache (loadedName, def->loader);
880 if (orig == 0)
882 def->name = loadedName;
884 else
886 jstring msg = JvNewStringUTF ("anonymous "
887 "class data denotes "
888 "existing class ");
889 msg = msg->concat (orig->getName ());
891 throw_no_class_def_found_error (msg);
895 // assert that the loaded class has the expected name, 5.3.5
896 else if (! _Jv_equalUtf8Consts (loadedName, def->name))
898 jstring msg = JvNewStringUTF ("loaded class ");
899 msg = msg->concat (def->getName ());
900 msg = msg->concat (_Jv_NewStringUTF (" was in fact named "));
901 jstring klass_name = _Jv_NewStringUTF (loadedName->data);
902 msg = msg->concat (klass_name);
904 throw_no_class_def_found_error (msg);
907 def->accflags = access_flags;
908 pool_data[this_class].clazz = def;
909 pool_tags[this_class] = JV_CONSTANT_ResolvedClass;
911 if (super_class == 0)
913 // interfaces have java.lang.Object as super.
914 if (access_flags & Modifier::INTERFACE)
916 def->superclass = (jclass)&java::lang::Object::class$;
919 // FIXME: Consider this carefully!
920 else if (!_Jv_equalUtf8Consts (def->name,
921 java::lang::Object::class$.name))
923 throw_no_class_def_found_error ("loading java.lang.Object");
927 // In the pre-loading state, it can be looked up in the
928 // cache only by this thread! This allows the super-class
929 // to include references to this class.
931 def->state = JV_STATE_PRELOADING;
934 JvSynchronize sync (&java::lang::Class::class$);
935 _Jv_RegisterClass (def);
938 if (super_class != 0)
940 // load the super class
941 check_tag (super_class, JV_CONSTANT_Class);
942 _Jv_Utf8Const* super_name = pool_data[super_class].utf8;
944 // load the super class using our defining loader
945 jclass the_super = _Jv_FindClass (super_name,
946 def->loader);
948 // This will establish that we are allowed to be a subclass,
949 // and check for class circularity error
950 checkExtends (def, the_super);
952 def->superclass = the_super;
953 pool_data[super_class].clazz = the_super;
954 pool_tags[super_class] = JV_CONSTANT_ResolvedClass;
957 // now we've come past the circularity problem, we can
958 // now say that we're loading...
960 def->state = JV_STATE_LOADING;
961 def->notifyAll ();
964 ///// implements the checks described in sect. 5.3.5.3
965 void
966 _Jv_ClassReader::checkExtends (jclass sub, jclass super)
968 using namespace java::lang::reflect;
970 // having an interface or a final class as a superclass is no good
971 if ((super->accflags & (Modifier::INTERFACE | Modifier::FINAL)) != 0)
973 throw_incompatible_class_change_error (sub->getName ());
976 // if the super class is not public, we need to check some more
977 if ((super->accflags & Modifier::PUBLIC) == 0)
979 // With package scope, the classes must have the same
980 // class loader.
981 if ( sub->loader != super->loader
982 || !_Jv_ClassNameSamePackage (sub->name, super->name))
984 throw_incompatible_class_change_error (sub->getName ());
988 for (; super != 0; super = super->superclass)
990 if (super == sub)
991 throw_class_circularity_error (sub->getName ());
997 void _Jv_ClassReader::handleInterfacesBegin (int count)
999 def->interfaces = (jclass*) _Jv_AllocBytes (count*sizeof (jclass));
1000 def->interface_count = count;
1003 void _Jv_ClassReader::handleInterface (int if_number, int offset)
1005 _Jv_word * pool_data = def->constants.data;
1006 unsigned char * pool_tags = (unsigned char*) def->constants.tags;
1008 jclass the_interface;
1010 if (pool_tags[offset] == JV_CONSTANT_Class)
1012 _Jv_Utf8Const* name = pool_data[offset].utf8;
1013 the_interface = _Jv_FindClass (name, def->loader);
1015 else if (pool_tags[offset] == JV_CONSTANT_ResolvedClass)
1017 the_interface = pool_data[offset].clazz;
1019 else
1021 throw_no_class_def_found_error ("erroneous constant pool tag");
1024 // checks the validity of the_interface, and that we are in fact
1025 // allowed to implement that interface.
1026 checkImplements (def, the_interface);
1028 pool_data[offset].clazz = the_interface;
1029 pool_tags[offset] = JV_CONSTANT_ResolvedClass;
1031 def->interfaces[if_number] = the_interface;
1034 void
1035 _Jv_ClassReader::checkImplements (jclass sub, jclass super)
1037 using namespace java::lang::reflect;
1039 // well, it *must* be an interface
1040 if ((super->accflags & Modifier::INTERFACE) == 0)
1042 throw_incompatible_class_change_error (sub->getName ());
1045 // if it has package scope, it must also be defined by the
1046 // same loader.
1047 if ((super->accflags & Modifier::PUBLIC) == 0)
1049 if ( sub->loader != super->loader
1050 || !_Jv_ClassNameSamePackage (sub->name, super->name))
1052 throw_incompatible_class_change_error (sub->getName ());
1056 // FIXME: add interface circularity check here
1057 if (sub == super)
1059 throw_class_circularity_error (sub->getName ());
1063 void _Jv_ClassReader::handleFieldsBegin (int count)
1065 def->fields = (_Jv_Field*)
1066 _Jv_AllocBytes (count * sizeof (_Jv_Field));
1067 def->field_count = count;
1068 def->field_initializers = (_Jv_ushort*)
1069 _Jv_AllocBytes (count * sizeof (_Jv_ushort));
1070 for (int i = 0; i < count; i++)
1071 def->field_initializers[i] = (_Jv_ushort) 0;
1074 void _Jv_ClassReader::handleField (int field_no,
1075 int flags,
1076 int name,
1077 int desc)
1079 using namespace java::lang::reflect;
1081 _Jv_word *pool_data = def->constants.data;
1083 _Jv_Field *field = &def->fields[field_no];
1084 _Jv_Utf8Const *field_name = pool_data[name].utf8;
1086 #ifndef COMPACT_FIELDS
1087 field->name = field_name;
1088 #else
1089 field->nameIndex = name;
1090 #endif
1092 if (verify)
1093 verify_identifier (field_name);
1095 // ignore flags we don't know about.
1096 field->flags = flags & Modifier::ALL_FLAGS;
1098 if (verify)
1100 if (field->flags & (Modifier::SYNCHRONIZED
1101 | Modifier::NATIVE
1102 | Modifier::INTERFACE
1103 | Modifier::ABSTRACT))
1104 throw_class_format_error ("erroneous field access flags");
1106 if (1 < ( ((field->flags & Modifier::PUBLIC) ? 1 : 0)
1107 +((field->flags & Modifier::PRIVATE) ? 1 : 0)
1108 +((field->flags & Modifier::PROTECTED) ? 1 : 0)))
1109 throw_class_format_error ("erroneous field access flags");
1112 _Jv_Utf8Const* sig = pool_data[desc].utf8;
1114 if (verify)
1115 _Jv_VerifyFieldSignature (sig);
1117 // field->type is really a jclass, but while it is still
1118 // unresolved we keep an _Jv_Utf8Const* instead.
1119 field->type = (jclass) sig;
1120 field->flags |= _Jv_FIELD_UNRESOLVED_FLAG;
1121 field->u.boffset = 0;
1125 void _Jv_ClassReader::handleConstantValueAttribute (int field_index,
1126 int value)
1128 using namespace java::lang::reflect;
1130 _Jv_Field *field = &def->fields[field_index];
1132 if ((field->flags & (Modifier::STATIC
1133 | Modifier::FINAL
1134 | Modifier::PRIVATE)) == 0)
1136 // Ignore, as per vmspec #4.7.2
1137 return;
1140 // do not allow multiple constant fields!
1141 if (field->flags & _Jv_FIELD_CONSTANT_VALUE)
1142 throw_class_format_error ("field has multiple ConstantValue attributes");
1144 field->flags |= _Jv_FIELD_CONSTANT_VALUE;
1145 def->field_initializers[field_index] = value;
1147 /* type check the initializer */
1149 if (value <= 0 || value >= pool_count)
1150 throw_class_format_error ("erroneous ConstantValue attribute");
1152 /* FIXME: do the rest */
1155 void _Jv_ClassReader::handleFieldsEnd ()
1157 using namespace java::lang::reflect;
1159 // We need to reorganize the fields so that the static ones are first,
1160 // to conform to GCJ class layout.
1162 int low = 0;
1163 int high = def->field_count-1;
1164 _Jv_Field *fields = def->fields;
1165 _Jv_ushort *inits = def->field_initializers;
1167 // this is kind of a raw version of quicksort.
1168 while (low < high)
1170 // go forward on low, while it's a static
1171 while (low < high && (fields[low].flags & Modifier::STATIC) != 0)
1172 low++;
1174 // go backwards on high, while it's a non-static
1175 while (low < high && (fields[high].flags & Modifier::STATIC) == 0)
1176 high--;
1178 if (low==high)
1179 break;
1181 _Jv_Field tmp = fields[low];
1182 _Jv_ushort itmp = inits[low];
1184 fields[low] = fields[high];
1185 inits[low] = inits[high];
1187 fields[high] = tmp;
1188 inits[high] = itmp;
1190 high -= 1;
1191 low += 1;
1194 if ((fields[low].flags & Modifier::STATIC) != 0)
1195 low += 1;
1197 def->static_field_count = low;
1202 void
1203 _Jv_ClassReader::handleMethodsBegin (int count)
1205 def->methods = (_Jv_Method*)
1206 _Jv_AllocBytes (sizeof (_Jv_Method)*count);
1208 def->interpreted_methods
1209 = (_Jv_MethodBase **) _Jv_AllocBytes (sizeof (_Jv_MethodBase *)
1210 * count);
1212 for (int i = 0; i < count; i++)
1213 def->interpreted_methods[i] = 0;
1215 def->method_count = count;
1219 void _Jv_ClassReader::handleMethod
1220 (int mth_index, int accflags, int name, int desc)
1222 using namespace java::lang::reflect;
1224 _Jv_word *pool_data = def->constants.data;
1225 _Jv_Method *method = &def->methods[mth_index];
1227 check_tag (name, JV_CONSTANT_Utf8);
1228 prepare_pool_entry (name, JV_CONSTANT_Utf8);
1229 method->name = pool_data[name].utf8;
1231 check_tag (desc, JV_CONSTANT_Utf8);
1232 prepare_pool_entry (desc, JV_CONSTANT_Utf8);
1233 method->signature = pool_data[desc].utf8;
1235 // ignore unknown flags
1236 method->accflags = accflags & Modifier::ALL_FLAGS;
1238 // intialize...
1239 method->ncode = 0;
1240 method->throws = NULL;
1242 if (verify)
1244 if (_Jv_equalUtf8Consts (method->name, clinit_name)
1245 || _Jv_equalUtf8Consts (method->name, init_name))
1246 /* ignore */;
1247 else
1248 verify_identifier (method->name);
1250 _Jv_VerifyMethodSignature (method->signature);
1252 if (method->accflags & (Modifier::VOLATILE
1253 | Modifier::TRANSIENT
1254 | Modifier::INTERFACE))
1255 throw_class_format_error ("erroneous method access flags");
1257 if (1 < ( ((method->accflags & Modifier::PUBLIC) ? 1 : 0)
1258 +((method->accflags & Modifier::PRIVATE) ? 1 : 0)
1259 +((method->accflags & Modifier::PROTECTED) ? 1 : 0)))
1260 throw_class_format_error ("erroneous method access flags");
1264 void _Jv_ClassReader::handleCodeAttribute
1265 (int method_index, int max_stack, int max_locals,
1266 int code_start, int code_length, int exc_table_length)
1268 int size = _Jv_InterpMethod::size (exc_table_length, code_length);
1269 _Jv_InterpMethod *method =
1270 (_Jv_InterpMethod*) (_Jv_AllocBytes (size));
1272 method->max_stack = max_stack;
1273 method->max_locals = max_locals;
1274 method->code_length = code_length;
1275 method->exc_count = exc_table_length;
1276 method->defining_class = def;
1277 method->self = &def->methods[method_index];
1279 // grab the byte code!
1280 memcpy ((void*) method->bytecode (),
1281 (void*) (bytes+code_start),
1282 code_length);
1284 def->interpreted_methods[method_index] = method;
1286 // FIXME: Shouldn't this be done after loading completes?
1287 // if (verify)
1288 // _Jv_VerifyMethod (method);
1291 void _Jv_ClassReader::handleExceptionTableEntry
1292 (int method_index, int exc_index,
1293 int start_pc, int end_pc, int handler_pc, int catch_type)
1295 _Jv_InterpMethod *method = reinterpret_cast<_Jv_InterpMethod *>
1296 (def->interpreted_methods[method_index]);
1297 _Jv_InterpException *exc = method->exceptions ();
1299 exc[exc_index].start_pc = start_pc;
1300 exc[exc_index].end_pc = end_pc;
1301 exc[exc_index].handler_pc = handler_pc;
1302 exc[exc_index].handler_type = catch_type;
1305 void _Jv_ClassReader::handleMethodsEnd ()
1307 using namespace java::lang::reflect;
1309 for (int i = 0; i < def->method_count; i++)
1311 _Jv_Method *method = &def->methods[i];
1312 if ((method->accflags & Modifier::NATIVE) != 0)
1314 if (def->interpreted_methods[i] != 0)
1315 throw_class_format_error ("code provided for native method");
1316 else
1318 _Jv_JNIMethod *m = (_Jv_JNIMethod *)
1319 _Jv_AllocBytes (sizeof (_Jv_JNIMethod));
1320 m->defining_class = def;
1321 m->self = method;
1322 m->function = NULL;
1323 def->interpreted_methods[i] = m;
1326 else if ((method->accflags & Modifier::ABSTRACT) != 0)
1328 if (def->interpreted_methods[i] != 0)
1329 throw_class_format_error ("code provided for abstract method");
1331 else
1333 if (def->interpreted_methods[i] == 0)
1334 throw_class_format_error ("method with no code");
1340 void _Jv_ClassReader::throw_class_format_error (char *msg)
1342 jstring str;
1343 if (def->name != NULL)
1345 jsize mlen = strlen (msg);
1346 unsigned char* data = (unsigned char*) def->name->data;
1347 int ulen = def->name->length;
1348 unsigned char* limit = data + ulen;
1349 jsize nlen = _Jv_strLengthUtf8 ((char *) data, ulen);
1350 jsize len = nlen + mlen + 3;
1351 str = JvAllocString(len);
1352 jchar *chrs = JvGetStringChars(str);
1353 while (data < limit)
1354 *chrs++ = UTF8_GET(data, limit);
1355 *chrs++ = ' ';
1356 *chrs++ = '(';
1357 for (;;)
1359 char c = *msg++;
1360 if (c == 0)
1361 break;
1362 *chrs++ = c & 0xFFFF;
1364 *chrs++ = ')';
1366 else
1367 str = JvNewStringLatin1 (msg);
1368 ::throw_class_format_error (str);
1371 /** Here we define the exceptions that can be thrown */
1373 static void
1374 throw_no_class_def_found_error (jstring msg)
1376 throw (msg
1377 ? new java::lang::NoClassDefFoundError (msg)
1378 : new java::lang::NoClassDefFoundError);
1381 static void
1382 throw_no_class_def_found_error (char *msg)
1384 throw_no_class_def_found_error (JvNewStringLatin1 (msg));
1387 static void
1388 throw_class_format_error (jstring msg)
1390 throw (msg
1391 ? new java::lang::ClassFormatError (msg)
1392 : new java::lang::ClassFormatError);
1395 static void
1396 throw_internal_error (char *msg)
1398 throw new java::lang::InternalError (JvNewStringLatin1 (msg));
1401 static void throw_incompatible_class_change_error (jstring msg)
1403 throw new java::lang::IncompatibleClassChangeError (msg);
1406 static void throw_class_circularity_error (jstring msg)
1408 throw new java::lang::ClassCircularityError (msg);
1411 #endif /* INTERPRETER */
1415 /** This section takes care of verifying integrity of identifiers,
1416 signatures, field ddescriptors, and class names */
1418 #define UTF8_PEEK(PTR, LIMIT) \
1419 ({ unsigned char* xxkeep = (PTR); \
1420 int xxch = UTF8_GET(PTR,LIMIT); \
1421 PTR = xxkeep; xxch; })
1423 /* Verify one element of a type descriptor or signature. */
1424 static unsigned char*
1425 _Jv_VerifyOne (unsigned char* ptr, unsigned char* limit, bool void_ok)
1427 if (ptr >= limit)
1428 return 0;
1430 int ch = UTF8_GET (ptr, limit);
1432 switch (ch)
1434 case 'V':
1435 if (! void_ok)
1436 return 0;
1438 case 'S': case 'B': case 'I': case 'J':
1439 case 'Z': case 'C': case 'F': case 'D':
1440 break;
1442 case 'L':
1444 unsigned char *start = ptr, *end;
1447 if (ptr > limit)
1448 return 0;
1450 end = ptr;
1452 if ((ch = UTF8_GET (ptr, limit)) == -1)
1453 return 0;
1456 while (ch != ';');
1457 if (! _Jv_VerifyClassName (start, (unsigned short) (end-start)))
1458 return 0;
1460 break;
1462 case '[':
1463 return _Jv_VerifyOne (ptr, limit, false);
1464 break;
1466 default:
1467 return 0;
1470 return ptr;
1473 /* Verification and loading procedures. */
1474 bool
1475 _Jv_VerifyFieldSignature (_Jv_Utf8Const*sig)
1477 unsigned char* ptr = (unsigned char*) sig->data;
1478 unsigned char* limit = ptr + sig->length;
1480 ptr = _Jv_VerifyOne (ptr, limit, false);
1482 return ptr == limit;
1485 bool
1486 _Jv_VerifyMethodSignature (_Jv_Utf8Const*sig)
1488 unsigned char* ptr = (unsigned char*) sig->data;
1489 unsigned char* limit = ptr + sig->length;
1491 if (ptr == limit || UTF8_GET(ptr,limit) != '(')
1492 return false;
1494 while (ptr && UTF8_PEEK (ptr, limit) != ')')
1495 ptr = _Jv_VerifyOne (ptr, limit, false);
1497 if (UTF8_GET (ptr, limit) != ')')
1498 return false;
1500 // get the return type
1501 ptr = _Jv_VerifyOne (ptr, limit, true);
1503 return ptr == limit;
1506 /* We try to avoid calling the Character methods all the time, in
1507 fact, they will only be called for non-standard things. */
1508 static __inline__ int
1509 is_identifier_start (int c)
1511 unsigned int ch = (unsigned)c;
1513 if ((ch - 0x41U) < 29U) /* A ... Z */
1514 return 1;
1515 if ((ch - 0x61U) < 29U) /* a ... z */
1516 return 1;
1517 if (ch == 0x5FU) /* _ */
1518 return 1;
1520 return character->isJavaIdentifierStart ((jchar) ch);
1523 static __inline__ int
1524 is_identifier_part (int c)
1526 unsigned int ch = (unsigned)c;
1528 if ((ch - 0x41U) < 29U) /* A ... Z */
1529 return 1;
1530 if ((ch - 0x61U) < 29U) /* a ... z */
1531 return 1;
1532 if ((ch - 0x30) < 10U) /* 0 .. 9 */
1533 return 1;
1534 if (ch == 0x5FU || ch == 0x24U) /* _ $ */
1535 return 1;
1537 return character->isJavaIdentifierStart ((jchar) ch);
1540 bool
1541 _Jv_VerifyIdentifier (_Jv_Utf8Const* name)
1543 unsigned char *ptr = (unsigned char*) name->data;
1544 unsigned char *limit = ptr + name->length;
1545 int ch;
1547 if ((ch = UTF8_GET (ptr, limit))==-1
1548 || ! is_identifier_start (ch))
1549 return false;
1551 while (ptr != limit)
1553 if ((ch = UTF8_GET (ptr, limit))==-1
1554 || ! is_identifier_part (ch))
1555 return false;
1557 return true;
1560 bool
1561 _Jv_VerifyClassName (unsigned char* ptr, _Jv_ushort length)
1563 unsigned char *limit = ptr+length;
1564 int ch;
1566 if ('[' == UTF8_PEEK (ptr, limit))
1568 unsigned char *end = _Jv_VerifyOne (++ptr, limit, false);
1569 // _Jv_VerifyOne must leave us looking at the terminating nul
1570 // byte.
1571 if (! end || *end)
1572 return false;
1573 else
1574 return true;
1577 next_level:
1578 for (;;) {
1579 if ((ch = UTF8_GET (ptr, limit))==-1)
1580 return false;
1581 if (! is_identifier_start (ch))
1582 return false;
1583 for (;;) {
1584 if (ptr == limit)
1585 return true;
1586 else if ((ch = UTF8_GET (ptr, limit))==-1)
1587 return false;
1588 else if (ch == '.')
1589 goto next_level;
1590 else if (! is_identifier_part (ch))
1591 return false;
1596 bool
1597 _Jv_VerifyClassName (_Jv_Utf8Const *name)
1599 return _Jv_VerifyClassName ((unsigned char*)&name->data[0],
1600 (_Jv_ushort) name->length);
1603 /* Returns true, if NAME1 and NAME2 represent classes in the same
1604 package. */
1605 bool
1606 _Jv_ClassNameSamePackage (_Jv_Utf8Const *name1, _Jv_Utf8Const *name2)
1608 unsigned char* ptr1 = (unsigned char*) name1->data;
1609 unsigned char* limit1 = ptr1 + name1->length;
1611 unsigned char* last1 = ptr1;
1613 // scan name1, and find the last occurrence of '.'
1614 while (ptr1 < limit1) {
1615 int ch1 = UTF8_GET (ptr1, limit1);
1617 if (ch1 == '.')
1618 last1 = ptr1;
1620 else if (ch1 == -1)
1621 return false;
1624 // Now the length of NAME1's package name is LEN.
1625 int len = last1 - (unsigned char*) name1->data;
1627 // If this is longer than NAME2, then we're off.
1628 if (len > name2->length)
1629 return false;
1631 // Then compare the first len bytes for equality.
1632 if (memcmp ((void*) name1->data, (void*) name2->data, len) == 0)
1634 // Check that there are no .'s after position LEN in NAME2.
1636 unsigned char* ptr2 = (unsigned char*) name2->data + len;
1637 unsigned char* limit2 =
1638 (unsigned char*) name2->data + name2->length;
1640 while (ptr2 < limit2)
1642 int ch2 = UTF8_GET (ptr2, limit2);
1643 if (ch2 == -1 || ch2 == '.')
1644 return false;
1646 return true;
1648 return false;