* ggc-common.c (ggc_rlimit_bound): Don't check RSS limit.
[official-gcc.git] / libjava / defineclass.cc
blob0648ad98287ad4b0871b7e59a3815e1e53884c99
1 // defineclass.cc - defining a class from .class format.
3 /* Copyright (C) 1999, 2000, 2001, 2002, 2003 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/IncompatibleClassChangeError.h>
39 #include <java/lang/reflect/Modifier.h>
41 using namespace gcj;
43 #ifdef INTERPRETER
45 // these go in some separate functions, to avoid having _Jv_InitClass
46 // inserted all over the place.
47 static void throw_internal_error (char *msg)
48 __attribute__ ((__noreturn__));
49 static void throw_no_class_def_found_error (jstring msg)
50 __attribute__ ((__noreturn__));
51 static void throw_no_class_def_found_error (char *msg)
52 __attribute__ ((__noreturn__));
53 static void throw_class_format_error (jstring msg)
54 __attribute__ ((__noreturn__));
55 static void throw_incompatible_class_change_error (jstring msg)
56 __attribute__ ((__noreturn__));
57 static void throw_class_circularity_error (jstring msg)
58 __attribute__ ((__noreturn__));
60 /**
61 * We define class reading using a class. It is practical, since then
62 * the entire class-reader can be a friend of class Class (it needs to
63 * write all it's different structures); but also because this makes it
64 * easy to make class definition reentrant, and thus two threads can be
65 * defining classes at the same time. This class (_Jv_ClassReader) is
66 * never exposed outside this file, so we don't have to worry about
67 * public or private members here.
70 struct _Jv_ClassReader {
72 // do verification? Currently, there is no option to disable this.
73 // This flag just controls the verificaiton done by the class loader;
74 // i.e., checking the integrity of the constant pool; and it is
75 // allways on. You always want this as far as I can see, but it also
76 // controls weither identifiers and type descriptors/signatures are
77 // verified as legal. This could be somewhat more expensive since it
78 // will call Character.isJavaIdentifier{Start,Part} for each character
79 // in any identifier (field name or method name) it comes by. Thus,
80 // it might be useful to turn off this verification for classes that
81 // come from a trusted source. However, for GCJ, trusted classes are
82 // most likely to be linked in.
84 bool verify;
86 // input data.
87 unsigned char *bytes;
88 int len;
90 // current input position
91 int pos;
93 // the constant pool data
94 int pool_count;
95 unsigned char *tags;
96 unsigned int *offsets;
98 // the class to define (see java-interp.h)
99 jclass def;
101 // the classes associated interpreter data.
102 _Jv_InterpClass *def_interp;
104 /* check that the given number of input bytes are available */
105 inline void check (int num)
107 if (pos + num > len)
108 throw_class_format_error ("Premature end of data");
111 /* skip a given number of bytes in input */
112 inline void skip (int num)
114 check (num);
115 pos += num;
118 /* read an unsignend 1-byte unit */
119 inline static jint get1u (unsigned char* bytes)
121 return bytes[0];
124 /* read an unsigned 1-byte unit */
125 inline jint read1u ()
127 skip (1);
128 return get1u (bytes+pos-1);
131 /* read an unsigned 2-byte unit */
132 inline static jint get2u (unsigned char *bytes)
134 return (((jint)bytes[0]) << 8) | ((jint)bytes[1]);
137 /* read an unsigned 2-byte unit */
138 inline jint read2u ()
140 skip (2);
141 return get2u (bytes+pos-2);
144 /* read a 4-byte unit */
145 static jint get4 (unsigned char *bytes)
147 return (((jint)bytes[0]) << 24)
148 | (((jint)bytes[1]) << 16)
149 | (((jint)bytes[2]) << 8)
150 | (((jint)bytes[3]) << 0);
153 /* read a 4-byte unit, (we don't do that quite so often) */
154 inline jint read4 ()
156 skip (4);
157 return get4 (bytes+pos-4);
160 /* read a 8-byte unit */
161 static jlong get8 (unsigned char* bytes)
163 return (((jlong)bytes[0]) << 56)
164 | (((jlong)bytes[1]) << 48)
165 | (((jlong)bytes[2]) << 40)
166 | (((jlong)bytes[3]) << 32)
167 | (((jlong)bytes[4]) << 24)
168 | (((jlong)bytes[5]) << 16)
169 | (((jlong)bytes[6]) << 8)
170 | (((jlong)bytes[7]) << 0);
173 /* read a 8-byte unit */
174 inline jlong read8 ()
176 skip (8);
177 return get8 (bytes+pos-8);
180 inline void check_tag (int index, char expected_tag)
182 if (index < 0
183 || index > pool_count
184 || tags[index] != expected_tag)
185 throw_class_format_error ("erroneous constant pool tag");
188 inline void verify_identifier (_Jv_Utf8Const* name)
190 if (! _Jv_VerifyIdentifier (name))
191 throw_class_format_error ("erroneous identifier");
194 inline void verify_classname (unsigned char* ptr, _Jv_ushort length)
196 if (! _Jv_VerifyClassName (ptr, length))
197 throw_class_format_error ("erroneous class name");
200 inline void verify_classname (_Jv_Utf8Const *name)
202 if (! _Jv_VerifyClassName (name))
203 throw_class_format_error ("erroneous class name");
206 inline void verify_field_signature (_Jv_Utf8Const *sig)
208 if (! _Jv_VerifyFieldSignature (sig))
209 throw_class_format_error ("erroneous type descriptor");
212 inline void verify_method_signature (_Jv_Utf8Const *sig)
214 if (! _Jv_VerifyMethodSignature (sig))
215 throw_class_format_error ("erroneous type descriptor");
218 _Jv_ClassReader (jclass klass, jbyteArray data, jint offset, jint length)
220 if (klass == 0 || length < 0 || offset+length > data->length)
221 throw_internal_error ("arguments to _Jv_DefineClass");
223 verify = true;
224 bytes = (unsigned char*) (elements (data)+offset);
225 len = length;
226 pos = 0;
227 def = klass;
228 def_interp = (_Jv_InterpClass *) def->aux_info;
231 /** and here goes the parser members defined out-of-line */
232 void parse ();
233 void read_constpool ();
234 void prepare_pool_entry (int index, unsigned char tag);
235 void read_fields ();
236 void read_methods ();
237 void read_one_class_attribute ();
238 void read_one_method_attribute (int method);
239 void read_one_code_attribute (int method);
240 void read_one_field_attribute (int field);
241 void throw_class_format_error (char *msg);
243 /** check an utf8 entry, without creating a Utf8Const object */
244 bool is_attribute_name (int index, char *name);
246 /** here goes the class-loader members defined out-of-line */
247 void handleConstantPool ();
248 void handleClassBegin (int, int, int);
249 void handleInterfacesBegin (int);
250 void handleInterface (int, int);
251 void handleFieldsBegin (int);
252 void handleField (int, int, int, int);
253 void handleFieldsEnd ();
254 void handleConstantValueAttribute (int,int);
255 void handleMethodsBegin (int);
256 void handleMethod (int, int, int, int);
257 void handleMethodsEnd ();
258 void handleCodeAttribute (int, int, int, int, int, int);
259 void handleExceptionTableEntry (int, int, int, int, int, int);
261 void checkExtends (jclass sub, jclass super);
262 void checkImplements (jclass sub, jclass super);
265 * FIXME: we should keep a hash table of utf8-strings, since many will
266 * be the same. It's a little tricky, however, because the hash table
267 * needs to interact gracefully with the garbage collector. Much
268 * memory is to be saved by this, however! perhaps the improvement
269 * could be implemented in prims.cc (_Jv_makeUtf8Const), since it
270 * computes the hash value anyway.
274 void
275 _Jv_DefineClass (jclass klass, jbyteArray data, jint offset, jint length)
277 _Jv_ClassReader reader (klass, data, offset, length);
278 reader.parse();
280 /* that's it! */
284 /** This section defines the parsing/scanning of the class data */
286 void
287 _Jv_ClassReader::parse ()
289 int magic = read4 ();
291 /* FIXME: Decide which range of version numbers to allow */
293 /* int minor_version = */ read2u ();
294 /* int major_verson = */ read2u ();
296 if (magic != (int) 0xCAFEBABE)
297 throw_class_format_error ("bad magic number");
299 pool_count = read2u ();
301 read_constpool ();
303 int access_flags = read2u ();
304 int this_class = read2u ();
305 int super_class = read2u ();
307 check_tag (this_class, JV_CONSTANT_Class);
308 if (super_class != 0)
309 check_tag (super_class, JV_CONSTANT_Class);
311 handleClassBegin (access_flags, this_class, super_class);
313 int interfaces_count = read2u ();
315 handleInterfacesBegin (interfaces_count);
317 for (int i = 0; i < interfaces_count; i++)
319 int iface = read2u ();
320 check_tag (iface, JV_CONSTANT_Class);
321 handleInterface (i, iface);
324 read_fields ();
325 read_methods ();
327 int attributes_count = read2u ();
329 for (int i = 0; i < attributes_count; i++)
331 read_one_class_attribute ();
334 if (pos != len)
335 throw_class_format_error ("unused data before end of file");
337 // tell everyone we're done.
338 def->state = JV_STATE_LOADED;
339 if (gcj::verbose_class_flag)
340 fprintf (stderr, "[Loaded (bytecode) %s]\n", (const char*)(def->name->data));
341 def->notifyAll ();
345 void _Jv_ClassReader::read_constpool ()
347 tags = (unsigned char*) _Jv_AllocBytes (pool_count);
348 offsets = (unsigned int *) _Jv_AllocBytes (sizeof (int)
349 * pool_count) ;
351 /** first, we scan the constant pool, collecting tags and offsets */
352 tags[0] = JV_CONSTANT_Undefined;
353 offsets[0] = pos;
354 for (int c = 1; c < pool_count; c++)
356 tags[c] = read1u ();
357 offsets[c] = pos;
359 switch (tags[c])
361 case JV_CONSTANT_String:
362 case JV_CONSTANT_Class:
363 skip (2);
364 break;
366 case JV_CONSTANT_Fieldref:
367 case JV_CONSTANT_Methodref:
368 case JV_CONSTANT_InterfaceMethodref:
369 case JV_CONSTANT_NameAndType:
370 case JV_CONSTANT_Integer:
371 case JV_CONSTANT_Float:
372 skip (4);
373 break;
375 case JV_CONSTANT_Double:
376 case JV_CONSTANT_Long:
377 skip (8);
378 tags[++c] = JV_CONSTANT_Undefined;
379 break;
381 case JV_CONSTANT_Utf8:
383 int len = read2u ();
384 skip (len);
386 break;
388 case JV_CONSTANT_Unicode:
389 throw_class_format_error ("unicode not supported");
390 break;
392 default:
393 throw_class_format_error ("erroneous constant pool tag");
397 handleConstantPool ();
401 void _Jv_ClassReader::read_fields ()
403 int fields_count = read2u ();
404 handleFieldsBegin (fields_count);
406 for (int i = 0; i < fields_count; i++)
408 int access_flags = read2u ();
409 int name_index = read2u ();
410 int descriptor_index = read2u ();
411 int attributes_count = read2u ();
413 check_tag (name_index, JV_CONSTANT_Utf8);
414 prepare_pool_entry (name_index, JV_CONSTANT_Utf8);
416 check_tag (descriptor_index, JV_CONSTANT_Utf8);
417 prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8);
419 handleField (i, access_flags, name_index, descriptor_index);
421 for (int j = 0; j < attributes_count; j++)
423 read_one_field_attribute (i);
427 handleFieldsEnd ();
430 bool
431 _Jv_ClassReader::is_attribute_name (int index, char *name)
433 check_tag (index, JV_CONSTANT_Utf8);
434 int len = get2u (bytes+offsets[index]);
435 if (len != (int) strlen (name))
436 return false;
437 else
438 return !memcmp (bytes+offsets[index]+2, name, len);
441 void _Jv_ClassReader::read_one_field_attribute (int field_index)
443 int name = read2u ();
444 int length = read4 ();
446 if (is_attribute_name (name, "ConstantValue"))
448 int cv = read2u ();
450 if (cv < pool_count
451 && cv > 0
452 && (tags[cv] == JV_CONSTANT_Integer
453 || tags[cv] == JV_CONSTANT_Float
454 || tags[cv] == JV_CONSTANT_Long
455 || tags[cv] == JV_CONSTANT_Double
456 || tags[cv] == JV_CONSTANT_String))
458 handleConstantValueAttribute (field_index, cv);
460 else
462 throw_class_format_error ("erroneous ConstantValue attribute");
465 if (length != 2)
466 throw_class_format_error ("erroneous ConstantValue attribute");
469 else
471 skip (length);
475 void _Jv_ClassReader::read_methods ()
477 int methods_count = read2u ();
479 handleMethodsBegin (methods_count);
481 for (int i = 0; i < methods_count; i++)
483 int access_flags = read2u ();
484 int name_index = read2u ();
485 int descriptor_index = read2u ();
486 int attributes_count = read2u ();
488 check_tag (name_index, JV_CONSTANT_Utf8);
489 prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8);
491 check_tag (name_index, JV_CONSTANT_Utf8);
492 prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8);
494 handleMethod (i, access_flags, name_index,
495 descriptor_index);
497 for (int j = 0; j < attributes_count; j++)
499 read_one_method_attribute (i);
503 handleMethodsEnd ();
506 void _Jv_ClassReader::read_one_method_attribute (int method_index)
508 int name = read2u ();
509 int length = read4 ();
511 if (is_attribute_name (name, "Exceptions"))
513 _Jv_Method *method = reinterpret_cast<_Jv_Method *>
514 (&def->methods[method_index]);
515 if (method->throws != NULL)
516 throw_class_format_error ("only one Exceptions attribute allowed per method");
518 int num_exceptions = read2u ();
519 // We use malloc here because the GC won't scan the method
520 // objects. FIXME this means a memory leak if we GC a class.
521 // (Currently we never do.)
522 _Jv_Utf8Const **exceptions =
523 (_Jv_Utf8Const **) _Jv_Malloc ((num_exceptions + 1) * sizeof (_Jv_Utf8Const *));
525 int out = 0;
526 _Jv_word *pool_data = def->constants.data;
527 for (int i = 0; i < num_exceptions; ++i)
531 int ndx = read2u ();
532 // JLS 2nd Ed. 4.7.5 requires that the tag not be 0.
533 if (ndx != 0)
535 check_tag (ndx, JV_CONSTANT_Class);
536 exceptions[out++] = pool_data[ndx].utf8;
539 catch (java::lang::Throwable *exc)
541 _Jv_Free (exceptions);
542 throw exc;
545 exceptions[out] = NULL;
546 method->throws = exceptions;
549 else if (is_attribute_name (name, "Code"))
551 int start_off = pos;
552 int max_stack = read2u ();
553 int max_locals = read2u ();
554 int code_length = read4 ();
556 int code_start = pos;
557 skip (code_length);
558 int exception_table_length = read2u ();
560 handleCodeAttribute (method_index,
561 max_stack, max_locals,
562 code_start, code_length,
563 exception_table_length);
566 for (int i = 0; i < exception_table_length; i++)
568 int start_pc = read2u ();
569 int end_pc = read2u ();
570 int handler_pc = read2u ();
571 int catch_type = read2u ();
573 if (start_pc > end_pc
574 || start_pc < 0
575 // END_PC can be equal to CODE_LENGTH.
576 // See JVM Spec 4.7.4.
577 || end_pc > code_length
578 || handler_pc >= code_length)
579 throw_class_format_error ("erroneous exception handler info");
581 if (! (tags[catch_type] == JV_CONSTANT_Class
582 || tags[catch_type] == 0))
584 throw_class_format_error ("erroneous exception handler info");
587 handleExceptionTableEntry (method_index,
589 start_pc,
590 end_pc,
591 handler_pc,
592 catch_type);
596 int attributes_count = read2u ();
598 for (int i = 0; i < attributes_count; i++)
600 read_one_code_attribute (method_index);
603 if ((pos - start_off) != length)
604 throw_class_format_error ("code attribute too short");
607 else
609 /* ignore unknown attributes */
610 skip (length);
614 void _Jv_ClassReader::read_one_code_attribute (int /*method*/)
616 /* ignore for now, ... later we may want to pick up
617 line number information, for debugging purposes;
618 in fact, the whole debugger issue is open! */
620 /* int name = */ read2u ();
621 int length = read4 ();
622 skip (length);
626 void _Jv_ClassReader::read_one_class_attribute ()
628 /* we also ignore the class attributes, ...
629 some day we'll add inner-classes support. */
631 /* int name = */ read2u ();
632 int length = read4 ();
633 skip (length);
639 /* this section defines the semantic actions of the parser */
641 void _Jv_ClassReader::handleConstantPool ()
643 /** now, we actually define the class' constant pool */
645 // the pool is scanned explicitly by the collector
646 jbyte *pool_tags = (jbyte*) _Jv_AllocBytes (pool_count);
647 _Jv_word *pool_data
648 = (_Jv_word*) _Jv_AllocBytes (pool_count * sizeof (_Jv_word));
650 def->constants.tags = pool_tags;
651 def->constants.data = pool_data;
652 def->constants.size = pool_count;
654 // Here we make a pass to collect the strings! We do this, because
655 // internally in the GCJ runtime, classes are encoded with .'s not /'s.
656 // Therefore, we first collect the strings, and then translate the rest
657 // of the utf8-entries (thus not representing strings) from /-notation
658 // to .-notation.
659 for (int i = 1; i < pool_count; i++)
661 if (tags[i] == JV_CONSTANT_String)
663 unsigned char* str_data = bytes + offsets [i];
664 int utf_index = get2u (str_data);
665 check_tag (utf_index, JV_CONSTANT_Utf8);
666 unsigned char *utf_data = bytes + offsets[utf_index];
667 int len = get2u (utf_data);
668 pool_data[i].utf8 = _Jv_makeUtf8Const ((char*)(utf_data+2), len);
669 pool_tags[i] = JV_CONSTANT_String;
671 else
673 pool_tags[i] = JV_CONSTANT_Undefined;
677 // and now, we scan everything else but strings & utf8-entries. This
678 // leaves out those utf8-entries which are not used; which will be left
679 // with a tag of JV_CONSTANT_Undefined in the class definition.
680 for (int index = 1; index < pool_count; index++)
682 switch (tags[index])
684 case JV_CONSTANT_Undefined:
685 case JV_CONSTANT_String:
686 case JV_CONSTANT_Utf8:
687 continue;
689 default:
690 prepare_pool_entry (index, tags[index]);
696 /* this is a recursive procedure, which will prepare pool entries as needed.
697 Which is how we avoid initializing those entries which go unused. */
698 void
699 _Jv_ClassReader::prepare_pool_entry (int index, unsigned char this_tag)
701 /* these two, pool_data and pool_tags, point into the class
702 structure we are currently defining */
704 unsigned char *pool_tags = (unsigned char*) def->constants.tags;
705 _Jv_word *pool_data = def->constants.data;
707 /* this entry was already prepared */
708 if (pool_tags[index] == this_tag)
709 return;
711 /* this_data points to the constant-pool information for the current
712 constant-pool entry */
714 unsigned char *this_data = bytes + offsets[index];
716 switch (this_tag)
718 case JV_CONSTANT_Utf8:
720 // If we came here, it is because some other tag needs this
721 // utf8-entry for type information! Thus, we translate /'s to .'s in
722 // order to accomondate gcj's internal representation.
724 int len = get2u (this_data);
725 char *buffer = (char*) __builtin_alloca (len);
726 char *s = ((char*) this_data)+2;
728 /* FIXME: avoid using a buffer here */
729 for (int i = 0; i < len; i++)
731 if (s[i] == '/')
732 buffer[i] = '.';
733 else
734 buffer[i] = (char) s[i];
737 pool_data[index].utf8 = _Jv_makeUtf8Const (buffer, len);
738 pool_tags[index] = JV_CONSTANT_Utf8;
740 break;
742 case JV_CONSTANT_Class:
744 int utf_index = get2u (this_data);
745 check_tag (utf_index, JV_CONSTANT_Utf8);
746 prepare_pool_entry (utf_index, JV_CONSTANT_Utf8);
748 if (verify)
749 verify_classname (pool_data[utf_index].utf8);
751 pool_data[index].utf8 = pool_data[utf_index].utf8;
752 pool_tags[index] = JV_CONSTANT_Class;
754 break;
756 case JV_CONSTANT_String:
757 // already handled before...
758 break;
760 case JV_CONSTANT_Fieldref:
761 case JV_CONSTANT_Methodref:
762 case JV_CONSTANT_InterfaceMethodref:
764 int class_index = get2u (this_data);
765 int nat_index = get2u (this_data+2);
767 check_tag (class_index, JV_CONSTANT_Class);
768 prepare_pool_entry (class_index, JV_CONSTANT_Class);
770 check_tag (nat_index, JV_CONSTANT_NameAndType);
771 prepare_pool_entry (nat_index, JV_CONSTANT_NameAndType);
773 // here, verify the signature and identifier name
774 if (verify)
776 _Jv_ushort name_index, type_index;
777 _Jv_loadIndexes (&pool_data[nat_index],
778 name_index, type_index);
780 if (this_tag == JV_CONSTANT_Fieldref)
781 verify_field_signature (pool_data[type_index].utf8);
782 else
783 verify_method_signature (pool_data[type_index].utf8);
785 _Jv_Utf8Const* name = pool_data[name_index].utf8;
787 if (this_tag != JV_CONSTANT_Fieldref
788 && ( _Jv_equalUtf8Consts (name, clinit_name)
789 || _Jv_equalUtf8Consts (name, init_name)))
790 /* ignore */;
791 else
792 verify_identifier (pool_data[name_index].utf8);
795 _Jv_storeIndexes (&pool_data[index], class_index, nat_index);
796 pool_tags[index] = this_tag;
798 break;
800 case JV_CONSTANT_NameAndType:
802 _Jv_ushort name_index = get2u (this_data);
803 _Jv_ushort type_index = get2u (this_data+2);
805 check_tag (name_index, JV_CONSTANT_Utf8);
806 prepare_pool_entry (name_index, JV_CONSTANT_Utf8);
808 check_tag (type_index, JV_CONSTANT_Utf8);
809 prepare_pool_entry (type_index, JV_CONSTANT_Utf8);
811 _Jv_storeIndexes (&pool_data[index], name_index, type_index);
812 pool_tags[index] = JV_CONSTANT_NameAndType;
814 break;
816 case JV_CONSTANT_Float:
818 jfloat f = java::lang::Float::intBitsToFloat ((jint) get4 (this_data));
819 _Jv_storeFloat (&pool_data[index], f);
820 pool_tags[index] = JV_CONSTANT_Float;
822 break;
824 case JV_CONSTANT_Integer:
826 int i = get4 (this_data);
827 _Jv_storeInt (&pool_data[index], i);
828 pool_tags[index] = JV_CONSTANT_Integer;
830 break;
832 case JV_CONSTANT_Double:
834 jdouble d
835 = java::lang::Double::longBitsToDouble ((jlong) get8 (this_data));
836 _Jv_storeDouble (&pool_data[index], d);
837 pool_tags[index] = JV_CONSTANT_Double;
839 break;
841 case JV_CONSTANT_Long:
843 jlong i = get8 (this_data);
844 _Jv_storeLong (&pool_data[index], i);
845 pool_tags[index] = JV_CONSTANT_Long;
847 break;
849 default:
850 throw_class_format_error ("erroneous constant pool tag");
855 void
856 _Jv_ClassReader::handleClassBegin
857 (int access_flags, int this_class, int super_class)
859 using namespace java::lang::reflect;
861 unsigned char *pool_tags = (unsigned char*) def->constants.tags;
862 _Jv_word *pool_data = def->constants.data;
864 check_tag (this_class, JV_CONSTANT_Class);
865 _Jv_Utf8Const *loadedName = pool_data[this_class].utf8;
867 // was ClassLoader.defineClass called with an expected class name?
868 if (def->name == 0)
870 jclass orig = _Jv_FindClassInCache (loadedName, def->loader);
872 if (orig == 0)
874 def->name = loadedName;
876 else
878 jstring msg = JvNewStringUTF ("anonymous "
879 "class data denotes "
880 "existing class ");
881 msg = msg->concat (orig->getName ());
883 throw_no_class_def_found_error (msg);
887 // assert that the loaded class has the expected name, 5.3.5
888 else if (! _Jv_equalUtf8Consts (loadedName, def->name))
890 jstring msg = JvNewStringUTF ("loaded class ");
891 msg = msg->concat (def->getName ());
892 msg = msg->concat (_Jv_NewStringUTF (" was in fact named "));
893 jstring klass_name = _Jv_NewStringUTF (loadedName->data);
894 msg = msg->concat (klass_name);
896 throw_no_class_def_found_error (msg);
899 def->accflags = access_flags | java::lang::reflect::Modifier::INTERPRETED;
900 pool_data[this_class].clazz = def;
901 pool_tags[this_class] = JV_CONSTANT_ResolvedClass;
903 if (super_class == 0 && ! (access_flags & Modifier::INTERFACE))
905 // FIXME: Consider this carefully!
906 if (! _Jv_equalUtf8Consts (def->name, java::lang::Object::class$.name))
907 throw_no_class_def_found_error ("loading java.lang.Object");
910 // In the pre-loading state, it can be looked up in the
911 // cache only by this thread! This allows the super-class
912 // to include references to this class.
914 def->state = JV_STATE_PRELOADING;
917 JvSynchronize sync (&java::lang::Class::class$);
918 _Jv_RegisterClass (def);
921 if (super_class != 0)
923 // Load the superclass.
924 check_tag (super_class, JV_CONSTANT_Class);
925 _Jv_Utf8Const* super_name = pool_data[super_class].utf8;
927 // Load the superclass using our defining loader.
928 jclass the_super = _Jv_FindClass (super_name,
929 def->loader);
931 // This will establish that we are allowed to be a subclass,
932 // and check for class circularity error.
933 checkExtends (def, the_super);
935 // Note: for an interface we will find Object as the
936 // superclass. We still check it above to ensure class file
937 // validity, but we simply assign `null' to the actual field in
938 // this case.
939 def->superclass = (((access_flags & Modifier::INTERFACE))
940 ? NULL : the_super);
941 pool_data[super_class].clazz = the_super;
942 pool_tags[super_class] = JV_CONSTANT_ResolvedClass;
945 // Now we've come past the circularity problem, we can
946 // now say that we're loading.
948 def->state = JV_STATE_LOADING;
949 def->notifyAll ();
952 ///// implements the checks described in sect. 5.3.5.3
953 void
954 _Jv_ClassReader::checkExtends (jclass sub, jclass super)
956 using namespace java::lang::reflect;
958 // having an interface or a final class as a superclass is no good
959 if ((super->accflags & (Modifier::INTERFACE | Modifier::FINAL)) != 0)
961 throw_incompatible_class_change_error (sub->getName ());
964 // if the super class is not public, we need to check some more
965 if ((super->accflags & Modifier::PUBLIC) == 0)
967 // With package scope, the classes must have the same
968 // class loader.
969 if ( sub->loader != super->loader
970 || !_Jv_ClassNameSamePackage (sub->name, super->name))
972 throw_incompatible_class_change_error (sub->getName ());
976 for (; super != 0; super = super->superclass)
978 if (super == sub)
979 throw_class_circularity_error (sub->getName ());
985 void _Jv_ClassReader::handleInterfacesBegin (int count)
987 def->interfaces = (jclass*) _Jv_AllocBytes (count*sizeof (jclass));
988 def->interface_count = count;
991 void _Jv_ClassReader::handleInterface (int if_number, int offset)
993 _Jv_word * pool_data = def->constants.data;
994 unsigned char * pool_tags = (unsigned char*) def->constants.tags;
996 jclass the_interface;
998 if (pool_tags[offset] == JV_CONSTANT_Class)
1000 _Jv_Utf8Const* name = pool_data[offset].utf8;
1001 the_interface = _Jv_FindClass (name, def->loader);
1003 else if (pool_tags[offset] == JV_CONSTANT_ResolvedClass)
1005 the_interface = pool_data[offset].clazz;
1007 else
1009 throw_no_class_def_found_error ("erroneous constant pool tag");
1012 // checks the validity of the_interface, and that we are in fact
1013 // allowed to implement that interface.
1014 checkImplements (def, the_interface);
1016 pool_data[offset].clazz = the_interface;
1017 pool_tags[offset] = JV_CONSTANT_ResolvedClass;
1019 def->interfaces[if_number] = the_interface;
1022 void
1023 _Jv_ClassReader::checkImplements (jclass sub, jclass super)
1025 using namespace java::lang::reflect;
1027 // well, it *must* be an interface
1028 if ((super->accflags & Modifier::INTERFACE) == 0)
1030 throw_incompatible_class_change_error (sub->getName ());
1033 // if it has package scope, it must also be defined by the
1034 // same loader.
1035 if ((super->accflags & Modifier::PUBLIC) == 0)
1037 if ( sub->loader != super->loader
1038 || !_Jv_ClassNameSamePackage (sub->name, super->name))
1040 throw_incompatible_class_change_error (sub->getName ());
1044 // FIXME: add interface circularity check here
1045 if (sub == super)
1047 throw_class_circularity_error (sub->getName ());
1051 void _Jv_ClassReader::handleFieldsBegin (int count)
1053 def->fields = (_Jv_Field*)
1054 _Jv_AllocBytes (count * sizeof (_Jv_Field));
1055 def->field_count = count;
1056 def_interp->field_initializers = (_Jv_ushort*)
1057 _Jv_AllocBytes (count * sizeof (_Jv_ushort));
1058 for (int i = 0; i < count; i++)
1059 def_interp->field_initializers[i] = (_Jv_ushort) 0;
1062 void _Jv_ClassReader::handleField (int field_no,
1063 int flags,
1064 int name,
1065 int desc)
1067 using namespace java::lang::reflect;
1069 _Jv_word *pool_data = def->constants.data;
1071 _Jv_Field *field = &def->fields[field_no];
1072 _Jv_Utf8Const *field_name = pool_data[name].utf8;
1074 #ifndef COMPACT_FIELDS
1075 field->name = field_name;
1076 #else
1077 field->nameIndex = name;
1078 #endif
1080 // Ignore flags we don't know about.
1081 field->flags = flags & Modifier::ALL_FLAGS;
1083 _Jv_Utf8Const* sig = pool_data[desc].utf8;
1085 if (verify)
1087 verify_identifier (field_name);
1089 for (int i = 0; i < field_no; ++i)
1091 if (_Jv_equalUtf8Consts (field_name, def->fields[i].name)
1092 && _Jv_equalUtf8Consts (sig,
1093 // We know the other fields are
1094 // unresolved.
1095 (_Jv_Utf8Const *) def->fields[i].type))
1096 throw_class_format_error ("duplicate field name");
1099 if (field->flags & (Modifier::SYNCHRONIZED
1100 | Modifier::NATIVE
1101 | Modifier::INTERFACE
1102 | Modifier::ABSTRACT))
1103 throw_class_format_error ("erroneous field access flags");
1105 if (1 < ( ((field->flags & Modifier::PUBLIC) ? 1 : 0)
1106 +((field->flags & Modifier::PRIVATE) ? 1 : 0)
1107 +((field->flags & Modifier::PROTECTED) ? 1 : 0)))
1108 throw_class_format_error ("erroneous field access flags");
1111 if (verify)
1112 verify_field_signature (sig);
1114 // field->type is really a jclass, but while it is still
1115 // unresolved we keep an _Jv_Utf8Const* instead.
1116 field->type = (jclass) sig;
1117 field->flags |= _Jv_FIELD_UNRESOLVED_FLAG;
1118 field->u.boffset = 0;
1122 void _Jv_ClassReader::handleConstantValueAttribute (int field_index,
1123 int value)
1125 using namespace java::lang::reflect;
1127 _Jv_Field *field = &def->fields[field_index];
1129 if ((field->flags & (Modifier::STATIC
1130 | Modifier::FINAL
1131 | Modifier::PRIVATE)) == 0)
1133 // Ignore, as per vmspec #4.7.2
1134 return;
1137 // do not allow multiple constant fields!
1138 if (field->flags & _Jv_FIELD_CONSTANT_VALUE)
1139 throw_class_format_error ("field has multiple ConstantValue attributes");
1141 field->flags |= _Jv_FIELD_CONSTANT_VALUE;
1142 def_interp->field_initializers[field_index] = value;
1144 /* type check the initializer */
1146 if (value <= 0 || value >= pool_count)
1147 throw_class_format_error ("erroneous ConstantValue attribute");
1149 /* FIXME: do the rest */
1152 void _Jv_ClassReader::handleFieldsEnd ()
1154 using namespace java::lang::reflect;
1156 // We need to reorganize the fields so that the static ones are first,
1157 // to conform to GCJ class layout.
1159 int low = 0;
1160 int high = def->field_count-1;
1161 _Jv_Field *fields = def->fields;
1162 _Jv_ushort *inits = def_interp->field_initializers;
1164 // this is kind of a raw version of quicksort.
1165 while (low < high)
1167 // go forward on low, while it's a static
1168 while (low < high && (fields[low].flags & Modifier::STATIC) != 0)
1169 low++;
1171 // go backwards on high, while it's a non-static
1172 while (low < high && (fields[high].flags & Modifier::STATIC) == 0)
1173 high--;
1175 if (low==high)
1176 break;
1178 _Jv_Field tmp = fields[low];
1179 _Jv_ushort itmp = inits[low];
1181 fields[low] = fields[high];
1182 inits[low] = inits[high];
1184 fields[high] = tmp;
1185 inits[high] = itmp;
1187 high -= 1;
1188 low += 1;
1191 if ((fields[low].flags & Modifier::STATIC) != 0)
1192 low += 1;
1194 def->static_field_count = low;
1199 void
1200 _Jv_ClassReader::handleMethodsBegin (int count)
1202 def->methods = (_Jv_Method *) _Jv_AllocBytes (sizeof (_Jv_Method) * count);
1204 def_interp->interpreted_methods
1205 = (_Jv_MethodBase **) _Jv_AllocBytes (sizeof (_Jv_MethodBase *)
1206 * count);
1208 for (int i = 0; i < count; i++)
1210 def_interp->interpreted_methods[i] = 0;
1211 def->methods[i].index = (_Jv_ushort) -1;
1214 def->method_count = count;
1218 void _Jv_ClassReader::handleMethod
1219 (int mth_index, int accflags, int name, int desc)
1221 using namespace java::lang::reflect;
1223 _Jv_word *pool_data = def->constants.data;
1224 _Jv_Method *method = &def->methods[mth_index];
1226 check_tag (name, JV_CONSTANT_Utf8);
1227 prepare_pool_entry (name, JV_CONSTANT_Utf8);
1228 method->name = pool_data[name].utf8;
1230 check_tag (desc, JV_CONSTANT_Utf8);
1231 prepare_pool_entry (desc, JV_CONSTANT_Utf8);
1232 method->signature = pool_data[desc].utf8;
1234 // ignore unknown flags
1235 method->accflags = accflags & Modifier::ALL_FLAGS;
1237 // intialize...
1238 method->ncode = 0;
1239 method->throws = NULL;
1241 if (verify)
1243 if (_Jv_equalUtf8Consts (method->name, clinit_name)
1244 || _Jv_equalUtf8Consts (method->name, init_name))
1245 /* ignore */;
1246 else
1247 verify_identifier (method->name);
1249 verify_method_signature (method->signature);
1251 for (int i = 0; i < mth_index; ++i)
1253 if (_Jv_equalUtf8Consts (method->name, def->methods[i].name)
1254 && _Jv_equalUtf8Consts (method->signature,
1255 def->methods[i].signature))
1256 throw_class_format_error ("duplicate method");
1259 if (method->accflags & (Modifier::VOLATILE
1260 | Modifier::TRANSIENT
1261 | Modifier::INTERFACE))
1262 throw_class_format_error ("erroneous method access flags");
1264 if (1 < ( ((method->accflags & Modifier::PUBLIC) ? 1 : 0)
1265 +((method->accflags & Modifier::PRIVATE) ? 1 : 0)
1266 +((method->accflags & Modifier::PROTECTED) ? 1 : 0)))
1267 throw_class_format_error ("erroneous method access flags");
1271 void _Jv_ClassReader::handleCodeAttribute
1272 (int method_index, int max_stack, int max_locals,
1273 int code_start, int code_length, int exc_table_length)
1275 int size = _Jv_InterpMethod::size (exc_table_length, code_length);
1276 _Jv_InterpMethod *method =
1277 (_Jv_InterpMethod*) (_Jv_AllocBytes (size));
1279 method->deferred = NULL;
1280 method->max_stack = max_stack;
1281 method->max_locals = max_locals;
1282 method->code_length = code_length;
1283 method->exc_count = exc_table_length;
1284 method->defining_class = def;
1285 method->self = &def->methods[method_index];
1286 method->prepared = NULL;
1288 // grab the byte code!
1289 memcpy ((void*) method->bytecode (),
1290 (void*) (bytes+code_start),
1291 code_length);
1293 def_interp->interpreted_methods[method_index] = method;
1295 if ((method->self->accflags & java::lang::reflect::Modifier::STATIC))
1297 // Precompute the ncode field for a static method. This lets us
1298 // call a static method of an interpreted class from precompiled
1299 // code without first resolving the class (that will happen
1300 // during class initialization instead).
1301 method->self->ncode = method->ncode ();
1305 void _Jv_ClassReader::handleExceptionTableEntry
1306 (int method_index, int exc_index,
1307 int start_pc, int end_pc, int handler_pc, int catch_type)
1309 _Jv_InterpMethod *method = reinterpret_cast<_Jv_InterpMethod *>
1310 (def_interp->interpreted_methods[method_index]);
1311 _Jv_InterpException *exc = method->exceptions ();
1313 exc[exc_index].start_pc.i = start_pc;
1314 exc[exc_index].end_pc.i = end_pc;
1315 exc[exc_index].handler_pc.i = handler_pc;
1316 exc[exc_index].handler_type.i = catch_type;
1319 void _Jv_ClassReader::handleMethodsEnd ()
1321 using namespace java::lang::reflect;
1323 for (int i = 0; i < def->method_count; i++)
1325 _Jv_Method *method = &def->methods[i];
1326 if ((method->accflags & Modifier::NATIVE) != 0)
1328 if (def_interp->interpreted_methods[i] != 0)
1329 throw_class_format_error ("code provided for native method");
1330 else
1332 _Jv_JNIMethod *m = (_Jv_JNIMethod *)
1333 _Jv_AllocBytes (sizeof (_Jv_JNIMethod));
1334 m->defining_class = def;
1335 m->self = method;
1336 m->function = NULL;
1337 def_interp->interpreted_methods[i] = m;
1338 m->deferred = NULL;
1340 if ((method->accflags & Modifier::STATIC))
1342 // Precompute the ncode field for a static method.
1343 // This lets us call a static method of an
1344 // interpreted class from precompiled code without
1345 // first resolving the class (that will happen
1346 // during class initialization instead).
1347 method->ncode = m->ncode ();
1351 else if ((method->accflags & Modifier::ABSTRACT) != 0)
1353 if (def_interp->interpreted_methods[i] != 0)
1354 throw_class_format_error ("code provided for abstract method");
1356 else
1358 if (def_interp->interpreted_methods[i] == 0)
1359 throw_class_format_error ("method with no code");
1364 void _Jv_ClassReader::throw_class_format_error (char *msg)
1366 jstring str;
1367 if (def->name != NULL)
1369 jsize mlen = strlen (msg);
1370 unsigned char* data = (unsigned char*) def->name->data;
1371 int ulen = def->name->length;
1372 unsigned char* limit = data + ulen;
1373 jsize nlen = _Jv_strLengthUtf8 ((char *) data, ulen);
1374 jsize len = nlen + mlen + 3;
1375 str = JvAllocString(len);
1376 jchar *chrs = JvGetStringChars(str);
1377 while (data < limit)
1378 *chrs++ = UTF8_GET(data, limit);
1379 *chrs++ = ' ';
1380 *chrs++ = '(';
1381 for (;;)
1383 char c = *msg++;
1384 if (c == 0)
1385 break;
1386 *chrs++ = c & 0xFFFF;
1388 *chrs++ = ')';
1390 else
1391 str = JvNewStringLatin1 (msg);
1392 ::throw_class_format_error (str);
1395 /** Here we define the exceptions that can be thrown */
1397 static void
1398 throw_no_class_def_found_error (jstring msg)
1400 throw (msg
1401 ? new java::lang::NoClassDefFoundError (msg)
1402 : new java::lang::NoClassDefFoundError);
1405 static void
1406 throw_no_class_def_found_error (char *msg)
1408 throw_no_class_def_found_error (JvNewStringLatin1 (msg));
1411 static void
1412 throw_class_format_error (jstring msg)
1414 throw (msg
1415 ? new java::lang::ClassFormatError (msg)
1416 : new java::lang::ClassFormatError);
1419 static void
1420 throw_internal_error (char *msg)
1422 throw new java::lang::InternalError (JvNewStringLatin1 (msg));
1425 static void
1426 throw_incompatible_class_change_error (jstring msg)
1428 throw new java::lang::IncompatibleClassChangeError (msg);
1431 static void
1432 throw_class_circularity_error (jstring msg)
1434 throw new java::lang::ClassCircularityError (msg);
1437 #endif /* INTERPRETER */
1441 /** This section takes care of verifying integrity of identifiers,
1442 signatures, field ddescriptors, and class names */
1444 #define UTF8_PEEK(PTR, LIMIT) \
1445 ({ unsigned char* xxkeep = (PTR); \
1446 int xxch = UTF8_GET(PTR,LIMIT); \
1447 PTR = xxkeep; xxch; })
1449 /* Verify one element of a type descriptor or signature. */
1450 static unsigned char*
1451 _Jv_VerifyOne (unsigned char* ptr, unsigned char* limit, bool void_ok)
1453 if (ptr >= limit)
1454 return 0;
1456 int ch = UTF8_GET (ptr, limit);
1458 switch (ch)
1460 case 'V':
1461 if (! void_ok)
1462 return 0;
1464 case 'S': case 'B': case 'I': case 'J':
1465 case 'Z': case 'C': case 'F': case 'D':
1466 break;
1468 case 'L':
1470 unsigned char *start = ptr, *end;
1473 if (ptr > limit)
1474 return 0;
1476 end = ptr;
1478 if ((ch = UTF8_GET (ptr, limit)) == -1)
1479 return 0;
1482 while (ch != ';');
1483 if (! _Jv_VerifyClassName (start, (unsigned short) (end-start)))
1484 return 0;
1486 break;
1488 case '[':
1489 return _Jv_VerifyOne (ptr, limit, false);
1490 break;
1492 default:
1493 return 0;
1496 return ptr;
1499 /* Verification and loading procedures. */
1500 bool
1501 _Jv_VerifyFieldSignature (_Jv_Utf8Const*sig)
1503 unsigned char* ptr = (unsigned char*) sig->data;
1504 unsigned char* limit = ptr + sig->length;
1506 ptr = _Jv_VerifyOne (ptr, limit, false);
1508 return ptr == limit;
1511 bool
1512 _Jv_VerifyMethodSignature (_Jv_Utf8Const*sig)
1514 unsigned char* ptr = (unsigned char*) sig->data;
1515 unsigned char* limit = ptr + sig->length;
1517 if (ptr == limit || UTF8_GET(ptr,limit) != '(')
1518 return false;
1520 while (ptr && UTF8_PEEK (ptr, limit) != ')')
1521 ptr = _Jv_VerifyOne (ptr, limit, false);
1523 if (UTF8_GET (ptr, limit) != ')')
1524 return false;
1526 // get the return type
1527 ptr = _Jv_VerifyOne (ptr, limit, true);
1529 return ptr == limit;
1532 /* We try to avoid calling the Character methods all the time, in
1533 fact, they will only be called for non-standard things. */
1534 static __inline__ int
1535 is_identifier_start (int c)
1537 unsigned int ch = (unsigned)c;
1539 if ((ch - 0x41U) < 29U) /* A ... Z */
1540 return 1;
1541 if ((ch - 0x61U) < 29U) /* a ... z */
1542 return 1;
1543 if (ch == 0x5FU) /* _ */
1544 return 1;
1546 return java::lang::Character::isJavaIdentifierStart ((jchar) ch);
1549 static __inline__ int
1550 is_identifier_part (int c)
1552 unsigned int ch = (unsigned)c;
1554 if ((ch - 0x41U) < 29U) /* A ... Z */
1555 return 1;
1556 if ((ch - 0x61U) < 29U) /* a ... z */
1557 return 1;
1558 if ((ch - 0x30) < 10U) /* 0 .. 9 */
1559 return 1;
1560 if (ch == 0x5FU || ch == 0x24U) /* _ $ */
1561 return 1;
1563 return java::lang::Character::isJavaIdentifierStart ((jchar) ch);
1566 bool
1567 _Jv_VerifyIdentifier (_Jv_Utf8Const* name)
1569 unsigned char *ptr = (unsigned char*) name->data;
1570 unsigned char *limit = ptr + name->length;
1571 int ch;
1573 if ((ch = UTF8_GET (ptr, limit))==-1
1574 || ! is_identifier_start (ch))
1575 return false;
1577 while (ptr != limit)
1579 if ((ch = UTF8_GET (ptr, limit))==-1
1580 || ! is_identifier_part (ch))
1581 return false;
1583 return true;
1586 bool
1587 _Jv_VerifyClassName (unsigned char* ptr, _Jv_ushort length)
1589 unsigned char *limit = ptr+length;
1590 int ch;
1592 if ('[' == UTF8_PEEK (ptr, limit))
1594 unsigned char *end = _Jv_VerifyOne (++ptr, limit, false);
1595 // _Jv_VerifyOne must leave us looking at the terminating nul
1596 // byte.
1597 if (! end || *end)
1598 return false;
1599 else
1600 return true;
1603 next_level:
1604 for (;;) {
1605 if ((ch = UTF8_GET (ptr, limit))==-1)
1606 return false;
1607 if (! is_identifier_start (ch))
1608 return false;
1609 for (;;) {
1610 if (ptr == limit)
1611 return true;
1612 else if ((ch = UTF8_GET (ptr, limit))==-1)
1613 return false;
1614 else if (ch == '.')
1615 goto next_level;
1616 else if (! is_identifier_part (ch))
1617 return false;
1622 bool
1623 _Jv_VerifyClassName (_Jv_Utf8Const *name)
1625 return _Jv_VerifyClassName ((unsigned char*)&name->data[0],
1626 (_Jv_ushort) name->length);
1629 /* Returns true, if NAME1 and NAME2 represent classes in the same
1630 package. */
1631 bool
1632 _Jv_ClassNameSamePackage (_Jv_Utf8Const *name1, _Jv_Utf8Const *name2)
1634 unsigned char* ptr1 = (unsigned char*) name1->data;
1635 unsigned char* limit1 = ptr1 + name1->length;
1637 unsigned char* last1 = ptr1;
1639 // scan name1, and find the last occurrence of '.'
1640 while (ptr1 < limit1) {
1641 int ch1 = UTF8_GET (ptr1, limit1);
1643 if (ch1 == '.')
1644 last1 = ptr1;
1646 else if (ch1 == -1)
1647 return false;
1650 // Now the length of NAME1's package name is LEN.
1651 int len = last1 - (unsigned char*) name1->data;
1653 // If this is longer than NAME2, then we're off.
1654 if (len > name2->length)
1655 return false;
1657 // Then compare the first len bytes for equality.
1658 if (memcmp ((void*) name1->data, (void*) name2->data, len) == 0)
1660 // Check that there are no .'s after position LEN in NAME2.
1662 unsigned char* ptr2 = (unsigned char*) name2->data + len;
1663 unsigned char* limit2 =
1664 (unsigned char*) name2->data + name2->length;
1666 while (ptr2 < limit2)
1668 int ch2 = UTF8_GET (ptr2, limit2);
1669 if (ch2 == -1 || ch2 == '.')
1670 return false;
1672 return true;
1674 return false;