Andreas Krall
Christian Thalinger
- $Id: class.c 2523 2005-05-23 18:13:52Z edwin $
+ $Id: class.c 3292 2005-09-28 10:36:34Z twisti $
*/
classinfo *class_java_lang_SecurityManager = NULL;
classinfo *class_java_lang_String = NULL;
classinfo *class_java_lang_System = NULL;
+classinfo *class_java_lang_Thread = NULL;
classinfo *class_java_lang_ThreadGroup = NULL;
+classinfo *class_java_lang_VMThread = NULL;
classinfo *class_java_io_Serializable = NULL;
classinfo *class_java_lang_Float = NULL;
classinfo *class_java_lang_Double = NULL;
+
/* some classes which may be used more often */
-classinfo *class_java_util_Vector = NULL;
+classinfo *class_java_lang_StackTraceElement = NULL;
classinfo *class_java_lang_reflect_Constructor = NULL;
+classinfo *class_java_lang_reflect_Field = NULL;
classinfo *class_java_lang_reflect_Method = NULL;
-classinfo *arrayclass_java_lang_Object=NULL;
+classinfo *class_java_security_PrivilegedAction = NULL;
+classinfo *class_java_util_Vector = NULL;
+
+classinfo *arrayclass_java_lang_Object = NULL;
+
/* pseudo classes for the typechecker */
classinfo *pseudo_class_Null = NULL;
classinfo *pseudo_class_New = NULL;
+
/* class_set_packagename *******************************************************
Derive the package name from the class name and store it in the struct.
void class_set_packagename(classinfo *c)
{
+ char *p = UTF_END(c->name) - 1;
+ char *start = c->name->text;
+
+ /* set the package name */
+ /* classes in the unnamed package keep packagename == NULL */
+
if (c->name->text[0] == '[') {
- /* Array classes are not loaded from classfiles. */
- c->packagename = array_packagename;
- }
- else {
- /* Find the package name */
- /* Classes in the unnamed package keep packagename == NULL. */
- char *p = utf_end(c->name) - 1;
- char *start = c->name->text;
- for (;p > start; --p) {
- if (*p == '/') {
- c->packagename = utf_new(start, p - start);
- break;
- }
- }
+ /* set packagename of arrays to the element's package */
+
+ for (; *start == '['; start++);
+
+ /* skip the 'L' in arrays of references */
+ if (*start == 'L')
+ start++;
+
+ for (; (p > start) && (*p != '/'); --p);
+
+ c->packagename = utf_new(start, p - start);
+
+ } else {
+ for (; (p > start) && (*p != '/'); --p);
+
+ c->packagename = utf_new(start, p - start);
}
}
+
/* class_create_classinfo ******************************************************
Create a new classinfo struct. The class name is set to the given utf *,
if (!c) {
/* we have to create it */
c = class_create_classinfo(name);
- if (!load_newly_created_array(c,initloader))
+ c = load_newly_created_array(c,initloader);
+ if (c == NULL)
return NULL;
}
}
+/* class_get_self_classref *****************************************************
+
+ Returns the constant_classref to the class itself.
+
+ IN:
+ cls..............the class containing the reference
+
+ RETURN VALUE:
+ a pointer to a constant_classref (never NULL)
+
+*******************************************************************************/
+
+constant_classref *class_get_self_classref(classinfo *cls)
+{
+ /* XXX this should be done in a faster way. Maybe always make */
+ /* the classref of index 0 a self reference. */
+ return class_get_classref(cls,cls->name);
+}
+
/* class_get_classref_multiarray_of ********************************************
Returns an array type reference with the given dimension and element class