1 // defineclass.cc - defining a class from .class format.
3 /* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 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>
27 #include <java-cpool.h>
29 #include <execution.h>
31 #include <java/lang/Class.h>
32 #include <java/lang/Float.h>
33 #include <java/lang/Double.h>
34 #include <java/lang/Character.h>
35 #include <java/lang/LinkageError.h>
36 #include <java/lang/InternalError.h>
37 #include <java/lang/ClassFormatError.h>
38 #include <java/lang/NoClassDefFoundError.h>
39 #include <java/lang/ClassCircularityError.h>
40 #include <java/lang/IncompatibleClassChangeError.h>
41 #include <java/lang/reflect/Modifier.h>
42 #include <java/security/ProtectionDomain.h>
48 // these go in some separate functions, to avoid having _Jv_InitClass
49 // inserted all over the place.
50 static void throw_internal_error (char *msg
)
51 __attribute__ ((__noreturn__
));
52 static void throw_no_class_def_found_error (jstring msg
)
53 __attribute__ ((__noreturn__
));
54 static void throw_no_class_def_found_error (char *msg
)
55 __attribute__ ((__noreturn__
));
56 static void throw_class_format_error (jstring msg
)
57 __attribute__ ((__noreturn__
));
58 static void throw_incompatible_class_change_error (jstring msg
)
59 __attribute__ ((__noreturn__
));
60 static void throw_class_circularity_error (jstring msg
)
61 __attribute__ ((__noreturn__
));
64 * We define class reading using a class. It is practical, since then
65 * the entire class-reader can be a friend of class Class (it needs to
66 * write all it's different structures); but also because this makes it
67 * easy to make class definition reentrant, and thus two threads can be
68 * defining classes at the same time. This class (_Jv_ClassReader) is
69 * never exposed outside this file, so we don't have to worry about
70 * public or private members here.
73 struct _Jv_ClassReader
76 // do verification? Currently, there is no option to disable this.
77 // This flag just controls the verificaiton done by the class loader;
78 // i.e., checking the integrity of the constant pool; and it is
79 // allways on. You always want this as far as I can see, but it also
80 // controls weither identifiers and type descriptors/signatures are
81 // verified as legal. This could be somewhat more expensive since it
82 // will call Character.isJavaIdentifier{Start,Part} for each character
83 // in any identifier (field name or method name) it comes by. Thus,
84 // it might be useful to turn off this verification for classes that
85 // come from a trusted source. However, for GCJ, trusted classes are
86 // most likely to be linked in.
94 // current input position
97 // the constant pool data
100 unsigned int *offsets
;
102 // the class to define (see java-interp.h)
105 // the classes associated interpreter data.
106 _Jv_InterpClass
*def_interp
;
108 // The name we found.
109 _Jv_Utf8Const
**found_name
;
111 // True if this is a 1.5 class file.
115 /* check that the given number of input bytes are available */
116 inline void check (int num
)
119 throw_class_format_error ("Premature end of data");
122 /* skip a given number of bytes in input */
123 inline void skip (int num
)
129 /* read an unsignend 1-byte unit */
130 inline static jint
get1u (unsigned char* bytes
)
135 /* read an unsigned 1-byte unit */
136 inline jint
read1u ()
139 return get1u (bytes
+pos
-1);
142 /* read an unsigned 2-byte unit */
143 inline static jint
get2u (unsigned char *bytes
)
145 return (((jint
)bytes
[0]) << 8) | ((jint
)bytes
[1]);
148 /* read an unsigned 2-byte unit */
149 inline jint
read2u ()
152 return get2u (bytes
+pos
-2);
155 /* read a 4-byte unit */
156 static jint
get4 (unsigned char *bytes
)
158 return (((jint
)bytes
[0]) << 24)
159 | (((jint
)bytes
[1]) << 16)
160 | (((jint
)bytes
[2]) << 8)
161 | (((jint
)bytes
[3]) << 0);
164 /* read a 4-byte unit, (we don't do that quite so often) */
168 return get4 (bytes
+pos
-4);
171 /* read a 8-byte unit */
172 static jlong
get8 (unsigned char* bytes
)
174 return (((jlong
)bytes
[0]) << 56)
175 | (((jlong
)bytes
[1]) << 48)
176 | (((jlong
)bytes
[2]) << 40)
177 | (((jlong
)bytes
[3]) << 32)
178 | (((jlong
)bytes
[4]) << 24)
179 | (((jlong
)bytes
[5]) << 16)
180 | (((jlong
)bytes
[6]) << 8)
181 | (((jlong
)bytes
[7]) << 0);
184 /* read a 8-byte unit */
185 inline jlong
read8 ()
188 return get8 (bytes
+pos
-8);
191 inline void check_tag (int index
, char expected_tag
)
194 || index
> pool_count
195 || tags
[index
] != expected_tag
)
196 throw_class_format_error ("erroneous constant pool tag");
199 inline void verify_identifier (_Jv_Utf8Const
* name
)
201 if (! _Jv_VerifyIdentifier (name
))
202 throw_class_format_error ("erroneous identifier");
205 inline void verify_classname (unsigned char* ptr
, _Jv_ushort length
)
207 if (! _Jv_VerifyClassName (ptr
, length
))
208 throw_class_format_error ("erroneous class name");
211 inline void verify_classname (_Jv_Utf8Const
*name
)
213 if (! _Jv_VerifyClassName (name
))
214 throw_class_format_error ("erroneous class name");
217 inline void verify_field_signature (_Jv_Utf8Const
*sig
)
219 if (! _Jv_VerifyFieldSignature (sig
))
220 throw_class_format_error ("erroneous type descriptor");
223 inline void verify_method_signature (_Jv_Utf8Const
*sig
)
225 if (! _Jv_VerifyMethodSignature (sig
))
226 throw_class_format_error ("erroneous type descriptor");
229 _Jv_ClassReader (jclass klass
, jbyteArray data
, jint offset
, jint length
,
230 java::security::ProtectionDomain
*pd
,
231 _Jv_Utf8Const
**name_result
)
233 if (klass
== 0 || length
< 0 || offset
+length
> data
->length
)
234 throw_internal_error ("arguments to _Jv_DefineClass");
237 bytes
= (unsigned char*) (elements (data
)+offset
);
243 found_name
= name_result
;
245 def
->size_in_bytes
= -1;
246 def
->vtable_method_count
= -1;
247 def
->engine
= &_Jv_soleInterpreterEngine
;
248 def
->protectionDomain
= pd
;
251 /** and here goes the parser members defined out-of-line */
253 void read_constpool ();
254 void prepare_pool_entry (int index
, unsigned char tag
);
256 void read_methods ();
257 void read_one_class_attribute ();
258 void read_one_method_attribute (int method
);
259 void read_one_code_attribute (int method
);
260 void read_one_field_attribute (int field
);
261 void throw_class_format_error (char *msg
);
263 /** check an utf8 entry, without creating a Utf8Const object */
264 bool is_attribute_name (int index
, char *name
);
266 /** here goes the class-loader members defined out-of-line */
267 void handleConstantPool ();
268 void handleClassBegin (int, int, int);
269 void handleInterfacesBegin (int);
270 void handleInterface (int, int);
271 void handleFieldsBegin (int);
272 void handleField (int, int, int, int);
273 void handleFieldsEnd ();
274 void handleConstantValueAttribute (int,int);
275 void handleMethodsBegin (int);
276 void handleMethod (int, int, int, int);
277 void handleMethodsEnd ();
278 void handleCodeAttribute (int, int, int, int, int, int);
279 void handleExceptionTableEntry (int, int, int, int, int, int);
281 void checkExtends (jclass sub
, jclass super
);
282 void checkImplements (jclass sub
, jclass super
);
285 * FIXME: we should keep a hash table of utf8-strings, since many will
286 * be the same. It's a little tricky, however, because the hash table
287 * needs to interact gracefully with the garbage collector. Much
288 * memory is to be saved by this, however! perhaps the improvement
289 * could be implemented in prims.cc (_Jv_makeUtf8Const), since it
290 * computes the hash value anyway.
294 // Note that *NAME_RESULT will only be set if the class is registered
295 // with the class loader. This is how the caller can know whether
296 // unregistration is require.
298 _Jv_DefineClass (jclass klass
, jbyteArray data
, jint offset
, jint length
,
299 java::security::ProtectionDomain
*pd
,
300 _Jv_Utf8Const
**name_result
)
302 _Jv_ClassReader
reader (klass
, data
, offset
, length
, pd
, name_result
);
309 /** This section defines the parsing/scanning of the class data */
311 // Major and minor version numbers for various releases.
324 _Jv_ClassReader::parse ()
326 int magic
= read4 ();
327 if (magic
!= (int) 0xCAFEBABE)
328 throw_class_format_error ("bad magic number");
330 int minor_version
= read2u ();
331 int major_version
= read2u ();
332 if (major_version
< MAJOR_1_1
|| major_version
> MAJOR_1_5
333 || (major_version
== MAJOR_1_5
&& minor_version
> MINOR_1_5
))
334 throw_class_format_error ("unrecognized class file version");
335 is_15
= (major_version
== MAJOR_1_5
);
337 pool_count
= read2u ();
341 int access_flags
= read2u ();
342 int this_class
= read2u ();
343 int super_class
= read2u ();
345 check_tag (this_class
, JV_CONSTANT_Class
);
346 if (super_class
!= 0)
347 check_tag (super_class
, JV_CONSTANT_Class
);
349 handleClassBegin (access_flags
, this_class
, super_class
);
351 // Allocate our aux_info here, after the name is set, to fulfill our
352 // contract with the collector interface.
353 def
->aux_info
= (void *) _Jv_AllocBytes (sizeof (_Jv_InterpClass
));
354 def_interp
= (_Jv_InterpClass
*) def
->aux_info
;
356 int interfaces_count
= read2u ();
358 handleInterfacesBegin (interfaces_count
);
360 for (int i
= 0; i
< interfaces_count
; i
++)
362 int iface
= read2u ();
363 check_tag (iface
, JV_CONSTANT_Class
);
364 handleInterface (i
, iface
);
370 int attributes_count
= read2u ();
372 for (int i
= 0; i
< attributes_count
; i
++)
374 read_one_class_attribute ();
378 throw_class_format_error ("unused data before end of file");
380 // Tell everyone we're done.
381 def
->state
= JV_STATE_READ
;
382 if (gcj::verbose_class_flag
)
383 _Jv_Linker::print_class_loaded (def
);
387 void _Jv_ClassReader::read_constpool ()
389 tags
= (unsigned char*) _Jv_AllocBytes (pool_count
);
390 offsets
= (unsigned int *) _Jv_AllocBytes (sizeof (int)
393 /** first, we scan the constant pool, collecting tags and offsets */
394 tags
[0] = JV_CONSTANT_Undefined
;
396 for (int c
= 1; c
< pool_count
; c
++)
403 case JV_CONSTANT_String
:
404 case JV_CONSTANT_Class
:
408 case JV_CONSTANT_Fieldref
:
409 case JV_CONSTANT_Methodref
:
410 case JV_CONSTANT_InterfaceMethodref
:
411 case JV_CONSTANT_NameAndType
:
412 case JV_CONSTANT_Integer
:
413 case JV_CONSTANT_Float
:
417 case JV_CONSTANT_Double
:
418 case JV_CONSTANT_Long
:
420 tags
[++c
] = JV_CONSTANT_Undefined
;
423 case JV_CONSTANT_Utf8
:
430 case JV_CONSTANT_Unicode
:
431 throw_class_format_error ("unicode not supported");
435 throw_class_format_error ("erroneous constant pool tag");
439 handleConstantPool ();
443 void _Jv_ClassReader::read_fields ()
445 int fields_count
= read2u ();
446 handleFieldsBegin (fields_count
);
448 for (int i
= 0; i
< fields_count
; i
++)
450 int access_flags
= read2u ();
451 int name_index
= read2u ();
452 int descriptor_index
= read2u ();
453 int attributes_count
= read2u ();
455 check_tag (name_index
, JV_CONSTANT_Utf8
);
456 prepare_pool_entry (name_index
, JV_CONSTANT_Utf8
);
458 check_tag (descriptor_index
, JV_CONSTANT_Utf8
);
459 prepare_pool_entry (descriptor_index
, JV_CONSTANT_Utf8
);
461 handleField (i
, access_flags
, name_index
, descriptor_index
);
463 for (int j
= 0; j
< attributes_count
; j
++)
465 read_one_field_attribute (i
);
473 _Jv_ClassReader::is_attribute_name (int index
, char *name
)
475 check_tag (index
, JV_CONSTANT_Utf8
);
476 int len
= get2u (bytes
+offsets
[index
]);
477 if (len
!= (int) strlen (name
))
480 return !memcmp (bytes
+offsets
[index
]+2, name
, len
);
483 void _Jv_ClassReader::read_one_field_attribute (int field_index
)
485 int name
= read2u ();
486 int length
= read4 ();
488 if (is_attribute_name (name
, "ConstantValue"))
494 && (tags
[cv
] == JV_CONSTANT_Integer
495 || tags
[cv
] == JV_CONSTANT_Float
496 || tags
[cv
] == JV_CONSTANT_Long
497 || tags
[cv
] == JV_CONSTANT_Double
498 || tags
[cv
] == JV_CONSTANT_String
))
500 handleConstantValueAttribute (field_index
, cv
);
504 throw_class_format_error ("erroneous ConstantValue attribute");
508 throw_class_format_error ("erroneous ConstantValue attribute");
517 void _Jv_ClassReader::read_methods ()
519 int methods_count
= read2u ();
521 handleMethodsBegin (methods_count
);
523 for (int i
= 0; i
< methods_count
; i
++)
525 int access_flags
= read2u ();
526 int name_index
= read2u ();
527 int descriptor_index
= read2u ();
528 int attributes_count
= read2u ();
530 check_tag (name_index
, JV_CONSTANT_Utf8
);
531 prepare_pool_entry (name_index
, JV_CONSTANT_Utf8
);
533 check_tag (descriptor_index
, JV_CONSTANT_Utf8
);
534 prepare_pool_entry (descriptor_index
, JV_CONSTANT_Utf8
);
536 handleMethod (i
, access_flags
, name_index
,
539 for (int j
= 0; j
< attributes_count
; j
++)
541 read_one_method_attribute (i
);
548 void _Jv_ClassReader::read_one_method_attribute (int method_index
)
550 int name
= read2u ();
551 int length
= read4 ();
553 if (is_attribute_name (name
, "Exceptions"))
555 _Jv_Method
*method
= reinterpret_cast<_Jv_Method
*>
556 (&def
->methods
[method_index
]);
557 if (method
->throws
!= NULL
)
558 throw_class_format_error ("only one Exceptions attribute allowed per method");
560 int num_exceptions
= read2u ();
561 _Jv_Utf8Const
**exceptions
=
562 (_Jv_Utf8Const
**) _Jv_AllocBytes ((num_exceptions
+ 1)
563 * sizeof (_Jv_Utf8Const
*));
566 _Jv_word
*pool_data
= def
->constants
.data
;
567 for (int i
= 0; i
< num_exceptions
; ++i
)
570 // JLS 2nd Ed. 4.7.5 requires that the tag not be 0.
573 check_tag (ndx
, JV_CONSTANT_Class
);
574 exceptions
[out
++] = pool_data
[ndx
].utf8
;
577 exceptions
[out
] = NULL
;
578 method
->throws
= exceptions
;
581 else if (is_attribute_name (name
, "Code"))
584 int max_stack
= read2u ();
585 int max_locals
= read2u ();
586 int code_length
= read4 ();
588 int code_start
= pos
;
590 int exception_table_length
= read2u ();
592 handleCodeAttribute (method_index
,
593 max_stack
, max_locals
,
594 code_start
, code_length
,
595 exception_table_length
);
598 for (int i
= 0; i
< exception_table_length
; i
++)
600 int start_pc
= read2u ();
601 int end_pc
= read2u ();
602 int handler_pc
= read2u ();
603 int catch_type
= read2u ();
605 if (start_pc
> end_pc
607 // END_PC can be equal to CODE_LENGTH.
608 // See JVM Spec 4.7.4.
609 || end_pc
> code_length
610 || handler_pc
>= code_length
)
611 throw_class_format_error ("erroneous exception handler info");
613 if (! (tags
[catch_type
] == JV_CONSTANT_Class
614 || tags
[catch_type
] == 0))
616 throw_class_format_error ("erroneous exception handler info");
619 handleExceptionTableEntry (method_index
,
628 int attributes_count
= read2u ();
630 for (int i
= 0; i
< attributes_count
; i
++)
632 read_one_code_attribute (method_index
);
635 if ((pos
- start_off
) != length
)
636 throw_class_format_error ("code attribute too short");
641 /* ignore unknown attributes */
646 void _Jv_ClassReader::read_one_code_attribute (int method_index
)
648 int name
= read2u ();
649 int length
= read4 ();
650 if (is_attribute_name (name
, "LineNumberTable"))
652 _Jv_InterpMethod
*method
= reinterpret_cast<_Jv_InterpMethod
*>
653 (def_interp
->interpreted_methods
[method_index
]);
654 if (method
->line_table
!= NULL
)
655 throw_class_format_error ("Method already has LineNumberTable");
657 int table_len
= read2u ();
658 _Jv_LineTableEntry
* table
659 = (_Jv_LineTableEntry
*) JvAllocBytes (table_len
660 * sizeof (_Jv_LineTableEntry
));
661 for (int i
= 0; i
< table_len
; i
++)
663 table
[i
].bytecode_pc
= read2u ();
664 table
[i
].line
= read2u ();
666 method
->line_table_len
= table_len
;
667 method
->line_table
= table
;
671 /* ignore unknown code attributes */
676 void _Jv_ClassReader::read_one_class_attribute ()
678 int name
= read2u ();
679 int length
= read4 ();
680 if (is_attribute_name (name
, "SourceFile"))
682 int source_index
= read2u ();
683 check_tag (source_index
, JV_CONSTANT_Utf8
);
684 prepare_pool_entry (source_index
, JV_CONSTANT_Utf8
);
685 def_interp
->source_file_name
= _Jv_NewStringUtf8Const
686 (def
->constants
.data
[source_index
].utf8
);
690 /* Currently, we ignore most class attributes.
691 FIXME: Add inner-classes attributes support. */
699 /* this section defines the semantic actions of the parser */
701 void _Jv_ClassReader::handleConstantPool ()
703 /** now, we actually define the class' constant pool */
705 // the pool is scanned explicitly by the collector
706 jbyte
*pool_tags
= (jbyte
*) _Jv_AllocBytes (pool_count
);
708 = (_Jv_word
*) _Jv_AllocBytes (pool_count
* sizeof (_Jv_word
));
710 def
->constants
.tags
= pool_tags
;
711 def
->constants
.data
= pool_data
;
712 def
->constants
.size
= pool_count
;
714 // Here we make a pass to collect the strings! We do this, because
715 // internally in the GCJ runtime, classes are encoded with .'s not /'s.
716 // Therefore, we first collect the strings, and then translate the rest
717 // of the utf8-entries (thus not representing strings) from /-notation
719 for (int i
= 1; i
< pool_count
; i
++)
721 if (tags
[i
] == JV_CONSTANT_String
)
723 unsigned char* str_data
= bytes
+ offsets
[i
];
724 int utf_index
= get2u (str_data
);
725 check_tag (utf_index
, JV_CONSTANT_Utf8
);
726 unsigned char *utf_data
= bytes
+ offsets
[utf_index
];
727 int len
= get2u (utf_data
);
728 pool_data
[i
].utf8
= _Jv_makeUtf8Const ((char*)(utf_data
+2), len
);
729 pool_tags
[i
] = JV_CONSTANT_String
;
733 pool_tags
[i
] = JV_CONSTANT_Undefined
;
737 // and now, we scan everything else but strings & utf8-entries. This
738 // leaves out those utf8-entries which are not used; which will be left
739 // with a tag of JV_CONSTANT_Undefined in the class definition.
740 for (int index
= 1; index
< pool_count
; index
++)
744 case JV_CONSTANT_Undefined
:
745 case JV_CONSTANT_String
:
746 case JV_CONSTANT_Utf8
:
750 prepare_pool_entry (index
, tags
[index
]);
756 /* this is a recursive procedure, which will prepare pool entries as needed.
757 Which is how we avoid initializing those entries which go unused. */
759 _Jv_ClassReader::prepare_pool_entry (int index
, unsigned char this_tag
)
761 /* these two, pool_data and pool_tags, point into the class
762 structure we are currently defining */
764 unsigned char *pool_tags
= (unsigned char*) def
->constants
.tags
;
765 _Jv_word
*pool_data
= def
->constants
.data
;
767 /* this entry was already prepared */
768 if (pool_tags
[index
] == this_tag
)
771 /* this_data points to the constant-pool information for the current
772 constant-pool entry */
774 unsigned char *this_data
= bytes
+ offsets
[index
];
778 case JV_CONSTANT_Utf8
:
780 // If we came here, it is because some other tag needs this
781 // utf8-entry for type information! Thus, we translate /'s to .'s in
782 // order to accomondate gcj's internal representation.
784 int len
= get2u (this_data
);
785 char *buffer
= (char*) __builtin_alloca (len
);
786 char *s
= ((char*) this_data
)+2;
788 /* FIXME: avoid using a buffer here */
789 for (int i
= 0; i
< len
; i
++)
794 buffer
[i
] = (char) s
[i
];
797 pool_data
[index
].utf8
= _Jv_makeUtf8Const (buffer
, len
);
798 pool_tags
[index
] = JV_CONSTANT_Utf8
;
802 case JV_CONSTANT_Class
:
804 int utf_index
= get2u (this_data
);
805 check_tag (utf_index
, JV_CONSTANT_Utf8
);
806 prepare_pool_entry (utf_index
, JV_CONSTANT_Utf8
);
809 verify_classname (pool_data
[utf_index
].utf8
);
811 pool_data
[index
].utf8
= pool_data
[utf_index
].utf8
;
812 pool_tags
[index
] = JV_CONSTANT_Class
;
816 case JV_CONSTANT_String
:
817 // already handled before...
820 case JV_CONSTANT_Fieldref
:
821 case JV_CONSTANT_Methodref
:
822 case JV_CONSTANT_InterfaceMethodref
:
824 int class_index
= get2u (this_data
);
825 int nat_index
= get2u (this_data
+2);
827 check_tag (class_index
, JV_CONSTANT_Class
);
828 prepare_pool_entry (class_index
, JV_CONSTANT_Class
);
830 check_tag (nat_index
, JV_CONSTANT_NameAndType
);
831 prepare_pool_entry (nat_index
, JV_CONSTANT_NameAndType
);
833 // here, verify the signature and identifier name
836 _Jv_ushort name_index
, type_index
;
837 _Jv_loadIndexes (&pool_data
[nat_index
],
838 name_index
, type_index
);
840 if (this_tag
== JV_CONSTANT_Fieldref
)
841 verify_field_signature (pool_data
[type_index
].utf8
);
843 verify_method_signature (pool_data
[type_index
].utf8
);
845 _Jv_Utf8Const
* name
= pool_data
[name_index
].utf8
;
847 if (this_tag
!= JV_CONSTANT_Fieldref
848 && ( _Jv_equalUtf8Consts (name
, clinit_name
)
849 || _Jv_equalUtf8Consts (name
, init_name
)))
852 verify_identifier (pool_data
[name_index
].utf8
);
855 _Jv_storeIndexes (&pool_data
[index
], class_index
, nat_index
);
856 pool_tags
[index
] = this_tag
;
860 case JV_CONSTANT_NameAndType
:
862 _Jv_ushort name_index
= get2u (this_data
);
863 _Jv_ushort type_index
= get2u (this_data
+2);
865 check_tag (name_index
, JV_CONSTANT_Utf8
);
866 prepare_pool_entry (name_index
, JV_CONSTANT_Utf8
);
868 check_tag (type_index
, JV_CONSTANT_Utf8
);
869 prepare_pool_entry (type_index
, JV_CONSTANT_Utf8
);
871 _Jv_storeIndexes (&pool_data
[index
], name_index
, type_index
);
872 pool_tags
[index
] = JV_CONSTANT_NameAndType
;
876 case JV_CONSTANT_Float
:
878 jfloat f
= java::lang::Float::intBitsToFloat ((jint
) get4 (this_data
));
879 _Jv_storeFloat (&pool_data
[index
], f
);
880 pool_tags
[index
] = JV_CONSTANT_Float
;
884 case JV_CONSTANT_Integer
:
886 int i
= get4 (this_data
);
887 _Jv_storeInt (&pool_data
[index
], i
);
888 pool_tags
[index
] = JV_CONSTANT_Integer
;
892 case JV_CONSTANT_Double
:
895 = java::lang::Double::longBitsToDouble ((jlong
) get8 (this_data
));
896 _Jv_storeDouble (&pool_data
[index
], d
);
897 pool_tags
[index
] = JV_CONSTANT_Double
;
901 case JV_CONSTANT_Long
:
903 jlong i
= get8 (this_data
);
904 _Jv_storeLong (&pool_data
[index
], i
);
905 pool_tags
[index
] = JV_CONSTANT_Long
;
910 throw_class_format_error ("erroneous constant pool tag");
916 _Jv_ClassReader::handleClassBegin (int access_flags
, int this_class
, int super_class
)
918 using namespace java::lang::reflect
;
920 unsigned char *pool_tags
= (unsigned char*) def
->constants
.tags
;
921 _Jv_word
*pool_data
= def
->constants
.data
;
923 check_tag (this_class
, JV_CONSTANT_Class
);
924 _Jv_Utf8Const
*loadedName
= pool_data
[this_class
].utf8
;
926 // was ClassLoader.defineClass called with an expected class name?
929 jclass orig
= def
->loader
->findLoadedClass(loadedName
->toString());
933 def
->name
= loadedName
;
937 jstring msg
= JvNewStringUTF ("anonymous "
938 "class data denotes "
940 msg
= msg
->concat (orig
->getName ());
942 throw_no_class_def_found_error (msg
);
946 // assert that the loaded class has the expected name, 5.3.5
947 else if (! _Jv_equalUtf8Consts (loadedName
, def
->name
))
949 jstring msg
= JvNewStringUTF ("loaded class ");
950 msg
= msg
->concat (def
->getName ());
951 msg
= msg
->concat (_Jv_NewStringUTF (" was in fact named "));
952 jstring klass_name
= loadedName
->toString();
953 msg
= msg
->concat (klass_name
);
955 throw_no_class_def_found_error (msg
);
958 def
->accflags
= access_flags
| java::lang::reflect::Modifier::INTERPRETED
;
959 pool_data
[this_class
].clazz
= def
;
960 pool_tags
[this_class
] = JV_CONSTANT_ResolvedClass
;
962 if (super_class
== 0)
964 // Note that this is ok if we are defining java.lang.Object.
965 // But there is no way to have this class be interpreted.
966 throw_class_format_error ("no superclass reference");
969 def
->state
= JV_STATE_PRELOADING
;
971 // Register this class with its defining loader as well (despite the
972 // name of the function we're calling), so that super class lookups
973 // work properly. If there is an error, our caller will unregister
974 // this class from the class loader. Also, we don't need to hold a
975 // lock here, as our caller has acquired it.
976 _Jv_RegisterInitiatingLoader (def
, def
->loader
);
978 // Note that we found a name so that unregistration can happen if
980 *found_name
= def
->name
;
982 if (super_class
!= 0)
984 // Load the superclass.
985 check_tag (super_class
, JV_CONSTANT_Class
);
986 _Jv_Utf8Const
* super_name
= pool_data
[super_class
].utf8
;
988 // Load the superclass using our defining loader.
989 jclass the_super
= _Jv_FindClass (super_name
, def
->loader
);
991 // This will establish that we are allowed to be a subclass,
992 // and check for class circularity error.
993 checkExtends (def
, the_super
);
995 // Note: for an interface we will find Object as the
996 // superclass. We still check it above to ensure class file
997 // validity, but we simply assign `null' to the actual field in
999 def
->superclass
= (((access_flags
& Modifier::INTERFACE
))
1000 ? NULL
: the_super
);
1001 pool_data
[super_class
].clazz
= the_super
;
1002 pool_tags
[super_class
] = JV_CONSTANT_ResolvedClass
;
1005 // Now we've come past the circularity problem, we can
1006 // now say that we're loading.
1008 def
->state
= JV_STATE_LOADING
;
1012 ///// Implements the checks described in sect. 5.3.5.3
1014 _Jv_ClassReader::checkExtends (jclass sub
, jclass super
)
1016 using namespace java::lang::reflect
;
1018 _Jv_Linker::wait_for_state (super
, JV_STATE_LOADING
);
1020 // Having an interface or a final class as a superclass is no good.
1021 if ((super
->accflags
& (Modifier::INTERFACE
| Modifier::FINAL
)) != 0)
1023 throw_incompatible_class_change_error (sub
->getName ());
1026 // If the super class is not public, we need to check some more.
1027 if ((super
->accflags
& Modifier::PUBLIC
) == 0)
1029 // With package scope, the classes must have the same class
1031 if ( sub
->loader
!= super
->loader
1032 || !_Jv_ClassNameSamePackage (sub
->name
, super
->name
))
1034 throw_incompatible_class_change_error (sub
->getName ());
1038 for (; super
!= 0; super
= super
->getSuperclass ())
1041 throw_class_circularity_error (sub
->getName ());
1047 void _Jv_ClassReader::handleInterfacesBegin (int count
)
1049 def
->interfaces
= (jclass
*) _Jv_AllocBytes (count
*sizeof (jclass
));
1050 def
->interface_count
= count
;
1053 void _Jv_ClassReader::handleInterface (int if_number
, int offset
)
1055 _Jv_word
* pool_data
= def
->constants
.data
;
1056 unsigned char * pool_tags
= (unsigned char*) def
->constants
.tags
;
1058 jclass the_interface
;
1060 if (pool_tags
[offset
] == JV_CONSTANT_Class
)
1062 _Jv_Utf8Const
* name
= pool_data
[offset
].utf8
;
1063 the_interface
= _Jv_FindClass (name
, def
->loader
);
1065 else if (pool_tags
[offset
] == JV_CONSTANT_ResolvedClass
)
1067 the_interface
= pool_data
[offset
].clazz
;
1071 throw_no_class_def_found_error ("erroneous constant pool tag");
1074 // checks the validity of the_interface, and that we are in fact
1075 // allowed to implement that interface.
1076 checkImplements (def
, the_interface
);
1078 pool_data
[offset
].clazz
= the_interface
;
1079 pool_tags
[offset
] = JV_CONSTANT_ResolvedClass
;
1081 def
->interfaces
[if_number
] = the_interface
;
1085 _Jv_ClassReader::checkImplements (jclass sub
, jclass super
)
1087 using namespace java::lang::reflect
;
1089 // well, it *must* be an interface
1090 if ((super
->accflags
& Modifier::INTERFACE
) == 0)
1092 throw_incompatible_class_change_error (sub
->getName ());
1095 // if it has package scope, it must also be defined by the
1097 if ((super
->accflags
& Modifier::PUBLIC
) == 0)
1099 if ( sub
->loader
!= super
->loader
1100 || !_Jv_ClassNameSamePackage (sub
->name
, super
->name
))
1102 throw_incompatible_class_change_error (sub
->getName ());
1106 // FIXME: add interface circularity check here
1109 throw_class_circularity_error (sub
->getName ());
1113 void _Jv_ClassReader::handleFieldsBegin (int count
)
1115 def
->fields
= (_Jv_Field
*)
1116 _Jv_AllocBytes (count
* sizeof (_Jv_Field
));
1117 def
->field_count
= count
;
1118 def_interp
->field_initializers
= (_Jv_ushort
*)
1119 _Jv_AllocBytes (count
* sizeof (_Jv_ushort
));
1120 for (int i
= 0; i
< count
; i
++)
1121 def_interp
->field_initializers
[i
] = (_Jv_ushort
) 0;
1124 void _Jv_ClassReader::handleField (int field_no
,
1129 using namespace java::lang::reflect
;
1131 _Jv_word
*pool_data
= def
->constants
.data
;
1133 _Jv_Field
*field
= &def
->fields
[field_no
];
1134 _Jv_Utf8Const
*field_name
= pool_data
[name
].utf8
;
1136 field
->name
= field_name
;
1138 // Ignore flags we don't know about.
1139 field
->flags
= flags
& Modifier::ALL_FLAGS
;
1141 _Jv_Utf8Const
* sig
= pool_data
[desc
].utf8
;
1145 verify_identifier (field_name
);
1147 for (int i
= 0; i
< field_no
; ++i
)
1149 if (_Jv_equalUtf8Consts (field_name
, def
->fields
[i
].name
)
1150 && _Jv_equalUtf8Consts (sig
,
1151 // We know the other fields are
1153 (_Jv_Utf8Const
*) def
->fields
[i
].type
))
1154 throw_class_format_error ("duplicate field name");
1157 // At most one of PUBLIC, PRIVATE, or PROTECTED is allowed.
1158 if (1 < ( ((field
->flags
& Modifier::PUBLIC
) ? 1 : 0)
1159 +((field
->flags
& Modifier::PRIVATE
) ? 1 : 0)
1160 +((field
->flags
& Modifier::PROTECTED
) ? 1 : 0)))
1161 throw_class_format_error ("erroneous field access flags");
1163 // FIXME: JVM spec S4.5: Verify ACC_FINAL and ACC_VOLATILE are not
1164 // both set. Verify modifiers for interface fields.
1169 verify_field_signature (sig
);
1171 // field->type is really a jclass, but while it is still
1172 // unresolved we keep an _Jv_Utf8Const* instead.
1173 field
->type
= (jclass
) sig
;
1174 field
->flags
|= _Jv_FIELD_UNRESOLVED_FLAG
;
1175 field
->u
.boffset
= 0;
1179 void _Jv_ClassReader::handleConstantValueAttribute (int field_index
,
1182 using namespace java::lang::reflect
;
1184 _Jv_Field
*field
= &def
->fields
[field_index
];
1186 if ((field
->flags
& (Modifier::STATIC
1188 | Modifier::PRIVATE
)) == 0)
1190 // Ignore, as per vmspec #4.7.2
1194 // do not allow multiple constant fields!
1195 if (field
->flags
& _Jv_FIELD_CONSTANT_VALUE
)
1196 throw_class_format_error ("field has multiple ConstantValue attributes");
1198 field
->flags
|= _Jv_FIELD_CONSTANT_VALUE
;
1199 def_interp
->field_initializers
[field_index
] = value
;
1201 /* type check the initializer */
1203 if (value
<= 0 || value
>= pool_count
)
1204 throw_class_format_error ("erroneous ConstantValue attribute");
1206 /* FIXME: do the rest */
1209 void _Jv_ClassReader::handleFieldsEnd ()
1211 using namespace java::lang::reflect
;
1213 // We need to reorganize the fields so that the static ones are first,
1214 // to conform to GCJ class layout.
1217 int high
= def
->field_count
-1;
1218 _Jv_Field
*fields
= def
->fields
;
1219 _Jv_ushort
*inits
= def_interp
->field_initializers
;
1221 // this is kind of a raw version of quicksort.
1224 // go forward on low, while it's a static
1225 while (low
< high
&& (fields
[low
].flags
& Modifier::STATIC
) != 0)
1228 // go backwards on high, while it's a non-static
1229 while (low
< high
&& (fields
[high
].flags
& Modifier::STATIC
) == 0)
1235 _Jv_Field tmp
= fields
[low
];
1236 _Jv_ushort itmp
= inits
[low
];
1238 fields
[low
] = fields
[high
];
1239 inits
[low
] = inits
[high
];
1248 if ((fields
[low
].flags
& Modifier::STATIC
) != 0)
1251 def
->static_field_count
= low
;
1257 _Jv_ClassReader::handleMethodsBegin (int count
)
1259 def
->methods
= (_Jv_Method
*) _Jv_AllocBytes (sizeof (_Jv_Method
) * count
);
1261 def_interp
->interpreted_methods
1262 = (_Jv_MethodBase
**) _Jv_AllocBytes (sizeof (_Jv_MethodBase
*)
1265 for (int i
= 0; i
< count
; i
++)
1267 def_interp
->interpreted_methods
[i
] = 0;
1268 def
->methods
[i
].index
= (_Jv_ushort
) -1;
1271 def
->method_count
= count
;
1275 void _Jv_ClassReader::handleMethod
1276 (int mth_index
, int accflags
, int name
, int desc
)
1278 using namespace java::lang::reflect
;
1280 _Jv_word
*pool_data
= def
->constants
.data
;
1281 _Jv_Method
*method
= &def
->methods
[mth_index
];
1283 check_tag (name
, JV_CONSTANT_Utf8
);
1284 prepare_pool_entry (name
, JV_CONSTANT_Utf8
);
1285 method
->name
= pool_data
[name
].utf8
;
1287 check_tag (desc
, JV_CONSTANT_Utf8
);
1288 prepare_pool_entry (desc
, JV_CONSTANT_Utf8
);
1289 method
->signature
= pool_data
[desc
].utf8
;
1291 // ignore unknown flags
1292 method
->accflags
= accflags
& Modifier::ALL_FLAGS
;
1296 method
->throws
= NULL
;
1300 if (_Jv_equalUtf8Consts (method
->name
, clinit_name
)
1301 || _Jv_equalUtf8Consts (method
->name
, init_name
))
1304 verify_identifier (method
->name
);
1306 verify_method_signature (method
->signature
);
1308 for (int i
= 0; i
< mth_index
; ++i
)
1310 if (_Jv_equalUtf8Consts (method
->name
, def
->methods
[i
].name
)
1311 && _Jv_equalUtf8Consts (method
->signature
,
1312 def
->methods
[i
].signature
))
1313 throw_class_format_error ("duplicate method");
1316 // At most one of PUBLIC, PRIVATE, or PROTECTED is allowed.
1317 if (1 < ( ((method
->accflags
& Modifier::PUBLIC
) ? 1 : 0)
1318 +((method
->accflags
& Modifier::PRIVATE
) ? 1 : 0)
1319 +((method
->accflags
& Modifier::PROTECTED
) ? 1 : 0)))
1320 throw_class_format_error ("erroneous method access flags");
1322 // FIXME: JVM spec S4.6: if ABSTRACT modifier is set, verify other
1323 // flags are not set. Verify flags for interface methods. Verify
1324 // modifiers for initializers.
1328 void _Jv_ClassReader::handleCodeAttribute
1329 (int method_index
, int max_stack
, int max_locals
,
1330 int code_start
, int code_length
, int exc_table_length
)
1332 int size
= _Jv_InterpMethod::size (exc_table_length
, code_length
);
1333 _Jv_InterpMethod
*method
=
1334 (_Jv_InterpMethod
*) (_Jv_AllocBytes (size
));
1336 method
->max_stack
= max_stack
;
1337 method
->max_locals
= max_locals
;
1338 method
->code_length
= code_length
;
1339 method
->exc_count
= exc_table_length
;
1340 method
->is_15
= is_15
;
1341 method
->defining_class
= def
;
1342 method
->self
= &def
->methods
[method_index
];
1343 method
->prepared
= NULL
;
1344 method
->line_table_len
= 0;
1345 method
->line_table
= NULL
;
1348 // grab the byte code!
1349 memcpy ((void*) method
->bytecode (),
1350 (void*) (bytes
+code_start
),
1353 def_interp
->interpreted_methods
[method_index
] = method
;
1355 if ((method
->self
->accflags
& java::lang::reflect::Modifier::STATIC
))
1357 // Precompute the ncode field for a static method. This lets us
1358 // call a static method of an interpreted class from precompiled
1359 // code without first resolving the class (that will happen
1360 // during class initialization instead).
1361 method
->self
->ncode
= method
->ncode ();
1365 void _Jv_ClassReader::handleExceptionTableEntry
1366 (int method_index
, int exc_index
,
1367 int start_pc
, int end_pc
, int handler_pc
, int catch_type
)
1369 _Jv_InterpMethod
*method
= reinterpret_cast<_Jv_InterpMethod
*>
1370 (def_interp
->interpreted_methods
[method_index
]);
1371 _Jv_InterpException
*exc
= method
->exceptions ();
1373 exc
[exc_index
].start_pc
.i
= start_pc
;
1374 exc
[exc_index
].end_pc
.i
= end_pc
;
1375 exc
[exc_index
].handler_pc
.i
= handler_pc
;
1376 exc
[exc_index
].handler_type
.i
= catch_type
;
1379 void _Jv_ClassReader::handleMethodsEnd ()
1381 using namespace java::lang::reflect
;
1383 for (int i
= 0; i
< def
->method_count
; i
++)
1385 _Jv_Method
*method
= &def
->methods
[i
];
1386 if ((method
->accflags
& Modifier::NATIVE
) != 0)
1388 if (def_interp
->interpreted_methods
[i
] != 0)
1389 throw_class_format_error ("code provided for native method");
1392 _Jv_JNIMethod
*m
= (_Jv_JNIMethod
*)
1393 _Jv_AllocBytes (sizeof (_Jv_JNIMethod
));
1394 m
->defining_class
= def
;
1397 def_interp
->interpreted_methods
[i
] = m
;
1399 if ((method
->accflags
& Modifier::STATIC
))
1401 // Precompute the ncode field for a static method.
1402 // This lets us call a static method of an
1403 // interpreted class from precompiled code without
1404 // first resolving the class (that will happen
1405 // during class initialization instead).
1406 method
->ncode
= m
->ncode ();
1410 else if ((method
->accflags
& Modifier::ABSTRACT
) != 0)
1412 if (def_interp
->interpreted_methods
[i
] != 0)
1413 throw_class_format_error ("code provided for abstract method");
1414 method
->ncode
= (void *) &_Jv_ThrowAbstractMethodError
;
1418 if (def_interp
->interpreted_methods
[i
] == 0)
1419 throw_class_format_error ("method with no code");
1424 void _Jv_ClassReader::throw_class_format_error (char *msg
)
1427 if (def
->name
!= NULL
)
1429 jsize mlen
= strlen (msg
);
1430 unsigned char* data
= (unsigned char*) def
->name
->chars();
1431 int ulen
= def
->name
->len();
1432 unsigned char* limit
= data
+ ulen
;
1433 jsize nlen
= _Jv_strLengthUtf8 ((char *) data
, ulen
);
1434 jsize len
= nlen
+ mlen
+ 3;
1435 str
= JvAllocString(len
);
1436 jchar
*chrs
= JvGetStringChars(str
);
1437 while (data
< limit
)
1438 *chrs
++ = UTF8_GET(data
, limit
);
1446 *chrs
++ = c
& 0xFFFF;
1451 str
= JvNewStringLatin1 (msg
);
1452 ::throw_class_format_error (str
);
1455 /** Here we define the exceptions that can be thrown */
1458 throw_no_class_def_found_error (jstring msg
)
1461 ? new java::lang::NoClassDefFoundError (msg
)
1462 : new java::lang::NoClassDefFoundError
);
1466 throw_no_class_def_found_error (char *msg
)
1468 throw_no_class_def_found_error (JvNewStringLatin1 (msg
));
1472 throw_class_format_error (jstring msg
)
1475 ? new java::lang::ClassFormatError (msg
)
1476 : new java::lang::ClassFormatError
);
1480 throw_internal_error (char *msg
)
1482 throw new java::lang::InternalError (JvNewStringLatin1 (msg
));
1486 throw_incompatible_class_change_error (jstring msg
)
1488 throw new java::lang::IncompatibleClassChangeError (msg
);
1492 throw_class_circularity_error (jstring msg
)
1494 throw new java::lang::ClassCircularityError (msg
);
1497 #endif /* INTERPRETER */
1501 /** This section takes care of verifying integrity of identifiers,
1502 signatures, field ddescriptors, and class names */
1504 #define UTF8_PEEK(PTR, LIMIT) \
1505 ({ unsigned char* xxkeep = (PTR); \
1506 int xxch = UTF8_GET(PTR,LIMIT); \
1507 PTR = xxkeep; xxch; })
1509 /* Verify one element of a type descriptor or signature. */
1510 static unsigned char*
1511 _Jv_VerifyOne (unsigned char* ptr
, unsigned char* limit
, bool void_ok
)
1516 int ch
= UTF8_GET (ptr
, limit
);
1524 case 'S': case 'B': case 'I': case 'J':
1525 case 'Z': case 'C': case 'F': case 'D':
1530 unsigned char *start
= ptr
, *end
;
1538 if ((ch
= UTF8_GET (ptr
, limit
)) == -1)
1543 if (! _Jv_VerifyClassName (start
, (unsigned short) (end
-start
)))
1549 return _Jv_VerifyOne (ptr
, limit
, false);
1559 /* Verification and loading procedures. */
1561 _Jv_VerifyFieldSignature (_Jv_Utf8Const
*sig
)
1563 unsigned char* ptr
= (unsigned char*) sig
->chars();
1564 unsigned char* limit
= ptr
+ sig
->len();
1566 ptr
= _Jv_VerifyOne (ptr
, limit
, false);
1568 return ptr
== limit
;
1572 _Jv_VerifyMethodSignature (_Jv_Utf8Const
*sig
)
1574 unsigned char* ptr
= (unsigned char*) sig
->chars();
1575 unsigned char* limit
= ptr
+ sig
->len();
1577 if (ptr
== limit
|| UTF8_GET(ptr
,limit
) != '(')
1580 while (ptr
&& UTF8_PEEK (ptr
, limit
) != ')')
1581 ptr
= _Jv_VerifyOne (ptr
, limit
, false);
1583 if (! ptr
|| UTF8_GET (ptr
, limit
) != ')')
1586 // get the return type
1587 ptr
= _Jv_VerifyOne (ptr
, limit
, true);
1589 return ptr
== limit
;
1592 /* We try to avoid calling the Character methods all the time, in
1593 fact, they will only be called for non-standard things. */
1594 static __inline__
int
1595 is_identifier_start (int c
)
1597 unsigned int ch
= (unsigned)c
;
1599 if ((ch
- 0x41U
) < 29U) /* A ... Z */
1601 if ((ch
- 0x61U
) < 29U) /* a ... z */
1603 if (ch
== 0x5FU
) /* _ */
1606 return java::lang::Character::isJavaIdentifierStart ((jchar
) ch
);
1609 static __inline__
int
1610 is_identifier_part (int c
)
1612 unsigned int ch
= (unsigned)c
;
1614 if ((ch
- 0x41U
) < 29U) /* A ... Z */
1616 if ((ch
- 0x61U
) < 29U) /* a ... z */
1618 if ((ch
- 0x30) < 10U) /* 0 .. 9 */
1620 if (ch
== 0x5FU
|| ch
== 0x24U
) /* _ $ */
1623 return java::lang::Character::isJavaIdentifierStart ((jchar
) ch
);
1627 _Jv_VerifyIdentifier (_Jv_Utf8Const
* name
)
1629 unsigned char *ptr
= (unsigned char*) name
->chars();
1630 unsigned char *limit
= (unsigned char*) name
->limit();
1633 if ((ch
= UTF8_GET (ptr
, limit
))==-1
1634 || ! is_identifier_start (ch
))
1637 while (ptr
!= limit
)
1639 if ((ch
= UTF8_GET (ptr
, limit
))==-1
1640 || ! is_identifier_part (ch
))
1647 _Jv_VerifyClassName (unsigned char* ptr
, _Jv_ushort length
)
1649 unsigned char *limit
= ptr
+length
;
1652 if ('[' == UTF8_PEEK (ptr
, limit
))
1654 unsigned char *end
= _Jv_VerifyOne (++ptr
, limit
, false);
1655 // _Jv_VerifyOne must leave us looking at the terminating nul
1665 if ((ch
= UTF8_GET (ptr
, limit
))==-1)
1667 if (! is_identifier_start (ch
))
1672 else if ((ch
= UTF8_GET (ptr
, limit
))==-1)
1676 else if (! is_identifier_part (ch
))
1683 _Jv_VerifyClassName (_Jv_Utf8Const
*name
)
1685 return _Jv_VerifyClassName ((unsigned char*)name
->chars(), name
->len());
1688 /* Returns true, if NAME1 and NAME2 represent classes in the same
1689 package. Neither NAME2 nor NAME2 may name an array type. */
1691 _Jv_ClassNameSamePackage (_Jv_Utf8Const
*name1
, _Jv_Utf8Const
*name2
)
1693 unsigned char* ptr1
= (unsigned char*) name1
->chars();
1694 unsigned char* limit1
= (unsigned char*) name1
->limit();
1696 unsigned char* last1
= ptr1
;
1698 // scan name1, and find the last occurrence of '.'
1699 while (ptr1
< limit1
) {
1700 int ch1
= UTF8_GET (ptr1
, limit1
);
1709 // Now the length of NAME1's package name is LEN.
1710 int len
= last1
- (unsigned char*) name1
->chars();
1712 // If this is longer than NAME2, then we're off.
1713 if (len
> name2
->len())
1716 // Then compare the first len bytes for equality.
1717 if (memcmp ((void*) name1
->chars(), (void*) name2
->chars(), len
) == 0)
1719 // Check that there are no .'s after position LEN in NAME2.
1721 unsigned char* ptr2
= (unsigned char*) name2
->chars() + len
;
1722 unsigned char* limit2
= (unsigned char*) name2
->limit();
1724 while (ptr2
< limit2
)
1726 int ch2
= UTF8_GET (ptr2
, limit2
);
1727 if (ch2
== -1 || ch2
== '.')