1 /***************************** ncomp/ntools.c **********************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 Ein paar zus"atzlich notwendige Funktionen, die sonst nirgends
10 Authors: Andreas Krall EMAIL: cacao@complang.tuwien.ac.at
11 Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
13 Last Change: 1997/11/03
15 *******************************************************************************/
18 /***************** Funktion: compiler_addinitclass ****************************
20 zum Eintragen einer Klasse in die Liste der noch zu initialisierenden
23 ******************************************************************************/
25 static void compiler_addinitclass (classinfo *c)
29 if (c->initialized) return;
31 cl = chain_first(uninitializedclasses);
36 cl = chain_next(uninitializedclasses);
42 sprintf(logtext, "compiler_addinitclass: ");
43 unicode_sprint(logtext+strlen(logtext), c->name);
46 chain_addlast(uninitializedclasses, c);
51 sprintf(logtext, "compiler_addinitclass: ");
52 unicode_sprint(logtext+strlen(logtext), c->name);
55 chain_addbefore(uninitializedclasses, c);
58 cl = chain_next(uninitializedclasses);
64 /***************** Hilfsfunktionen zum Decodieren des Bytecodes ***************
66 lesen ein Datum des gew"unschten Typs aus dem Bytecode an der
69 ******************************************************************************/
71 #define code_get_u1(pos) jcode[pos]
72 #define code_get_s1(pos) ((s1)jcode[pos])
73 #define code_get_u2(pos) ((((u2)jcode[pos])<<8)+jcode[pos+1])
74 #define code_get_s2(pos) ((s2)((((u2)jcode[pos])<<8)+jcode[pos+1]))
75 #define code_get_u4(pos) ((((u4)jcode[pos])<<24)+(((u4)jcode[pos+1])<<16)+\
76 (((u4)jcode[pos+2])<<8)+jcode[pos+3])
77 #define code_get_s4(pos) ((s4)((((u4)jcode[pos])<<24)+(((u4)jcode[pos+1])<<16)+\
78 (((u4)jcode[pos+2])<<8)+jcode[pos+3]))
81 /******************** Funktion: descriptor2types *****************************
83 Decodiert einen Methoddescriptor.
84 Beim Aufruf dieser Funktion MUSS (!!!) der Descriptor ein
85 gueltiges Format haben (wird eh vorher vom loader ueberprueft).
87 Die Funktion erzeugt ein Array von integers (u2), in das die
88 Parametertypen eingetragen werden, und liefert einen Zeiger auf
89 das Array in einem Referenzparameter ('paramtypes') zur"uck.
90 Die L"ange dieses Arrays und der Methodenr"uckgabewert werden ebenfalls
91 in Referenzparametern zur"uckgeliefert.
93 Der Parameter 'isstatic' gibt an (wenn true), dass kein zus"atzlicher
94 erster Eintrag f"ur den this-Zeiger in das Array eingetragen
95 werden soll (sonst wird er n"amlich automatisch erzeugt, mit dem
98 ******************************************************************************/
100 static void descriptor2types (methodinfo *m)
107 types = DMNEW (u1, m->descriptor->length);
110 if (!(m->flags & ACC_STATIC)) {
115 cptr = m->descriptor->text;
117 while ((c = *cptr++) != ')') {
124 case 'Z': *tptr++ = TYPE_INT;
126 case 'J': *tptr++ = TYPE_LNG;
128 case 'F': *tptr++ = TYPE_FLT;
130 case 'D': *tptr++ = TYPE_DBL;
132 case 'L': *tptr++ = TYPE_ADR;
133 while (*cptr++ != ';');
135 case '[': *tptr++ = TYPE_ADR;
139 while (*cptr++ != ';') /* skip */;
141 default: panic ("Ill formed methodtype-descriptor");
150 case 'Z': m->returntype = TYPE_INT;
152 case 'J': m->returntype = TYPE_LNG;
154 case 'F': m->returntype = TYPE_FLT;
156 case 'D': m->returntype = TYPE_DBL;
159 case 'L': m->returntype = TYPE_ADR;
161 case 'V': m->returntype = TYPE_VOID;
164 default: panic ("Ill formed methodtype-descriptor");
167 m->paramcount = pcount;
168 m->paramtypes = types;