jamvm
view src/jam.h @ 402:24373fc1d951
Add additional tracing support.
2008-08-04 Andrew John Hughes <gnu_andrew@member.fsf.org>
* .hgignore: Updated with autogen.sh output.
* configure.ac: Add new trace options.
* src/class.c,
* src/excep.c,
* src/natives.c,
* src/resolve.c: Add trace support.
* src/jam.h,
* src/dll.c,
* src/os/linux/os.c: Add support for reporting
the linking error using dlerror.
2008-08-04 Andrew John Hughes <gnu_andrew@member.fsf.org>
* .hgignore: Updated with autogen.sh output.
* configure.ac: Add new trace options.
* src/class.c,
* src/excep.c,
* src/natives.c,
* src/resolve.c: Add trace support.
* src/jam.h,
* src/dll.c,
* src/os/linux/os.c: Add support for reporting
the linking error using dlerror.
| author | andrew |
|---|---|
| date | Tue Aug 05 05:46:09 2008 +0100 (2008-08-05) |
| parents | ef6fa16d00f7 |
| children | 907df5a02819 |
line source
1 /*
2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
3 * Robert Lougher <rob@lougher.org.uk>.
4 *
5 * This file is part of JamVM.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2,
10 * or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 */
22 #include <stdarg.h>
23 #include <inttypes.h>
24 #include <limits.h>
25 #include <stdio.h>
27 /* Configure options */
28 #include "config.h"
30 /* Architecture dependent definitions */
31 #include "arch.h"
33 #ifndef TRUE
34 #define TRUE 1
35 #define FALSE 0
36 #endif
38 /* These should go in the interpreter file */
40 #define OPC_NOP 0
41 #define OPC_ACONST_NULL 1
42 #define OPC_ICONST_M1 2
43 #define OPC_ICONST_0 3
44 #define OPC_ICONST_1 4
45 #define OPC_ICONST_2 5
46 #define OPC_ICONST_3 6
47 #define OPC_ICONST_4 7
48 #define OPC_ICONST_5 8
49 #define OPC_LCONST_0 9
50 #define OPC_LCONST_1 10
51 #define OPC_FCONST_0 11
52 #define OPC_FCONST_1 12
53 #define OPC_FCONST_2 13
54 #define OPC_DCONST_0 14
55 #define OPC_DCONST_1 15
56 #define OPC_BIPUSH 16
57 #define OPC_SIPUSH 17
58 #define OPC_LDC 18
59 #define OPC_LDC_W 19
60 #define OPC_LDC2_W 20
61 #define OPC_ILOAD 21
62 #define OPC_LLOAD 22
63 #define OPC_FLOAD 23
64 #define OPC_DLOAD 24
65 #define OPC_ALOAD 25
66 #define OPC_ILOAD_0 26
67 #define OPC_ILOAD_1 27
68 #define OPC_ILOAD_2 28
69 #define OPC_ILOAD_3 29
70 #define OPC_LLOAD_0 30
71 #define OPC_LLOAD_1 31
72 #define OPC_LLOAD_2 32
73 #define OPC_LLOAD_3 33
74 #define OPC_FLOAD_0 34
75 #define OPC_FLOAD_1 35
76 #define OPC_FLOAD_2 36
77 #define OPC_FLOAD_3 37
78 #define OPC_DLOAD_0 38
79 #define OPC_DLOAD_1 39
80 #define OPC_DLOAD_2 40
81 #define OPC_DLOAD_3 41
82 #define OPC_ALOAD_0 42
83 #define OPC_ALOAD_1 43
84 #define OPC_ALOAD_2 44
85 #define OPC_ALOAD_3 45
86 #define OPC_IALOAD 46
87 #define OPC_LALOAD 47
88 #define OPC_FALOAD 48
89 #define OPC_DALOAD 49
90 #define OPC_AALOAD 50
91 #define OPC_BALOAD 51
92 #define OPC_CALOAD 52
93 #define OPC_SALOAD 53
94 #define OPC_ISTORE 54
95 #define OPC_LSTORE 55
96 #define OPC_FSTORE 56
97 #define OPC_DSTORE 57
98 #define OPC_ASTORE 58
99 #define OPC_ISTORE_0 59
100 #define OPC_ISTORE_1 60
101 #define OPC_ISTORE_2 61
102 #define OPC_ISTORE_3 62
103 #define OPC_LSTORE_0 63
104 #define OPC_LSTORE_1 64
105 #define OPC_LSTORE_2 65
106 #define OPC_LSTORE_3 66
107 #define OPC_FSTORE_0 67
108 #define OPC_FSTORE_1 68
109 #define OPC_FSTORE_2 69
110 #define OPC_FSTORE_3 70
111 #define OPC_DSTORE_0 71
112 #define OPC_DSTORE_1 72
113 #define OPC_DSTORE_2 73
114 #define OPC_DSTORE_3 74
115 #define OPC_ASTORE_0 75
116 #define OPC_ASTORE_1 76
117 #define OPC_ASTORE_2 77
118 #define OPC_ASTORE_3 78
119 #define OPC_IASTORE 79
120 #define OPC_LASTORE 80
121 #define OPC_FASTORE 81
122 #define OPC_DASTORE 82
123 #define OPC_AASTORE 83
124 #define OPC_BASTORE 84
125 #define OPC_CASTORE 85
126 #define OPC_SASTORE 86
127 #define OPC_POP 87
128 #define OPC_POP2 88
129 #define OPC_DUP 89
130 #define OPC_DUP_X1 90
131 #define OPC_DUP_X2 91
132 #define OPC_DUP2 92
133 #define OPC_DUP2_X1 93
134 #define OPC_DUP2_X2 94
135 #define OPC_SWAP 95
136 #define OPC_IADD 96
137 #define OPC_LADD 97
138 #define OPC_FADD 98
139 #define OPC_DADD 99
140 #define OPC_ISUB 100
141 #define OPC_LSUB 101
142 #define OPC_FSUB 102
143 #define OPC_DSUB 103
144 #define OPC_IMUL 104
145 #define OPC_LMUL 105
146 #define OPC_FMUL 106
147 #define OPC_DMUL 107
148 #define OPC_IDIV 108
149 #define OPC_LDIV 109
150 #define OPC_FDIV 110
151 #define OPC_DDIV 111
152 #define OPC_IREM 112
153 #define OPC_LREM 113
154 #define OPC_FREM 114
155 #define OPC_DREM 115
156 #define OPC_INEG 116
157 #define OPC_LNEG 117
158 #define OPC_FNEG 118
159 #define OPC_DNEG 119
160 #define OPC_ISHL 120
161 #define OPC_LSHL 121
162 #define OPC_ISHR 122
163 #define OPC_LSHR 123
164 #define OPC_IUSHR 124
165 #define OPC_LUSHR 125
166 #define OPC_IAND 126
167 #define OPC_LAND 127
168 #define OPC_IOR 128
169 #define OPC_LOR 129
170 #define OPC_IXOR 130
171 #define OPC_LXOR 131
172 #define OPC_IINC 132
173 #define OPC_I2L 133
174 #define OPC_I2F 134
175 #define OPC_I2D 135
176 #define OPC_L2I 136
177 #define OPC_L2F 137
178 #define OPC_L2D 138
179 #define OPC_F2I 139
180 #define OPC_F2L 140
181 #define OPC_F2D 141
182 #define OPC_D2I 142
183 #define OPC_D2L 143
184 #define OPC_D2F 144
185 #define OPC_I2B 145
186 #define OPC_I2C 146
187 #define OPC_I2S 147
188 #define OPC_LCMP 148
189 #define OPC_FCMPL 149
190 #define OPC_FCMPG 150
191 #define OPC_DCMPL 151
192 #define OPC_DCMPG 152
193 #define OPC_IFEQ 153
194 #define OPC_IFNE 154
195 #define OPC_IFLT 155
196 #define OPC_IFGE 156
197 #define OPC_IFGT 157
198 #define OPC_IFLE 158
199 #define OPC_IF_ICMPEQ 159
200 #define OPC_IF_ICMPNE 160
201 #define OPC_IF_ICMPLT 161
202 #define OPC_IF_ICMPGE 162
203 #define OPC_IF_ICMPGT 163
204 #define OPC_IF_ICMPLE 164
205 #define OPC_IF_ACMPEQ 165
206 #define OPC_IF_ACMPNE 166
207 #define OPC_GOTO 167
208 #define OPC_JSR 168
209 #define OPC_RET 169
210 #define OPC_TABLESWITCH 170
211 #define OPC_LOOKUPSWITCH 171
212 #define OPC_IRETURN 172
213 #define OPC_LRETURN 173
214 #define OPC_FRETURN 174
215 #define OPC_DRETURN 175
216 #define OPC_ARETURN 176
217 #define OPC_RETURN 177
218 #define OPC_GETSTATIC 178
219 #define OPC_PUTSTATIC 179
220 #define OPC_GETFIELD 180
221 #define OPC_PUTFIELD 181
222 #define OPC_INVOKEVIRTUAL 182
223 #define OPC_INVOKESPECIAL 183
224 #define OPC_INVOKESTATIC 184
225 #define OPC_INVOKEINTERFACE 185
226 #define OPC_NEW 187
227 #define OPC_NEWARRAY 188
228 #define OPC_ANEWARRAY 189
229 #define OPC_ARRAYLENGTH 190
230 #define OPC_ATHROW 191
231 #define OPC_CHECKCAST 192
232 #define OPC_INSTANCEOF 193
233 #define OPC_MONITORENTER 194
234 #define OPC_MONITOREXIT 195
235 #define OPC_WIDE 196
236 #define OPC_MULTIANEWARRAY 197
237 #define OPC_IFNULL 198
238 #define OPC_IFNONNULL 199
239 #define OPC_GOTO_W 200
240 #define OPC_JSR_W 201
241 #define OPC_LDC_QUICK 203
242 #define OPC_LDC_W_QUICK 204
243 #define OPC_GETFIELD_QUICK 206
244 #define OPC_PUTFIELD_QUICK 207
245 #define OPC_GETFIELD2_QUICK 208
246 #define OPC_PUTFIELD2_QUICK 209
247 #define OPC_GETSTATIC_QUICK 210
248 #define OPC_PUTSTATIC_QUICK 211
249 #define OPC_GETSTATIC2_QUICK 212
250 #define OPC_PUTSTATIC2_QUICK 213
251 #define OPC_INVOKEVIRTUAL_QUICK 214
252 #define OPC_INVOKENONVIRTUAL_QUICK 215
253 #define OPC_INVOKESUPER_QUICK 216
254 #define OPC_INVOKEVIRTUAL_QUICK_W 226
255 #define OPC_GETFIELD_QUICK_W 227
256 #define OPC_PUTFIELD_QUICK_W 228
257 #define OPC_GETFIELD_THIS 229
258 #define OPC_LOCK 230
259 #define OPC_ALOAD_THIS 231
260 #define OPC_INVOKESTATIC_QUICK 232
261 #define OPC_NEW_QUICK 233
262 #define OPC_ANEWARRAY_QUICK 235
263 #define OPC_CHECKCAST_QUICK 238
264 #define OPC_INSTANCEOF_QUICK 239
265 #define OPC_MULTIANEWARRAY_QUICK 243
266 #define OPC_INVOKEINTERFACE_QUICK 244
267 #define OPC_ABSTRACT_METHOD_ERROR 245
268 #define OPC_INLINE_REWRITER 246
270 #define CONSTANT_Utf8 1
271 #define CONSTANT_Integer 3
272 #define CONSTANT_Float 4
273 #define CONSTANT_Long 5
274 #define CONSTANT_Double 6
275 #define CONSTANT_Class 7
276 #define CONSTANT_String 8
277 #define CONSTANT_Fieldref 9
278 #define CONSTANT_Methodref 10
279 #define CONSTANT_InterfaceMethodref 11
280 #define CONSTANT_NameAndType 12
282 #define CONSTANT_Resolved 20
283 #define CONSTANT_ResolvedClass 25
284 #define CONSTANT_ResolvedString 26
285 #define CONSTANT_Locked 21
287 #define ACC_PUBLIC 0x0001
288 #define ACC_PRIVATE 0x0002
289 #define ACC_PROTECTED 0x0004
290 #define ACC_STATIC 0x0008
291 #define ACC_FINAL 0x0010
292 #define ACC_SYNCHRONIZED 0x0020
293 #define ACC_SUPER 0x0020
294 #define ACC_VOLATILE 0x0040
295 #define ACC_TRANSIENT 0x0080
296 #define ACC_NATIVE 0x0100
297 #define ACC_INTERFACE 0x0200
298 #define ACC_ABSTRACT 0x0400
299 #define ACC_SYNTHETIC 0x1000
300 #define ACC_ANNOTATION 0x2000
301 #define ACC_ENUM 0x4000
302 #define ACC_MIRANDA 0x0800
304 #define T_BOOLEAN 4
305 #define T_CHAR 5
306 #define T_FLOAT 6
307 #define T_DOUBLE 7
308 #define T_BYTE 8
309 #define T_SHORT 9
310 #define T_INT 10
311 #define T_LONG 11
313 /* Class states */
315 #define CLASS_LOADED 1
316 #define CLASS_LINKED 2
317 #define CLASS_BAD 3
318 #define CLASS_INITING 4
319 #define CLASS_INITED 5
321 #define CLASS_ARRAY 6
322 #define CLASS_PRIM 7
324 /* Class flags */
326 #define CLASS_CLASS 1
327 #define REFERENCE 2
328 #define SOFT_REFERENCE 4
329 #define WEAK_REFERENCE 8
330 #define PHANTOM_REFERENCE 16
331 #define FINALIZED 32
332 #define CLASS_LOADER 64
333 #define CLASS_CLASH 128
334 #define VMTHROWABLE 256
335 #define ANONYMOUS 512
336 #define VMTHREAD 1024
338 typedef unsigned char u1;
339 typedef unsigned short u2;
340 typedef unsigned int u4;
341 typedef unsigned long long u8;
343 typedef uintptr_t ConstantPoolEntry;
345 typedef struct constant_pool {
346 volatile u1 *type;
347 ConstantPoolEntry *info;
348 } ConstantPool;
350 typedef struct exception_table_entry {
351 u2 start_pc;
352 u2 end_pc;
353 u2 handler_pc;
354 u2 catch_type;
355 } ExceptionTableEntry;
357 typedef struct line_no_table_entry {
358 u2 start_pc;
359 u2 line_no;
360 } LineNoTableEntry;
362 typedef struct object Class;
364 typedef struct object {
365 uintptr_t lock;
366 Class *class;
367 } Object;
369 #ifdef DIRECT
370 typedef union ins_operand {
371 uintptr_t u;
372 int i;
373 struct {
374 signed short i1;
375 signed short i2;
376 } ii;
377 struct {
378 unsigned short u1;
379 unsigned short u2;
380 } uu;
381 struct {
382 unsigned short u1;
383 unsigned char u2;
384 char i;
385 } uui;
386 void *pntr;
387 } Operand;
389 typedef struct instruction {
390 #ifdef DIRECT_DEBUG
391 unsigned char opcode;
392 char cache_depth;
393 short bytecode_pc;
394 #endif
395 const void *handler;
396 Operand operand;
397 } Instruction;
399 typedef struct switch_table {
400 int low;
401 int high;
402 Instruction *deflt;
403 Instruction **entries;
404 } SwitchTable;
406 typedef struct lookup_entry {
407 int key;
408 Instruction *handler;
409 } LookupEntry;
411 typedef struct lookup_table {
412 int num_entries;
413 Instruction *deflt;
414 LookupEntry *entries;
415 } LookupTable;
417 #ifdef INLINING
418 typedef struct opcode_info {
419 unsigned char opcode;
420 unsigned char cache_depth;
421 } OpcodeInfo;
423 typedef struct code_block {
424 int length;
425 Instruction *start;
426 OpcodeInfo *opcodes;
427 } CodeBlock;
429 typedef struct quick_prepare_info {
430 CodeBlock block;
431 Instruction *quickened;
432 struct quick_prepare_info *next;
433 } QuickPrepareInfo;
435 typedef struct prepare_info {
436 CodeBlock block;
437 Operand operand;
438 } PrepareInfo;
439 #endif
441 typedef Instruction *CodePntr;
442 #else
443 typedef unsigned char *CodePntr;
444 #endif
446 typedef struct annotation_data {
447 u1 *data;
448 int len;
449 } AnnotationData;
451 typedef struct method_annotation_data {
452 AnnotationData *annotations;
453 AnnotationData *parameters;
454 AnnotationData *dft_val;
455 } MethodAnnotationData;
457 typedef struct methodblock {
458 Class *class;
459 char *name;
460 char *type;
461 char *signature;
462 u2 access_flags;
463 u2 max_stack;
464 u2 max_locals;
465 u2 args_count;
466 u2 throw_table_size;
467 u2 exception_table_size;
468 u2 line_no_table_size;
469 int native_extra_arg;
470 void *native_invoker;
471 void *code;
472 int code_size;
473 u2 *throw_table;
474 ExceptionTableEntry *exception_table;
475 LineNoTableEntry *line_no_table;
476 int method_table_index;
477 MethodAnnotationData *annotations;
478 #ifdef INLINING
479 QuickPrepareInfo *quick_prepare_info;
480 #endif
481 } MethodBlock;
483 typedef struct fieldblock {
484 Class *class;
485 char *name;
486 char *type;
487 char *signature;
488 u2 access_flags;
489 u2 constant;
490 uintptr_t static_value;
491 u4 offset;
492 AnnotationData *annotations;
493 } FieldBlock;
495 typedef struct itable_entry {
496 Class *interface;
497 int *offsets;
498 } ITableEntry;
500 typedef struct refs_offsets_entry {
501 int start;
502 int end;
503 } RefsOffsetsEntry;
505 #define CLASS_PAD_SIZE 4
507 typedef struct classblock {
508 uintptr_t pad[CLASS_PAD_SIZE];
509 char *name;
510 char *signature;
511 char *super_name;
512 char *source_file_name;
513 Class *super;
514 u1 state;
515 u2 flags;
516 u2 access_flags;
517 u2 interfaces_count;
518 u2 fields_count;
519 u2 methods_count;
520 u2 constant_pool_count;
521 int object_size;
522 FieldBlock *fields;
523 MethodBlock *methods;
524 Class **interfaces;
525 ConstantPool constant_pool;
526 int method_table_size;
527 MethodBlock **method_table;
528 int imethod_table_size;
529 ITableEntry *imethod_table;
530 Class *element_class;
531 int initing_tid;
532 int dim;
533 Object *class_loader;
534 u2 declaring_class;
535 u2 inner_access_flags;
536 u2 inner_class_count;
537 u2 *inner_classes;
538 int refs_offsets_size;
539 RefsOffsetsEntry *refs_offsets_table;
540 u2 enclosing_class;
541 u2 enclosing_method;
542 AnnotationData *annotations;
543 } ClassBlock;
545 typedef struct frame {
546 CodePntr last_pc;
547 uintptr_t *lvars;
548 uintptr_t *ostack;
549 MethodBlock *mb;
550 struct frame *prev;
551 } Frame;
553 typedef struct jni_frame {
554 Object **next_ref;
555 Object **lrefs;
556 uintptr_t *ostack;
557 MethodBlock *mb;
558 struct frame *prev;
559 } JNIFrame;
561 typedef struct exec_env {
562 Object *exception;
563 char *stack;
564 char *stack_end;
565 int stack_size;
566 Frame *last_frame;
567 Object *thread;
568 char overflow;
569 } ExecEnv;
571 typedef struct prop {
572 char *key;
573 char *value;
574 } Property;
576 typedef struct InitArgs {
577 int noasyncgc;
578 int verbosegc;
579 int verbosedll;
580 int verboseclass;
582 int compact_specified; /* Whether compaction has been given on the
583 command line, and the value if it has */
584 int do_compact;
586 char *classpath;
587 char *bootpath;
588 char bootpathopt;
590 int java_stack;
591 unsigned long min_heap;
592 unsigned long max_heap;
594 Property *commandline_props;
595 int props_count;
597 void *main_stack_base;
599 /* JNI invocation API hooks */
601 int (*vfprintf)(FILE *stream, const char *fmt, va_list ap);
602 void (*exit)(int status);
603 void (*abort)(void);
605 #ifdef INLINING
606 unsigned int codemem;
607 int replication;
608 #endif
609 } InitArgs;
611 #define CLASS_CB(classRef) ((ClassBlock*)(classRef+1))
612 #define INST_DATA(objectRef) ((uintptr_t*)(objectRef+1))
614 #define ARRAY_DATA(arrayRef) ((void*)(((u4*)(arrayRef+1))+1))
615 #define ARRAY_LEN(arrayRef) *(u4*)(arrayRef+1)
617 #define IS_CLASS(object) (object->class && IS_CLASS_CLASS(CLASS_CB(object->class)))
619 #define IS_INTERFACE(cb) (cb->access_flags & ACC_INTERFACE)
620 #define IS_SYNTHETIC(cb) (cb->access_flags & ACC_SYNTHETIC)
621 #define IS_ANNOTATION(cb) (cb->access_flags & ACC_ANNOTATION)
622 #define IS_ENUM(cb) (cb->access_flags & ACC_ENUM)
623 #define IS_ARRAY(cb) (cb->state == CLASS_ARRAY)
624 #define IS_PRIMITIVE(cb) (cb->state >= CLASS_PRIM)
626 #define IS_FINALIZED(cb) (cb->flags & FINALIZED)
627 #define IS_REFERENCE(cb) (cb->flags & REFERENCE)
628 #define IS_SOFT_REFERENCE(cb) (cb->flags & SOFT_REFERENCE)
629 #define IS_WEAK_REFERENCE(cb) (cb->flags & WEAK_REFERENCE)
630 #define IS_PHANTOM_REFERENCE(cb) (cb->flags & PHANTOM_REFERENCE)
631 #define IS_CLASS_LOADER(cb) (cb->flags & CLASS_LOADER)
632 #define IS_CLASS_DUP(cb) (cb->flags & CLASS_CLASH)
633 #define IS_CLASS_CLASS(cb) (cb->flags & CLASS_CLASS)
634 #define IS_VMTHROWABLE(cb) (cb->flags & VMTHROWABLE)
635 #define IS_VMTHREAD(cb) (cb->flags & VMTHREAD)
636 #define IS_ANONYMOUS(cb) (cb->flags & ANONYMOUS)
637 #define IS_SPECIAL(cb) (cb->flags & (REFERENCE | CLASS_LOADER | VMTHREAD))
639 #define IS_MEMBER(cb) cb->declaring_class
640 #define IS_LOCAL(cb) (cb->enclosing_method && !IS_ANONYMOUS(cb))
642 /* Macros for accessing constant pool entries */
644 #define CP_TYPE(cp,i) cp->type[i]
645 #define CP_INFO(cp,i) cp->info[i]
646 #define CP_CLASS(cp,i) (u2)cp->info[i]
647 #define CP_STRING(cp,i) (u2)cp->info[i]
648 #define CP_METHOD_CLASS(cp,i) (u2)cp->info[i]
649 #define CP_METHOD_NAME_TYPE(cp,i) (u2)(cp->info[i]>>16)
650 #define CP_INTERFACE_CLASS(cp,i) (u2)cp->info[i]
651 #define CP_INTERFACE_NAME_TYPE(cp,i) (u2)(cp->info[i]>>16)
652 #define CP_FIELD_CLASS(cp,i) (u2)cp->info[i]
653 #define CP_FIELD_NAME_TYPE(cp,i) (u2)(cp->info[i]>>16)
654 #define CP_NAME_TYPE_NAME(cp,i) (u2)cp->info[i]
655 #define CP_NAME_TYPE_TYPE(cp,i) (u2)(cp->info[i]>>16)
656 #define CP_UTF8(cp,i) (char *)(cp->info[i])
658 #define CP_INTEGER(cp,i) (int)(cp->info[i])
659 #define CP_FLOAT(cp,i) *(float *)&(cp->info[i])
660 #define CP_LONG(cp,i) *(long long *)&(cp->info[i])
661 #define CP_DOUBLE(cp,i) *(double *)&(cp->info[i])
663 #define KB 1024
664 #define MB (KB*KB)
666 /* minimum allowable size of object heap */
667 #define MIN_HEAP 4*KB
669 /* minimum allowable size of the Java stack */
670 #define MIN_STACK 2*KB
672 /* default minimum size of object heap */
673 #ifndef DEFAULT_MIN_HEAP
674 #define DEFAULT_MIN_HEAP 2*MB
675 #endif
677 /* default maximum size of object heap */
678 #ifndef DEFAULT_MAX_HEAP
679 #define DEFAULT_MAX_HEAP 128*MB
680 #endif
682 /* default size of the Java stack */
683 #define DEFAULT_STACK 64*KB
685 /* size of emergency area - big enough to create
686 a StackOverflow exception */
687 #define STACK_RED_ZONE_SIZE 1*KB
689 #define JAVA_COMPAT_VERSION "1.5.0"
691 /* --------------------- Function prototypes --------------------------- */
693 /* Alloc */
695 extern void initialiseAlloc(InitArgs *args);
696 extern void initialiseGC(InitArgs *args);
697 extern Class *allocClass();
698 extern Object *allocObject(Class *class);
699 extern Object *allocTypeArray(int type, int size);
700 extern Object *allocArray(Class *class, int size, int el_size);
701 extern Object *allocMultiArray(Class *array_class, int dim, intptr_t *count);
702 extern Object *cloneObject(Object *ob);
703 extern void markRoot(Object *ob);
704 extern void markConservativeRoot(Object *ob);
705 extern void markObject(Object *ob, int mark, int mark_soft_refs);
706 extern uintptr_t getObjectHashcode(Object *ob);
708 extern void gc1();
709 extern void runFinalizers();
711 extern unsigned long freeHeapMem();
712 extern unsigned long totalHeapMem();
713 extern unsigned long maxHeapMem();
715 extern void *sysMalloc(int n);
716 extern void sysFree(void *ptr);
717 extern void *sysRealloc(void *ptr, int n);
719 extern void *gcMemMalloc(int n);
720 extern void gcMemFree(void *ptr);
721 extern void *gcMemRealloc(void *ptr, int n);
723 extern void registerStaticObjectRef(Object **ob);
724 extern void registerStaticObjectRefLocked(Object **ob);
726 #define registerStaticClassRef(ref) \
727 registerStaticObjectRef(ref);
729 #define registerStaticClassRefLocked(ref) \
730 registerStaticObjectRefLocked(ref);
732 extern void gcPendingFree(void *addr);
734 /* GC support */
735 extern void threadReference(Object **ref);
736 extern int isMarked(Object *ob);
738 /* Class */
740 extern Class *java_lang_Class;
742 extern Class *defineClass(char *classname, char *data, int offset, int len, Object *class_loader);
743 extern void linkClass(Class *class);
744 extern Class *initClass(Class *class);
745 extern Class *findSystemClass(char *);
746 extern Class *findSystemClass0(char *);
747 extern Class *loadSystemClass(char *);
749 extern Class *findHashedClass(char *, Object *);
750 extern Class *findPrimitiveClass(char);
751 extern Class *findArrayClassFromClassLoader(char *, Object *);
753 extern Object *getSystemClassLoader();
755 extern int bootClassPathSize();
756 extern Object *bootClassPathResource(char *filename, int index);
758 #define findArrayClassFromClass(name, class) \
759 findArrayClassFromClassLoader(name, CLASS_CB(class)->class_loader)
760 #define findArrayClass(name) findArrayClassFromClassLoader(name, NULL)
762 extern Class *findClassFromClassLoader(char *, Object *);
763 #define findClassFromClass(name, class) \
764 findClassFromClassLoader(name, CLASS_CB(class)->class_loader)
766 extern void freeClassData(Class *class);
767 extern void freeClassLoaderData(Object *class_loader);
769 extern char *getClassPath();
770 extern char *getBootClassPath();
772 extern void markBootClasses();
773 extern void markLoaderClasses(Object *loader, int mark, int mark_soft_refs);
774 extern void threadBootClasses();
775 extern void threadLoaderClasses(Object *class_loader);
776 extern void newLibraryUnloader(Object *class_loader, void *entry);
777 extern void initialiseClass(InitArgs *args);
779 /* resolve */
781 extern FieldBlock *findField(Class *, char *, char *);
782 extern MethodBlock *findMethod(Class *class, char *methodname, char *type);
783 extern FieldBlock *lookupField(Class *, char *, char *);
784 extern MethodBlock *lookupMethod(Class *class, char *methodname, char *type);
785 extern MethodBlock *lookupVirtualMethod(Object *ob, MethodBlock *mb);
786 extern Class *resolveClass(Class *class, int index, int init);
787 extern MethodBlock *resolveMethod(Class *class, int index);
788 extern MethodBlock *resolveInterfaceMethod(Class *class, int index);
789 extern FieldBlock *resolveField(Class *class, int index);
790 extern uintptr_t resolveSingleConstant(Class *class, int index);
791 extern int peekIsFieldLong(Class *class, int index);
793 /* cast */
795 extern char isSubClassOf(Class *class, Class *test);
796 extern char isInstanceOf(Class *class, Class *test);
797 extern char arrayStoreCheck(Class *class, Class *test);
799 /* execute */
801 extern void *executeMethodArgs(Object *ob, Class *class, MethodBlock *mb, ...);
802 extern void *executeMethodVaList(Object *ob, Class *class, MethodBlock *mb, va_list args);
803 extern void *executeMethodList(Object *ob, Class *class, MethodBlock *mb, u8 *args);
805 #define executeMethod(ob, mb, args...) \
806 executeMethodArgs(ob, ob->class, mb, ##args)
808 #define executeStaticMethod(clazz, mb, args...) \
809 executeMethodArgs(NULL, clazz, mb, ##args)
811 /* excep */
813 extern Object *exceptionOccurred();
814 extern void signalChainedExceptionEnum(int excep_enum, char *excep_mess, Object *cause);
815 extern void signalChainedExceptionName(char *excep_name, char *excep_mess, Object *cause);
816 extern void signalChainedExceptionClass(Class *excep_class, char *excep_mess, Object *cause);
817 extern void setException(Object *excep);
818 extern void clearException();
819 extern void printException();
820 extern CodePntr findCatchBlock(Class *exception);
821 extern Object *setStackTrace0(ExecEnv *ee, int max_depth);
822 extern Object *convertStackTrace(Object *vmthrwble);
823 extern int mapPC2LineNo(MethodBlock *mb, CodePntr pc_pntr);
824 extern void markVMThrowable(Object *vmthrwble, int mark, int mark_soft_refs);
825 extern void initialiseException();
827 #define exceptionOccured0(ee) \
828 ee->exception
830 #define signalException(excep_name, excep_mess) \
831 signalChainedExceptionEnum(EXCEPTION_ENUM(excep_name), excep_mess, NULL)
833 #define signalChainedException(excep_name, excep_mess, cause) \
834 signalChainedExceptionEnum(EXCEPTION_ENUM(excep_name), excep_mess, cause)
836 #define signalExceptionClass(excep_class, excep_mess) \
837 signalChainedExceptionClass(excep_class, excep_mess, NULL)
839 #define setStackTrace() \
840 setStackTrace0(getExecEnv(), INT_MAX)
842 /* interp */
844 extern uintptr_t *executeJava();
845 extern void initialiseInterpreter(InitArgs *args);
847 /* String */
849 extern Object *findInternedString(Object *string);
850 extern Object *createString(char *utf8);
851 extern Object *createStringFromUnicode(unsigned short *unicode, int len);
852 extern char *String2Cstr(Object *string);
853 extern char *String2Buff(Object *string, char *buff, int buff_len);
854 extern int getStringLen(Object *string);
855 extern unsigned short *getStringChars(Object *string);
856 extern Object *getStringCharsArray(Object *string);
857 extern int getStringUtf8Len(Object *string);
858 extern char *String2Utf8(Object *string);
859 extern char *StringRegion2Utf8(Object *string, int start, int len, char *utf8);
860 extern void freeInternedStrings();
861 extern void threadInternedStrings();
862 extern void initialiseString();
864 #define Cstr2String(cstr) createString(cstr)
866 /* Utf8 */
868 extern int utf8Len(char *utf8);
869 extern int utf8Hash(char *utf8);
870 extern int utf8Comp(char *utf81, char *utf82);
871 extern void convertUtf8(char *utf8, unsigned short *buff);
872 extern char *findHashedUtf8(char *string, int add_if_absent);
873 extern char *copyUtf8(char *string);
874 extern int utf8CharLen(unsigned short *unicode, int len);
875 extern char *unicode2Utf8(unsigned short *unicode, int len, char *utf8);
876 extern char *slash2dots(char *utf8);
877 extern char *slash2dots2buff(char *utf8, char *buff, int buff_len);
878 extern void initialiseUtf8();
880 #define findUtf8(string) \
881 findHashedUtf8(string, FALSE)
883 #define newUtf8(string) \
884 findHashedUtf8(string, TRUE)
886 /* Dll */
888 extern void *resolveNativeMethod(MethodBlock *mb);
889 extern int resolveDll(char *name, Object *loader);
890 extern char *getDllPath();
891 extern char *getBootDllPath();
892 extern char *getDllName(char *name);
893 extern void initialiseDll(InitArgs *args);
894 extern uintptr_t *resolveNativeWrapper(Class *class, MethodBlock *mb, uintptr_t *ostack);
895 extern void unloaderUnloadDll(uintptr_t entry);
896 extern void unloadClassLoaderDlls(Object *loader);
897 extern void threadLiveClassLoaderDlls();
899 /* OS */
901 extern char *nativeLibPath();
902 extern void *nativeLibOpen(char *path);
903 extern void nativeLibClose(void *handle);
904 extern char *nativeLibMapName(char *name);
905 extern void *nativeLibSym(void *handle, char *symbol);
906 extern char *nativeLibError();
907 extern void *nativeStackBase();
908 extern int nativeAvailableProcessors();
910 /* Threading */
912 extern void initialiseThreadStage1(InitArgs *args);
913 extern void initialiseThreadStage2(InitArgs *args);
914 extern ExecEnv *getExecEnv();
916 extern void createJavaThread(Object *jThread, long long stack_size);
917 extern void mainThreadSetContextClassLoader(Object *loader);
918 extern void mainThreadWaitToExitVM();
919 extern void exitVM(int status);
920 extern void scanThreads();
922 /* Monitors */
924 extern void initialiseMonitor();
926 /* reflect */
928 extern Object *getClassConstructors(Class *class, int public);
929 extern Object *getClassMethods(Class *class, int public);
930 extern Object *getClassFields(Class *class, int public);
931 extern Object *getClassInterfaces(Class *class);
932 extern Object *getClassClasses(Class *class, int public);
933 extern Class *getDeclaringClass(Class *class);
934 extern Class *getEnclosingClass(Class *class);
935 extern Object *getEnclosingMethodObject(Class *class);
936 extern Object *getEnclosingConstructorObject(Class *class);
937 extern Object *getClassAnnotations(Class *class);
938 extern Object *getFieldAnnotations(FieldBlock *fb);
939 extern Object *getMethodAnnotations(MethodBlock *mb);
940 extern Object *getMethodParameterAnnotations(MethodBlock *mb);
941 extern Object *getMethodDefaultValue(MethodBlock *mb);
943 extern Object *getReflectReturnObject(Class *type, uintptr_t *pntr);
944 extern uintptr_t *widenPrimitiveValue(int src_idx, int dest_idx, uintptr_t *src, uintptr_t *dest);
945 extern uintptr_t *unwrapAndWidenObject(Class *type, Object *arg, uintptr_t *pntr);
946 extern Object *invoke(Object *ob, MethodBlock *mb, Object *arg_array, Object *param_types,
947 int check_access);
949 extern MethodBlock *mbFromReflectObject(Object *reflect_ob);
950 extern FieldBlock *fbFromReflectObject(Object *reflect_ob);
952 extern Object *createReflectConstructorObject(MethodBlock *mb);
953 extern Object *createReflectMethodObject(MethodBlock *mb);
954 extern Object *createReflectFieldObject(FieldBlock *fb);
955 extern Class *getReflectMethodClass();
957 #define getPrimTypeIndex(cb) (cb->state - CLASS_PRIM)
959 /* jni */
961 extern int initJNILrefs();
962 extern void initialiseJNI();
963 extern void *getJNIInterface();
964 extern void markJNIGlobalRefs();
966 /* properties */
968 extern void initialiseProperties(InitArgs *args);
969 extern void addCommandLineProperties(Object *properties);
970 extern void addDefaultProperties(Object *properties);
971 extern char *getCommandLineProperty(char *key);
973 /* access */
975 extern int checkClassAccess(Class *class1, Class *class2);
976 extern int checkMethodAccess(MethodBlock *mb, Class *class);
977 extern int checkFieldAccess(FieldBlock *fb, Class *class);
979 /* frame */
981 extern Frame *getCallerFrame(Frame *last);
982 extern Class *getCallerCallerClass();
984 /* native */
986 extern void initialiseNatives();
988 /* init */
990 extern void setDefaultInitArgs(InitArgs *args);
991 extern unsigned long parseMemValue(char *str);
992 extern void initVM(InitArgs *args);
993 extern int VMInitialising();
995 /* hooks */
997 extern void initialiseHooks(InitArgs *args);
998 extern void jam_fprintf(FILE *stream, const char *fmt, ...);
999 extern void jamvm_exit(int status);
1001 #define jam_printf(fmt, ...) jam_fprintf(stdout, fmt, ## __VA_ARGS__)
1003 /* inlining */
1005 extern void freeMethodInlinedInfo(MethodBlock *mb);
1006 extern int initialiseInlining(InitArgs *args);
1007 extern void showRelocatability();
1009 /* symbol */
1010 extern void initialiseSymbol();
