renamed vftbl type to vftbl_t
[cacao.git] / src / vm / global.h
1 /* global.h - global definitions
2
3    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4    R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
5    M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
6    P. Tomsich, J. Wenninger
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Reinhard Grafl
28             Andreas Krall
29
30    Changes: Mark Probst
31             Philipp Tomsich
32                         Edwin Steiner
33
34    $Id: global.h 1296 2004-07-10 17:02:15Z stefan $
35
36 */
37
38
39 #ifndef _GLOBAL_H
40 #define _GLOBAL_H
41
42
43 #include "config.h"
44 #include "types.h"
45 #include "toolbox/list.h"
46
47
48 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
49 #include <pthread.h>
50 #include <semaphore.h>
51 #endif
52
53 #define STATISTICS          /* if enabled collects program statistics         */
54
55 /* 
56  * SIZE_FROM_CLASSINFO toggles between the bitmap_based and the new method 
57  * of determining the sizes of objects on the heap.
58  */
59 #define SIZE_FROM_CLASSINFO
60
61 /*
62  * CACAO_TYPECHECK activates typechecking (part of bytecode verification)
63  */
64 #define CACAO_TYPECHECK
65
66 /*
67  * TYPECHECK_STACK_COMPCAT activates full checking of computational
68  * categories for stack manipulations (POP,POP2,SWAP,DUP,DUP2,DUP_X1,
69  * DUP2_X1,DUP_X2,DUP2_X2).
70  */
71 /* #define TYPECHECK_STACK_COMPCAT */
72
73 /*
74  * Macros for configuration of the typechecking code
75  *
76  * TYPECHECK_STATISTICS activates gathering statistical information.
77  * TYPEINFO_DEBUG activates debug checks and debug helpers in typeinfo.c
78  * TYPECHECK_DEBUG activates debug checks in typecheck.c
79  * TYPEINFO_DEBUG_TEST activates the typeinfo test at startup.
80  * TYPECHECK_VERBOSE_IMPORTANT activates important debug messages
81  * TYPECHECK_VERBOSE activates all debug messages
82  */
83 #ifdef CACAO_TYPECHECK
84 /*#define TYPECHECK_STATISTICS*/
85 /*#define TYPEINFO_DEBUG*/
86 /*#define TYPECHECK_DEBUG*/
87 /*#define TYPEINFO_DEBUG_TEST*/
88 /*#define TYPECHECK_VERBOSE*/
89 /*#define TYPECHECK_VERBOSE_IMPORTANT*/
90 #if defined(TYPECHECK_VERBOSE) || defined(TYPECHECK_VERBOSE_IMPORTANT)
91 #define TYPECHECK_VERBOSE_OPT
92 #endif
93 #endif
94
95
96 /* additional data types ******************************************************/
97
98 typedef void *voidptr;          /* generic pointer */
99
100 typedef int   bool;             /* boolean data type */
101
102 #define true  1
103 #define false 0
104
105
106 /* immediate data union */
107
108 typedef union {
109     s4 i;
110     s8 l;
111     float f;
112     double d;
113     void *a;
114     u1 b[8];
115 } imm_union;
116
117
118 #define PRIMITIVETYPE_COUNT  9  /* number of primitive types */
119
120 /* CAUTION: Don't change the numerical values! These constants are
121  * used as indices into the primitive type table.
122  */
123 #define PRIMITIVETYPE_INT     0
124 #define PRIMITIVETYPE_LONG    1
125 #define PRIMITIVETYPE_FLOAT   2
126 #define PRIMITIVETYPE_DOUBLE  3
127 #define PRIMITIVETYPE_BYTE    4
128 #define PRIMITIVETYPE_CHAR    5
129 #define PRIMITIVETYPE_SHORT   6
130 #define PRIMITIVETYPE_BOOLEAN 7
131 #define PRIMITIVETYPE_VOID    8
132
133 typedef void (*functionptr) (); /* generic function pointer */
134
135
136 #define MAX_ALIGN 8             /* most generic alignment for JavaVM values   */
137
138
139 /* basic data types ***********************************************************/
140
141 /* CAUTION: jit/jit.h relies on these numerical values! */
142 #define TYPE_INT      0         /* the JavaVM types must numbered in the      */
143 #define TYPE_LONG     1         /* same order as the ICMD_Ixxx to ICMD_Axxx   */
144 #define TYPE_FLOAT    2         /* instructions (LOAD and STORE)              */
145 #define TYPE_DOUBLE   3         /* integer, long, float, double, address      */
146 #define TYPE_ADDRESS  4         /* all other types can be numbered arbitrarly */
147
148 #define TYPE_VOID    10
149
150
151 /* Java class file constants **************************************************/
152
153 #define MAGIC         0xcafebabe
154 #define MINOR_VERSION 0
155 #define MAJOR_VERSION 48
156
157 #define CONSTANT_Class                 7
158 #define CONSTANT_Fieldref              9
159 #define CONSTANT_Methodref            10
160 #define CONSTANT_InterfaceMethodref   11
161 #define CONSTANT_String                8
162 #define CONSTANT_Integer               3
163 #define CONSTANT_Float                 4
164 #define CONSTANT_Long                  5
165 #define CONSTANT_Double                6
166 #define CONSTANT_NameAndType          12
167 #define CONSTANT_Utf8                  1
168
169 #define CONSTANT_UNUSED                0
170
171 #define ACC_PUBLIC                0x0001
172 #define ACC_PRIVATE               0x0002
173 #define ACC_PROTECTED             0x0004
174 #define ACC_STATIC                0x0008
175 #define ACC_FINAL                 0x0010
176 #define ACC_SUPER                 0x0020
177 #define ACC_SYNCHRONIZED          0x0020
178 #define ACC_VOLATILE              0x0040
179 #define ACC_TRANSIENT             0x0080
180 #define ACC_NATIVE                0x0100
181 #define ACC_INTERFACE             0x0200
182 #define ACC_ABSTRACT              0x0400
183 #define ACC_STRICT                0x0800
184
185 /* resolve typedef cycles *****************************************************/
186
187 typedef struct utf utf;
188 typedef struct literalstring literalstring;
189 typedef struct java_objectheader java_objectheader; 
190 typedef struct classinfo classinfo; 
191 typedef struct _vftbl vftbl_t;
192 typedef u1* methodptr;
193 typedef struct fieldinfo  fieldinfo; 
194 typedef struct exceptiontable exceptiontable;
195 typedef struct methodinfo methodinfo; 
196 typedef struct lineinfo lineinfo; 
197 typedef struct arraydescriptor arraydescriptor;
198
199
200 /* constant pool entries *******************************************************
201
202         All constant pool entries need a data structure which contain the entrys
203         value. In some cases this structure exist already, in the remaining cases
204         this structure must be generated:
205
206                 kind                      structure                     generated?
207         ----------------------------------------------------------------------
208     CONSTANT_Class               classinfo                           no
209     CONSTANT_Fieldref            constant_FMIref                    yes
210     CONSTANT_Methodref           constant_FMIref                    yes
211     CONSTANT_InterfaceMethodref  constant_FMIref                    yes
212     CONSTANT_String              unicode                             no
213     CONSTANT_Integer             constant_integer                   yes
214     CONSTANT_Float               constant_float                     yes
215     CONSTANT_Long                constant_long                      yes
216     CONSTANT_Double              constant_double                    yes
217     CONSTANT_NameAndType         constant_nameandtype               yes
218     CONSTANT_Utf8                unicode                             no
219     CONSTANT_UNUSED              -
220
221 *******************************************************************************/
222
223 /* data structures for hashtables ********************************************
224
225
226         All utf-symbols, javastrings and classes are stored in global hashtables,
227         so every symbol exists only once. Equal symbols have identical pointers.
228         The functions for adding hashtable elements search the table for the 
229         element with the specified name/text and return it on success. Otherwise a 
230         new hashtable element is created.
231
232     The hashtables use external linking for handling collisions. The hashtable 
233         structure contains a pointer <ptr> to the array of hashtable slots. The 
234         number of hashtable slots and therefore the size of this array is specified 
235         by the element <size> of hashtable structure. <entries> contains the number
236         of all hashtable elements stored in the table, including those in the 
237         external chains.
238         The hashtable element structures (utf, literalstring, classinfo) contain
239         both a pointer to the next hashtable element as a link for the external hash 
240         chain and the key of the element. The key is computed from the text of
241         the string or the classname by using up to 8 characters.
242         
243         If the number of entries in the hashtable exceeds twice the size of the 
244         hashtableslot-array it is supposed that the average length of the 
245         external chains has reached a value beyond 2. Therefore the functions for
246         adding hashtable elements (utf_new, class_new, literalstring_new) double
247         the hashtableslot-array. In this restructuring process all elements have
248         to be inserted into the new hashtable and new external chains must be built.
249
250
251 example for the layout of a hashtable:
252
253 hashtable.ptr-->  +-------------------+
254                   |                   |
255                            ...
256                   |                   |
257                   +-------------------+   +-------------------+   +-------------------+
258                   | hashtable element |-->| hashtable element |-->| hashtable element |-->NULL
259                   +-------------------+   +-------------------+   +-------------------+
260                   | hashtable element |
261                   +-------------------+   +-------------------+   
262                   | hashtable element |-->| hashtable element |-->NULL
263                   +-------------------+   +-------------------+   
264                   | hashtable element |-->NULL
265                   +-------------------+
266                   |                   |
267                            ...
268                   |                   |
269                   +-------------------+
270
271 */
272
273
274 /* data structure for utf8 symbols ********************************************/
275
276 struct utf {
277         utf        *hashlink;       /* link for external hash chain               */
278         int         blength;        /* text length in bytes                       */           
279         char       *text;           /* pointer to text                            */
280 };
281
282
283 /* data structure of internal javastrings stored in global hashtable **********/
284
285 struct literalstring {
286         literalstring     *hashlink;     /* link for external hash chain          */
287         java_objectheader *string;  
288 };
289
290
291 /* data structure for storing information needed for a stacktrace across native functions*/
292 struct native_stackframeinfo {
293         void *oldThreadspecificHeadValue;
294         void **addressOfThreadspecificHead;
295         methodinfo *method;
296         void *returnToFromNative;
297
298 #if 0
299         void *returnFromNative;
300         void *addrReturnFromNative;
301         methodinfo *method;
302         struct native_stackframeinfo *next;
303         struct native_stackframeinfo *prev;
304 #endif
305 };
306
307 typedef struct native_stackframeinfo native_stackframeinfo;
308
309 struct stacktraceelement {
310 #if POINTERSIZE == 8
311         u8 linenumber;
312 #else
313         u4 linenumber;
314 #endif
315         methodinfo *method;
316 };
317
318 typedef struct stacktraceelement stacktraceelement;
319
320 /* data structure for calls from c code to java methods */
321
322 struct jni_callblock {
323         u8 itemtype;
324         u8 item;
325 };
326
327 typedef struct jni_callblock jni_callblock;
328
329
330 /* data structure for accessing hashtables ************************************/
331
332 typedef struct {            
333         u4 size;
334         u4 entries;        /* number of entries in the table */
335         void **ptr;        /* pointer to hashtable */
336 } hashtable;
337
338
339 /* data structures of remaining constant pool entries *************************/
340
341 typedef struct {            /* Fieldref, Methodref and InterfaceMethodref     */
342         classinfo *class;       /* class containing this field/method/interface   */
343         utf       *name;        /* field/method/interface name                    */
344         utf       *descriptor;  /* field/method/interface type descriptor string  */
345 } constant_FMIref;
346
347
348 typedef struct {            /* Integer                                        */
349         s4 value;
350 } constant_integer;
351
352         
353 typedef struct {            /* Float                                          */
354         float value;
355 } constant_float;
356
357
358 typedef struct {            /* Long                                           */
359         s8 value;
360 } constant_long;
361         
362
363 typedef struct {            /* Double                                         */
364         double value;
365 } constant_double;
366
367
368 typedef struct {            /* NameAndType (Field or Method)                  */
369         utf *name;              /* field/method name                              */
370         utf *descriptor;        /* field/method type descriptor string            */
371 } constant_nameandtype;
372
373
374 /* data structures of the runtime system **************************************/
375
376 /* objects *********************************************************************
377
378         All objects (and arrays) which resides on the heap need the following
379         header at the beginning of the data structure.
380 */
381
382 struct java_objectheader {              /* header for all objects             */
383         vftbl_t *vftbl;                     /* pointer to virtual function table  */
384 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
385         void *monitorPtr;
386 #endif
387 };
388
389
390
391 /* arrays **********************************************************************
392
393         All arrays are objects (they need the object header with a pointer
394         to a vftbl (array class table). There is one class for each array
395         type. The array type is described by an arraydescriptor struct
396         which is referenced by the vftbl.
397 */
398
399 /* CAUTION: Don't change the numerical values! These constants (with
400  * the exception of ARRAYTYPE_OBJECT) are used as indices in the
401  * primitive type table.
402  */
403 #define ARRAYTYPE_INT      PRIMITIVETYPE_INT
404 #define ARRAYTYPE_LONG     PRIMITIVETYPE_LONG
405 #define ARRAYTYPE_FLOAT    PRIMITIVETYPE_FLOAT
406 #define ARRAYTYPE_DOUBLE   PRIMITIVETYPE_DOUBLE
407 #define ARRAYTYPE_BYTE     PRIMITIVETYPE_BYTE
408 #define ARRAYTYPE_CHAR     PRIMITIVETYPE_CHAR
409 #define ARRAYTYPE_SHORT    PRIMITIVETYPE_SHORT
410 #define ARRAYTYPE_BOOLEAN  PRIMITIVETYPE_BOOLEAN
411 #define ARRAYTYPE_OBJECT   PRIMITIVETYPE_VOID     /* don't use as index! */
412
413 typedef struct java_arrayheader {       /* header for all arrays              */
414         java_objectheader objheader;        /* object header                      */
415         s4 size;                            /* array size                         */
416 #ifdef SIZE_FROM_CLASSINFO
417         s4 alignedsize; /* phil */
418 #endif
419 } java_arrayheader;
420
421
422
423 /* structs for all kinds of arrays ********************************************/
424
425 typedef struct java_chararray {
426         java_arrayheader header;
427         u2 data[1];
428 } java_chararray;
429
430 typedef struct java_floatheader {
431         java_arrayheader header;
432         float data[1];
433 } java_floatarray;
434
435 typedef struct java_doublearray {
436         java_arrayheader header;
437         double data[1];
438 } java_doublearray;
439
440 /*  booleanarray and bytearray need identical memory layout (access methods
441     use the same machine code */
442
443 typedef struct java_booleanarray {
444         java_arrayheader header;
445         u1 data[1];
446 } java_booleanarray;
447
448 typedef struct java_bytearray {
449         java_arrayheader header;
450         s1 data[1];
451 } java_bytearray;
452
453 typedef struct java_shortarray {
454         java_arrayheader header;
455         s2 data[1];
456 } java_shortarray;
457
458 typedef struct java_intarray {
459         java_arrayheader header;
460         s4 data[1];
461 } java_intarray;
462
463 typedef struct java_longarray {
464         java_arrayheader header;
465         s8 data[1];
466 } java_longarray;
467
468 /*  objectarray and arrayarray need identical memory layout (access methods
469     use the same machine code */
470
471 typedef struct java_objectarray {
472         java_arrayheader header;
473         java_objectheader *data[1];
474 } java_objectarray;
475
476
477 /* structure for primitive classes ********************************************/
478
479 typedef struct primitivetypeinfo {
480         classinfo *class_wrap;               /* class for wrapping primitive type */
481         classinfo *class_primitive;          /* primitive class                   */
482         char      *wrapname;                 /* name of class for wrapping        */
483         char      typesig;                   /* one character type signature      */
484         char      *name;                     /* name of primitive class           */
485         char      *arrayname;                /* name of primitive array class     */
486         classinfo *arrayclass;               /* primitive array class             */
487         vftbl_t     *arrayvftbl;             /* vftbl of primitive array class    */
488 } primitivetypeinfo;
489
490
491 /* field, method and class structures *****************************************/
492
493 #include "jit/sets.h"
494 typedef struct xtafldinfo {
495         bool       fieldChecked;                
496         classinfo *fldClassType;
497         classSet  *XTAclassSet;          /* field class type set                  */
498 } xtafldinfo;
499
500
501 /* fieldinfo ******************************************************************/
502
503 struct fieldinfo {            /* field of a class                                 */
504         s4  flags;            /* ACC flags                                        */
505         s4  type;             /* basic data type                                  */
506         utf *name;            /* name of field                                    */
507         utf *descriptor;      /* JavaVM descriptor string of field                */
508         
509         s4  offset;           /* offset from start of object (instance variables) */
510
511         imm_union value;      /* storage for static values (class variables)      */
512
513         classinfo *class;     /* needed by typechecker. Could be optimized        */
514                               /* away by using constant_FMIref instead of         */
515                               /* fieldinfo throughout the compiler.               */
516         
517         xtafldinfo *xta;
518 };
519
520
521 /* exceptiontable *************************************************************/
522
523 struct exceptiontable {         /* exceptiontable entry in a method           */
524         s4         startpc;         /* start pc of guarded area (inclusive)       */
525         struct basicblock *start;
526
527         s4         endpc;           /* end pc of guarded area (exklusive)         */
528         struct basicblock *end;
529
530         s4         handlerpc;       /* pc of exception handler                    */
531         struct basicblock *handler;
532
533         classinfo *catchtype;       /* catchtype of exception (NULL == catchall)  */
534         exceptiontable *next;       /* used to build a list of exception when     */
535                                     /* loops are copied */
536         exceptiontable *down;       /* instead of the old array, a list is used   */
537 };
538
539
540 /* methodinfo  static info ****************************************************/
541
542 typedef struct xtainfo {
543         s4          XTAmethodUsed;     /* XTA if used in callgraph - not used /used */
544         classSet    *XTAclassSet;      /* method class type set                 */ 
545         /*classSet      *PartClassSet */   /* method class type set                 */ 
546
547         classSetNode    *paramClassSet; /* cone set of methods parameters       */
548
549         methSet         *calls;            /* methods this method calls                 */ 
550         methSet         *calledBy;         /* methods that call this method         */ 
551         methSet         *marked;  //not in Dez         /* methods that marked by this method    */ 
552         methSet         *markedBy;
553         fldSet          *fldsUsed;         /* fields used by this method             */ 
554         /*methSetNode  *interfaceCalls*/   /* methods this method calls as interface */ 
555         bool           chgdSinceLastParse; /* Changed since last parse ?          */
556 } xtainfo; 
557
558
559 /* lineinfo *****************************************************************/
560
561 struct lineinfo {
562         u2 start_pc;
563         u2 line_number;
564 };
565
566
567 /* methodinfo *****************************************************************/
568
569 struct methodinfo {                 /* method structure                       */
570         s4             flags;               /* ACC flags                              */
571         utf       *name;                /* name of method                         */
572         utf       *descriptor;          /* JavaVM descriptor string of method     */
573         s4         returntype;          /* only temporary valid, return type      */
574         classinfo *returnclass;         /* pointer to classinfo for the rtn type  */ /*XTA*/ 
575         s4         paramcount;          /* only temporary valid, parameter count  */
576         u1        *paramtypes;          /* only temporary valid, parameter types  */
577         classinfo **paramclass;         /* pointer to classinfo for a parameter   */ /*XTA*/
578
579         bool       isleafmethod;        /* does method call subroutines           */
580
581         classinfo *class;               /* class, the method belongs to           */
582         s4         vftblindex;          /* index of method in virtual function table
583                                            (if it is a virtual method)            */
584         s4         maxstack;            /* maximum stack depth of method          */
585         s4         maxlocals;           /* maximum number of local variables      */
586         s4         jcodelength;         /* length of JavaVM code                  */
587         u1        *jcode;               /* pointer to JavaVM code                 */
588
589         s4         basicblockcount;     /* number of basic blocks                 */
590         struct basicblock *basicblocks; /* points to basic block array            */
591         s4        *basicblockindex;     /* a table which contains for every byte  */
592                                         /* of JavaVM code a basic block index if  */
593                                         /* at this byte is the start of a basic   */
594                                         /* block                                  */
595
596         s4         instructioncount;    /* number of JavaVM instructions          */
597         struct instruction *instructions; /* points to intermediate code instructions */
598
599         s4         stackcount;          /* number of stack elements               */
600         struct stackelement *stack;     /* points to intermediate code instructions */
601
602         s4         exceptiontablelength;/* exceptiontable length                  */
603         exceptiontable *exceptiontable; /* the exceptiontable                     */
604
605         u2        thrownexceptionscount;/*number of exceptions declared to be thrown by a method*/
606         classinfo **thrownexceptions;   /*array of classinfos of declared exceptions*/
607
608         u2         linenumbercount;     /* number of linenumber attributes        */
609         lineinfo  *linenumbers;         /* array of lineinfo items                */
610
611         struct registerdata *registerdata; /* struct with all regalloc stuff      */
612
613         u1        *stubroutine;         /* stub for compiling or calling natives  */
614         s4         mcodelength;         /* legth of generated machine code        */
615         u1        *mcode;               /* pointer to machine code                */
616         u1        *entrypoint;          /* entry point in machine code            */
617
618         /*rtainfo   rta;*/
619         xtainfo    *xta;
620
621         s4        methodUsed;           /* marked (might be used later) /not used /used */
622         s4        monoPoly;             /* call is mono or poly or unknown        */ /*RT stats */
623         /* should # method def'd and used be kept after static parse (will it be used?) */
624         s4        subRedefs;
625         s4        subRedefsUsed;
626         s4        nativelyoverloaded;           /*used in header.c and only valid there*/
627 };
628
629
630 /* innerclassinfo *************************************************************/
631
632 typedef struct innerclassinfo {
633         classinfo *inner_class;       /* inner class pointer                      */
634         classinfo *outer_class;       /* outer class pointer                      */
635         utf *name;                    /* innerclass name                          */ 
636         s4 flags;                     /* ACC flags                                */
637 } innerclassinfo;
638
639
640 /* classinfo ******************************************************************/
641
642 struct classinfo {                /* class structure                          */
643         java_objectheader header;     /* classes are also objects                 */
644         java_objectarray* signers;
645         struct java_security_ProtectionDomain* pd;
646         struct java_lang_VMClass* vmClass;
647         struct java_lang_reflect_Constructor* constructor;
648
649         s4 initializing_thread;       /* gnu classpath                            */
650         s4 erroneous_state;           /* gnu classpath                            */
651         struct gnu_classpath_RawData* vmData; /* gnu classpath                    */
652
653         s4          flags;            /* ACC flags                                */
654         utf        *name;             /* class name                               */
655
656         s4          cpcount;          /* number of entries in constant pool       */
657         u1         *cptags;           /* constant pool tags                       */
658         voidptr    *cpinfos;          /* pointer to constant pool info structures */
659
660         classinfo  *super;            /* super class pointer                      */
661         classinfo  *sub;              /* sub class pointer                        */
662         classinfo  *nextsub;          /* pointer to next class in sub class list  */
663
664         s4          interfacescount;  /* number of interfaces                     */
665         classinfo **interfaces;       /* pointer to interfaces                    */
666
667         s4          fieldscount;      /* number of fields                         */
668         fieldinfo  *fields;           /* field table                              */
669
670         s4          methodscount;     /* number of methods                        */
671         methodinfo *methods;          /* method table                             */
672
673         listnode    listnode;         /* linkage                                  */
674
675         bool        initialized;      /* true, if class already initialised       */
676         bool        initializing;     /* flag for the compiler                    */
677         bool        loaded;           /* true, if class already loaded            */
678         bool        linked;           /* true, if class already linked            */
679         s4          index;            /* hierarchy depth (classes) or index
680                                          (interfaces)                             */
681         s4          instancesize;     /* size of an instance of this class        */
682 #ifdef SIZE_FROM_CLASSINFO
683         s4          alignedsize;      /* size of an instance, aligned to the 
684                                                                          allocation size on the heap              */
685 #endif
686
687         vftbl_t      *vftbl;          /* pointer to virtual function table        */
688
689         methodinfo *finalizer;        /* finalizer method                         */
690
691     u2             innerclasscount;   /* number of inner classes              */
692     innerclassinfo *innerclass;
693
694     classinfo      *hashlink;         /* link for external hash chain         */
695         bool        classvftbl;       /* has its own copy of the Class vtbl       */
696
697         s4          classUsed;        /* 0= not used 1 = used   CO-RT             */
698
699         classSetNode *impldBy;        /* implemented by class set                 */
700         utf        *packagename;      /* full name of the package                 */
701         utf        *sourcefile;       /* classfile name containing this class     */
702         java_objectheader *classloader;       /* 0 for bootstrap classloader */
703 };
704
705 /* check if class is an array class. Only use for linked classes! */
706 #define CLASS_IS_ARRAY(clsinfo)  ((clsinfo)->vftbl->arraydesc != NULL)
707
708
709 /* virtual function table ******************************************************
710
711         The vtbl has a bidirectional layout with open ends at both sides.
712         interfacetablelength gives the number of entries of the interface table at
713         the start of the vftbl. The vftbl pointer points to &interfacetable[0].
714         vftbllength gives the number of entries of table at the end of the vftbl.
715
716         runtime type check (checkcast):
717
718         Different methods are used for runtime type check depending on the
719         argument of checkcast/instanceof.
720         
721         A check against a class is implemented via relative numbering on the class
722         hierachy tree. The tree is numbered in a depth first traversal setting
723         the base field and the diff field. The diff field gets the result of
724         (high - base) so that a range check can be implemented by an unsigned
725         compare. A sub type test is done by checking the inclusion of base of
726         the sub class in the range of the superclass.
727
728         A check against an interface is implemented via the interfacevftbl. If the
729         interfacevftbl contains a nonnull value a class is a subclass of this
730         interface.
731
732         interfacetable:
733
734         Like standard virtual methods interface methods are called using
735         virtual function tables. All interfaces are numbered sequentially
736         (starting with zero). For each class there exist an interface table
737         of virtual function tables for each implemented interface. The length
738         of the interface table is determined by the highest number of an
739         implemented interface.
740
741         The following example assumes a class which implements interface 0 and 3:
742
743         interfacetablelength = 4
744
745                   | ...       |            +----------+
746                       +-----------+            | method 2 |---> method z
747                       | class     |            | method 1 |---> method y
748                       +-----------+            | method 0 |---> method x
749                       | ivftbl  0 |----------> +----------+
750         vftblptr ---> +-----------+
751                   | ivftbl -1 |--> NULL    +----------+
752                   | ivftbl -2 |--> NULL    | method 1 |---> method x
753                   | ivftbl -3 |-----+      | method 0 |---> method a
754                   +-----------+     +----> +----------+
755      
756                               +---------------+
757                                   | length 3 = 2  |
758                                   | length 2 = 0  |
759                                   | length 1 = 0  |
760                                   | length 0 = 3  |
761         interfacevftbllength ---> +---------------+
762
763 *******************************************************************************/
764
765 struct _vftbl {
766         methodptr   *interfacetable[1];    /* interface table (access via macro)  */
767
768         classinfo   *class;                /* class, the vtbl belongs to          */
769
770         arraydescriptor *arraydesc;        /* for array classes, otherwise NULL   */
771
772         s4           vftbllength;          /* virtual function table length       */
773         s4           interfacetablelength; /* interface table length              */
774
775         s4           baseval;              /* base for runtime type check         */
776                                            /* (-index for interfaces)             */
777         s4           diffval;              /* high - base for runtime type check  */
778
779         s4          *interfacevftbllength; /* length of interface vftbls          */
780         
781         methodptr    table[1];             /* class vftbl                         */
782 };
783
784 #define VFTBLINTERFACETABLE(v,i)       (v)->interfacetable[-i]
785
786
787 /* arraydescriptor ************************************************************
788
789     For every array class an arraydescriptor is allocated which
790     describes the array class.
791         The arraydescriptor is referenced from the vftbl of the array
792         class.
793
794 *******************************************************************************/
795
796 struct arraydescriptor {
797         vftbl_t *componentvftbl; /* vftbl of the component type, NULL for primit. */
798         vftbl_t *elementvftbl;   /* vftbl of the element type, NULL for primitive */
799         short  arraytype;        /* ARRAYTYPE_* constant                          */
800         short  dimension;        /* dimension of the array (always >= 1)          */
801     s4     dataoffset;       /* offset of the array data from object pointer  */
802         s4     componentsize;    /* size of a component in bytes                  */
803         short  elementtype;      /* ARRAYTYPE_* constant                          */
804 };
805
806
807 /* flag variables *************************************************************/
808
809 extern bool cacao_initializing;
810
811 #ifdef TYPECHECK_VERBOSE_OPT
812 extern bool typecheckverbose;
813 #endif
814
815 /*extern int pClassHeir;*/
816 /*extern int pCallgraph;*/
817 /*extern int pOpcodes;*/
818 /*extern int pStats;*/
819
820 /*extern void RT_jit_parse(methodinfo *m);*/
821
822
823 /* table of primitive types ***************************************************/
824
825 /* This array can be indexed by the PRIMITIVETYPE_ and ARRAYTYPE_
826  * constants (except ARRAYTYPE_OBJECT).
827  */
828 extern primitivetypeinfo primitivetype_table[PRIMITIVETYPE_COUNT];
829
830
831 /* macros for descriptor parsing **********************************************/
832
833 /* SKIP_FIELDDESCRIPTOR:
834  * utf_ptr must point to the first character of a field descriptor.
835  * After the macro call utf_ptr points to the first character after
836  * the field descriptor.
837  *
838  * CAUTION: This macro does not check for an unexpected end of the
839  * descriptor. Better use SKIP_FIELDDESCRIPTOR_SAFE.
840  */
841 #define SKIP_FIELDDESCRIPTOR(utf_ptr)                                                   \
842         do { while (*(utf_ptr)=='[') (utf_ptr)++;                                       \
843                 if (*(utf_ptr)++=='L')                                                                  \
844                         while(*(utf_ptr)++ != ';') /* skip */; } while(0)
845
846 /* SKIP_FIELDDESCRIPTOR_SAFE:
847  * utf_ptr must point to the first character of a field descriptor.
848  * After the macro call utf_ptr points to the first character after
849  * the field descriptor.
850  *
851  * Input:
852  *     utf_ptr....points to first char of descriptor
853  *     end_ptr....points to first char after the end of the string
854  *     errorflag..must be initialized (to false) by the caller!
855  * Output:
856  *     utf_ptr....points to first char after the descriptor
857  *     errorflag..set to true if the string ended unexpectedly
858  */
859 #define SKIP_FIELDDESCRIPTOR_SAFE(utf_ptr,end_ptr,errorflag)                    \
860         do { while ((utf_ptr) != (end_ptr) && *(utf_ptr)=='[') (utf_ptr)++;     \
861                 if ((utf_ptr) == (end_ptr))                                                                             \
862                         (errorflag) = true;                                                                                     \
863                 else                                                                                                                    \
864                         if (*(utf_ptr)++=='L') {                                                                        \
865                                 while((utf_ptr) != (end_ptr) && *(utf_ptr)++ != ';')    \
866                                         /* skip */;                                                                                     \
867                                 if ((utf_ptr)[-1] != ';')                                                               \
868                                         (errorflag) = true; }} while(0)
869
870
871 /* Synchronization ************************************************************/
872
873 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
874 void cast_lock();
875 void cast_unlock();
876 void compiler_lock();
877 void compiler_unlock();
878 #endif
879
880 #endif /* _GLOBAL_H */
881
882
883 /*
884  * These are local overrides for various environment variables in Emacs.
885  * Please do not remove this and leave it at the end of the file, where
886  * Emacs will automagically detect them.
887  * ---------------------------------------------------------------------
888  * Local variables:
889  * mode: c
890  * indent-tabs-mode: t
891  * c-basic-offset: 4
892  * tab-width: 4
893  * End:
894  */