Fix Java long (64 bit) operations, add missing ones, fix compiler warnings
[jamvm-avr32-jem.git] / src / jam.h
blobe214ecdf361f5c16798858b1d5a5b2f159d38108
1 /*
2 * Copyright (C) 2003, 2004, 2005, 2006, 2007
3 * Robert Lougher <rob@lougher.org.uk>.
5 * This file is part of JamVM.
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.
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.
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.
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 uintptr_t instance[];
368 } Object;
370 #ifdef DIRECT
371 typedef union ins_operand {
372 uintptr_t u;
373 int i;
374 struct {
375 signed short i1;
376 signed short i2;
377 } ii;
378 struct {
379 unsigned short u1;
380 unsigned short u2;
381 } uu;
382 struct {
383 unsigned short u1;
384 unsigned char u2;
385 char i;
386 } uui;
387 void *pntr;
388 } Operand;
390 typedef struct instruction {
391 #ifdef DIRECT_DEBUG
392 unsigned char opcode;
393 char cache_depth;
394 short bytecode_pc;
395 #endif
396 const void *handler;
397 Operand operand;
398 } Instruction;
400 typedef struct switch_table {
401 int low;
402 int high;
403 Instruction *deflt;
404 Instruction **entries;
405 } SwitchTable;
407 typedef struct lookup_entry {
408 int key;
409 Instruction *handler;
410 } LookupEntry;
412 typedef struct lookup_table {
413 int num_entries;
414 Instruction *deflt;
415 LookupEntry *entries;
416 } LookupTable;
418 #ifdef INLINING
419 typedef struct opcode_info {
420 unsigned char opcode;
421 unsigned char cache_depth;
422 } OpcodeInfo;
424 typedef struct code_block {
425 int length;
426 Instruction *start;
427 OpcodeInfo *opcodes;
428 } CodeBlock;
430 typedef struct quick_prepare_info {
431 CodeBlock block;
432 Instruction *quickened;
433 struct quick_prepare_info *next;
434 } QuickPrepareInfo;
436 typedef struct prepare_info {
437 CodeBlock block;
438 Operand operand;
439 } PrepareInfo;
440 #endif
442 typedef Instruction *CodePntr;
443 #else
444 typedef unsigned char *CodePntr;
445 #endif
447 typedef struct annotation_data {
448 u1 *data;
449 int len;
450 } AnnotationData;
452 typedef struct method_annotation_data {
453 AnnotationData *annotations;
454 AnnotationData *parameters;
455 AnnotationData *dft_val;
456 } MethodAnnotationData;
458 typedef struct methodblock {
459 Class *class;
460 char *name;
461 char *type;
462 char *signature;
463 u2 access_flags;
464 u2 max_stack;
465 u2 max_locals;
466 u2 args_count;
467 u2 throw_table_size;
468 u2 exception_table_size;
469 u2 line_no_table_size;
470 int native_extra_arg;
471 void *native_invoker;
472 void *code;
473 int code_size;
474 u2 *throw_table;
475 ExceptionTableEntry *exception_table;
476 LineNoTableEntry *line_no_table;
477 int method_table_index;
478 MethodAnnotationData *annotations;
479 #ifdef INLINING
480 QuickPrepareInfo *quick_prepare_info;
481 #endif
482 } MethodBlock;
484 typedef struct fieldblock {
485 Class *class;
486 char *name;
487 char *type;
488 char *signature;
489 u2 access_flags;
490 u2 constant;
491 uintptr_t static_value;
492 u4 offset;
493 AnnotationData *annotations;
494 } FieldBlock;
496 typedef struct itable_entry {
497 Class *interface;
498 int *offsets;
499 } ITableEntry;
501 typedef struct refs_offsets_entry {
502 int start;
503 int end;
504 } RefsOffsetsEntry;
506 #define CLASS_PAD_SIZE 4
508 typedef struct classblock {
509 uintptr_t pad[CLASS_PAD_SIZE];
510 char *name;
511 char *signature;
512 char *super_name;
513 char *source_file_name;
514 Class *super;
515 u1 state;
516 u2 flags;
517 u2 access_flags;
518 u2 interfaces_count;
519 u2 fields_count;
520 u2 methods_count;
521 u2 constant_pool_count;
522 int object_size;
523 FieldBlock *fields;
524 MethodBlock *methods;
525 Class **interfaces;
526 ConstantPool constant_pool;
527 int method_table_size;
528 MethodBlock **method_table;
529 int imethod_table_size;
530 ITableEntry *imethod_table;
531 Class *element_class;
532 int initing_tid;
533 int dim;
534 Object *class_loader;
535 u2 declaring_class;
536 u2 inner_access_flags;
537 u2 inner_class_count;
538 u2 *inner_classes;
539 int refs_offsets_size;
540 RefsOffsetsEntry *refs_offsets_table;
541 u2 enclosing_class;
542 u2 enclosing_method;
543 AnnotationData *annotations;
544 } ClassBlock;
546 typedef struct frame {
547 CodePntr last_pc;
548 #ifndef JEM
549 uintptr_t *lvars;
550 #else
551 uintptr_t *lvars_jem;
552 #endif
553 uintptr_t *ostack;
554 MethodBlock *mb;
555 struct frame *prev;
556 } Frame;
558 typedef struct jni_frame {
559 Object **next_ref;
560 Object **lrefs;
561 uintptr_t *ostack;
562 MethodBlock *mb;
563 struct frame *prev;
564 } JNIFrame;
566 typedef struct exec_env {
567 Object *exception;
568 char *stack;
569 char *stack_end;
570 int stack_size;
571 Frame *last_frame;
572 Object *thread;
573 char overflow;
574 } ExecEnv;
576 typedef struct prop {
577 char *key;
578 char *value;
579 } Property;
581 typedef struct InitArgs {
582 int noasyncgc;
583 int verbosegc;
584 int verbosedll;
585 int verboseclass;
587 int compact_specified; /* Whether compaction has been given on the
588 command line, and the value if it has */
589 int do_compact;
591 char *classpath;
592 char *bootpath;
593 char bootpathopt;
595 int java_stack;
596 unsigned long min_heap;
597 unsigned long max_heap;
599 Property *commandline_props;
600 int props_count;
602 void *main_stack_base;
604 /* JNI invocation API hooks */
606 int (*vfprintf)(FILE *stream, const char *fmt, va_list ap);
607 void (*exit)(int status);
608 void (*abort)(void);
610 #ifdef INLINING
611 unsigned int codemem;
612 int replication;
613 #endif
614 } InitArgs;
616 #include <stddef.h>
617 //#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
619 #define JAM_ON_STACK 0
622 * container_of - cast a member of a structure out to the containing structure
623 * @ptr: the pointer to the member.
624 * @type: the type of the container struct this is embedded in.
625 * @member: the name of the member within the struct.
628 #define container_of(ptr, type, member) ({ \
629 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
630 (type *)( (char *)__mptr - offsetof(type,member) );})
632 #define CLASS_CB(classRef) ((ClassBlock*)(classRef+1))
633 #define INST_DATA(objectRef) ((objectRef)->instance)
635 #define ARRAY_DATA(arrayRef) ((void *)&(arrayRef)->instance[1])
636 #define ARRAY_LEN(arrayRef) ((arrayRef)->instance[0])
638 #define IS_CLASS(object) (object->class && IS_CLASS_CLASS(CLASS_CB(object->class)))
640 #define IS_INTERFACE(cb) (cb->access_flags & ACC_INTERFACE)
641 #define IS_SYNTHETIC(cb) (cb->access_flags & ACC_SYNTHETIC)
642 #define IS_ANNOTATION(cb) (cb->access_flags & ACC_ANNOTATION)
643 #define IS_ENUM(cb) (cb->access_flags & ACC_ENUM)
644 #define IS_ARRAY(cb) (cb->state == CLASS_ARRAY)
645 #define IS_PRIMITIVE(cb) (cb->state >= CLASS_PRIM)
647 #define IS_FINALIZED(cb) (cb->flags & FINALIZED)
648 #define IS_REFERENCE(cb) (cb->flags & REFERENCE)
649 #define IS_SOFT_REFERENCE(cb) (cb->flags & SOFT_REFERENCE)
650 #define IS_WEAK_REFERENCE(cb) (cb->flags & WEAK_REFERENCE)
651 #define IS_PHANTOM_REFERENCE(cb) (cb->flags & PHANTOM_REFERENCE)
652 #define IS_CLASS_LOADER(cb) (cb->flags & CLASS_LOADER)
653 #define IS_CLASS_DUP(cb) (cb->flags & CLASS_CLASH)
654 #define IS_CLASS_CLASS(cb) (cb->flags & CLASS_CLASS)
655 #define IS_VMTHROWABLE(cb) (cb->flags & VMTHROWABLE)
656 #define IS_VMTHREAD(cb) (cb->flags & VMTHREAD)
657 #define IS_ANONYMOUS(cb) (cb->flags & ANONYMOUS)
658 #define IS_SPECIAL(cb) (cb->flags & (REFERENCE | CLASS_LOADER | VMTHREAD))
660 #define IS_MEMBER(cb) cb->declaring_class
661 #define IS_LOCAL(cb) (cb->enclosing_method && !IS_ANONYMOUS(cb))
663 /* These defines are moved here from src/arch/avr32_jem.h */
664 #define JAM_ARRAY(ptr) container_of(ptr, Object, instance[1])
665 //#define JAM_OBJECT(ptr) ((Object*)(ptr) - 1)
666 #define JAM_OBJECT(ptr) container_of(ptr, Object, instance[0])
669 * See alloc.c::gcMalloc(), we retrieve chunk's header, which is a 32-bit bield
670 * below the object, and check for ALLOC_BIT == 1.
673 #define __jam_obj(p) (*((uintptr_t*)(p) - 1))
674 #define __is_jam_obj(p) (__jam_obj(p) & 1)
675 #if JAM_ON_STACK
676 #define IS_JAM_OBJECT(ptr) ({ \
677 if (ptr) \
678 jam_dprintf("test-jam-object: %s.%d:%p\n", \
679 __FUNCTION__, __LINE__, __jam_obj(ptr));\
680 (ptr) && __is_jam_obj(ptr); })
682 #define IS_JAM_ARRAY(ptr) ({ \
683 if (ptr) \
684 jam_dprintf("test-jam-array: %s.%d:%p\n", \
685 __FUNCTION__, __LINE__, __jam_obj(ptr));\
686 (ptr) && __is_jam_obj(ptr) && \
687 !((uintptr_t)(ptr) & 7); })
688 #else
689 #define IS_JAM_OBJECT(ptr) 0
690 #define IS_JAM_ARRAY(ptr) 0
691 #endif
692 /* Macros for accessing constant pool entries */
694 #define CP_TYPE(cp,i) cp->type[i]
695 #define CP_INFO(cp,i) cp->info[i]
696 #define CP_CLASS(cp,i) (u2)cp->info[i]
697 #define CP_STRING(cp,i) (u2)cp->info[i]
698 #define CP_METHOD_CLASS(cp,i) (u2)cp->info[i]
699 #define CP_METHOD_NAME_TYPE(cp,i) (u2)(cp->info[i]>>16)
700 #define CP_INTERFACE_CLASS(cp,i) (u2)cp->info[i]
701 #define CP_INTERFACE_NAME_TYPE(cp,i) (u2)(cp->info[i]>>16)
702 #define CP_FIELD_CLASS(cp,i) (u2)cp->info[i]
703 #define CP_FIELD_NAME_TYPE(cp,i) (u2)(cp->info[i]>>16)
704 #define CP_NAME_TYPE_NAME(cp,i) (u2)cp->info[i]
705 #define CP_NAME_TYPE_TYPE(cp,i) (u2)(cp->info[i]>>16)
706 #define CP_UTF8(cp,i) (char *)(cp->info[i])
708 #define CP_INTEGER(cp,i) (int)(cp->info[i])
709 #define CP_FLOAT(cp,i) *(float *)&(cp->info[i])
710 #define CP_LONG(cp,i) *(long long *)&(cp->info[i])
711 #define CP_DOUBLE(cp,i) *(double *)&(cp->info[i])
713 #define KB 1024
714 #define MB (KB*KB)
716 /* minimum allowable size of object heap */
717 #define MIN_HEAP 4*KB
719 /* minimum allowable size of the Java stack */
720 #define MIN_STACK 2*KB
722 /* default minimum size of object heap */
723 #ifndef DEFAULT_MIN_HEAP
724 #define DEFAULT_MIN_HEAP 2*MB
725 #endif
727 /* default maximum size of object heap */
728 #ifndef DEFAULT_MAX_HEAP
729 #define DEFAULT_MAX_HEAP 128*MB
730 #endif
732 /* default size of the Java stack */
733 #define DEFAULT_STACK 64*KB
735 /* size of emergency area - big enough to create
736 a StackOverflow exception */
737 #define STACK_RED_ZONE_SIZE 1*KB
739 #define JAVA_COMPAT_VERSION "1.5.0"
741 /* --------------------- Function prototypes --------------------------- */
743 /* Alloc */
745 extern void initialiseAlloc(InitArgs *args);
746 extern void initialiseGC(InitArgs *args);
747 extern Class *allocClass();
748 extern Object *allocObject(Class *class);
749 extern Object *allocTypeArray(int type, int size);
750 extern Object *allocArray(Class *class, int size, int el_size);
751 extern Object *allocMultiArray(Class *array_class, int dim, intptr_t *count);
752 extern Object *cloneObject(Object *ob);
753 extern void markRoot(Object *ob);
754 extern void markConservativeRoot(Object *ob);
755 extern void markObject(Object *ob, int mark, int mark_soft_refs);
756 extern uintptr_t getObjectHashcode(Object *ob);
758 extern void gc1();
759 extern void runFinalizers();
761 extern unsigned long freeHeapMem();
762 extern unsigned long totalHeapMem();
763 extern unsigned long maxHeapMem();
765 extern void *sysMalloc(int n);
766 extern void sysFree(void *ptr);
767 extern void *sysRealloc(void *ptr, int n);
769 extern void *gcMemMalloc(int n);
770 extern void gcMemFree(void *ptr);
771 extern void *gcMemRealloc(void *ptr, int n);
773 extern void registerStaticObjectRef(Object **ob);
774 extern void registerStaticObjectRefLocked(Object **ob);
776 #define registerStaticClassRef(ref) \
777 registerStaticObjectRef(ref);
779 #define registerStaticClassRefLocked(ref) \
780 registerStaticObjectRefLocked(ref);
782 extern void gcPendingFree(void *addr);
784 /* GC support */
785 extern void threadReference(Object **ref);
786 extern int isMarked(Object *ob);
788 /* Class */
790 extern Class *java_lang_Class;
792 extern Class *defineClass(char *classname, char *data, int offset, int len, Object *class_loader);
793 extern void linkClass(Class *class);
794 extern Class *initClass(Class *class);
795 extern Class *findSystemClass(char *);
796 extern Class *findSystemClass0(char *);
797 extern Class *loadSystemClass(char *);
799 extern Class *findHashedClass(char *, Object *);
800 extern Class *findPrimitiveClass(char);
801 extern Class *findArrayClassFromClassLoader(char *, Object *);
803 extern Object *getSystemClassLoader();
805 extern int bootClassPathSize();
806 extern Object *bootClassPathResource(char *filename, int index);
808 #define findArrayClassFromClass(name, class) \
809 findArrayClassFromClassLoader(name, CLASS_CB(class)->class_loader)
810 #define findArrayClass(name) findArrayClassFromClassLoader(name, NULL)
812 extern Class *findClassFromClassLoader(char *, Object *);
813 #define findClassFromClass(name, class) \
814 findClassFromClassLoader(name, CLASS_CB(class)->class_loader)
816 extern void freeClassData(Class *class);
817 extern void freeClassLoaderData(Object *class_loader);
819 extern char *getClassPath();
820 extern char *getBootClassPath();
822 extern void markBootClasses();
823 extern void markLoaderClasses(Object *loader, int mark, int mark_soft_refs);
824 extern void threadBootClasses();
825 extern void threadLoaderClasses(Object *class_loader);
826 extern void initialiseClass(InitArgs *args);
828 /* resolve */
830 extern FieldBlock *findField(Class *, char *, char *);
831 extern MethodBlock *findMethod(Class *class, char *methodname, char *type);
832 extern FieldBlock *lookupField(Class *, char *, char *);
833 extern MethodBlock *lookupMethod(Class *class, char *methodname, char *type);
834 extern MethodBlock *lookupVirtualMethod(Object *ob, MethodBlock *mb);
835 extern Class *resolveClass(Class *class, int index, int init);
836 extern MethodBlock *resolveMethod(Class *class, int index);
837 extern MethodBlock *resolveInterfaceMethod(Class *class, int index);
838 extern FieldBlock *resolveField(Class *class, int index);
839 extern uintptr_t resolveSingleConstant(Class *class, int index);
840 extern int peekIsFieldLong(Class *class, int index);
842 /* cast */
844 extern char isSubClassOf(Class *class, Class *test);
845 extern char isInstanceOf(Class *class, Class *test);
846 extern char arrayStoreCheck(Class *class, Class *test);
848 /* execute */
850 extern void *executeMethodArgs(Object *ob, Class *class, MethodBlock *mb, ...);
851 extern void *executeMethodVaList(Object *ob, Class *class, MethodBlock *mb, va_list args);
852 extern void *executeMethodList(Object *ob, Class *class, MethodBlock *mb, u8 *args);
854 #define executeMethod(ob, mb, args...) \
855 executeMethodArgs(ob, ob->class, mb, ##args)
857 #define executeStaticMethod(clazz, mb, args...) \
858 executeMethodArgs(NULL, clazz, mb, ##args)
860 /* excep */
862 extern Object *exceptionOccurred();
863 extern void signalChainedException(char *excep_name, char *excep_mess, Object *cause);
864 extern void setException(Object *excep);
865 extern void clearException();
866 extern void printException();
867 extern CodePntr findCatchBlock(Class *exception);
868 extern Object *setStackTrace0(ExecEnv *ee, int max_depth);
869 extern Object *convertStackTrace(Object *vmthrwble);
870 extern int mapPC2LineNo(MethodBlock *mb, CodePntr pc_pntr);
871 extern void markVMThrowable(Object *vmthrwble, int mark, int mark_soft_refs);
872 extern void initialiseException();
874 #define exceptionOccured0(ee) \
875 ee->exception
877 #define signalException(excep_name, excep_mess) \
878 signalChainedException(excep_name, excep_mess, NULL)
880 #define setStackTrace() \
881 setStackTrace0(getExecEnv(), INT_MAX)
883 /* interp */
885 extern uintptr_t *executeJava();
886 extern void initialiseInterpreter(InitArgs *args);
888 /* String */
890 extern Object *findInternedString(Object *string);
891 extern Object *createString(char *utf8);
892 extern Object *createStringFromUnicode(unsigned short *unicode, int len);
893 extern char *String2Cstr(Object *string);
894 extern char *String2Buff(Object *string, char *buff, int buff_len);
895 extern int getStringLen(Object *string);
896 extern unsigned short *getStringChars(Object *string);
897 extern Object *getStringCharsArray(Object *string);
898 extern int getStringUtf8Len(Object *string);
899 extern char *String2Utf8(Object *string);
900 extern char *StringRegion2Utf8(Object *string, int start, int len, char *utf8);
901 extern void freeInternedStrings();
902 extern void threadInternedStrings();
903 extern void initialiseString();
905 #define Cstr2String(cstr) createString(cstr)
907 /* Utf8 */
909 extern int utf8Len(char *utf8);
910 extern int utf8Hash(char *utf8);
911 extern int utf8Comp(char *utf81, char *utf82);
912 extern void convertUtf8(char *utf8, unsigned short *buff);
913 extern char *findUtf8String(char *string);
914 extern int utf8CharLen(unsigned short *unicode, int len);
915 extern char *unicode2Utf8(unsigned short *unicode, int len, char *utf8);
916 extern char *slash2dots(char *utf8);
917 extern char *slash2dots2buff(char *utf8, char *buff, int buff_len);
918 extern void initialiseUtf8();
920 /* Dll */
922 extern void *resolveNativeMethod(MethodBlock *mb);
923 extern int resolveDll(char *name, Object *loader);
924 extern char *getDllPath();
925 extern char *getBootDllPath();
926 extern char *getDllName(char *name);
927 extern void initialiseDll(InitArgs *args);
928 extern uintptr_t *resolveNativeWrapper(Class *class, MethodBlock *mb, uintptr_t *ostack);
929 extern void unloadClassLoaderDlls(Object *loader);
930 extern void threadLiveClassLoaderDlls();
932 /* OS */
934 extern char *nativeLibPath();
935 extern void *nativeLibOpen(char *path);
936 extern void nativeLibClose(void *handle);
937 extern char *nativeLibMapName(char *name);
938 extern void *nativeLibSym(void *handle, char *symbol);
939 extern void *nativeStackBase();
940 extern int nativeAvailableProcessors();
942 /* Threading */
944 extern void initialiseMainThread(InitArgs *args);
945 extern ExecEnv *getExecEnv();
947 extern void createJavaThread(Object *jThread, long long stack_size);
948 extern void mainThreadSetContextClassLoader(Object *loader);
949 extern void mainThreadWaitToExitVM();
950 extern void exitVM(int status);
951 extern void scanThreads();
953 /* Monitors */
955 extern void initialiseMonitor();
957 /* reflect */
959 extern Object *getClassConstructors(Class *class, int public);
960 extern Object *getClassMethods(Class *class, int public);
961 extern Object *getClassFields(Class *class, int public);
962 extern Object *getClassInterfaces(Class *class);
963 extern Object *getClassClasses(Class *class, int public);
964 extern Class *getDeclaringClass(Class *class);
965 extern Class *getEnclosingClass(Class *class);
966 extern Object *getEnclosingMethodObject(Class *class);
967 extern Object *getEnclosingConstructorObject(Class *class);
968 extern Object *getClassAnnotations(Class *class);
969 extern Object *getFieldAnnotations(FieldBlock *fb);
970 extern Object *getMethodAnnotations(MethodBlock *mb);
971 extern Object *getMethodParameterAnnotations(MethodBlock *mb);
972 extern Object *getMethodDefaultValue(MethodBlock *mb);
974 extern Object *getReflectReturnObject(Class *type, uintptr_t *pntr);
975 extern uintptr_t *widenPrimitiveValue(int src_idx, int dest_idx, uintptr_t *src, uintptr_t *dest);
976 extern uintptr_t *unwrapAndWidenObject(Class *type, Object *arg, uintptr_t *pntr);
977 extern Object *invoke(Object *ob, MethodBlock *mb, Object *arg_array, Object *param_types,
978 int check_access);
980 extern MethodBlock *mbFromReflectObject(Object *reflect_ob);
981 extern FieldBlock *fbFromReflectObject(Object *reflect_ob);
983 extern Object *createReflectConstructorObject(MethodBlock *mb);
984 extern Object *createReflectMethodObject(MethodBlock *mb);
985 extern Object *createReflectFieldObject(FieldBlock *fb);
986 extern Class *getReflectMethodClass();
988 #define getPrimTypeIndex(cb) (cb->state - CLASS_PRIM)
990 /* jni */
992 extern void initialiseJNI();
993 extern void *getJNIInterface();
994 extern void markJNIGlobalRefs();
996 /* properties */
998 extern void initialiseProperties(InitArgs *args);
999 extern void addCommandLineProperties(Object *properties);
1000 extern void addDefaultProperties(Object *properties);
1001 extern char *getCommandLineProperty(char *key);
1003 /* access */
1005 extern int checkClassAccess(Class *class1, Class *class2);
1006 extern int checkMethodAccess(MethodBlock *mb, Class *class);
1007 extern int checkFieldAccess(FieldBlock *fb, Class *class);
1009 /* frame */
1011 extern Frame *getCallerFrame(Frame *last);
1012 extern Class *getCallerCallerClass();
1014 /* native */
1016 extern void initialiseNatives();
1018 /* init */
1020 extern void setDefaultInitArgs(InitArgs *args);
1021 extern unsigned long parseMemValue(char *str);
1022 extern void initVM(InitArgs *args);
1023 extern int VMInitialising();
1025 /* hooks */
1027 extern void initialiseHooks(InitArgs *args);
1028 extern void jam_fprintf(FILE *stream, const char *fmt, ...);
1029 extern void jamvm_exit(int status);
1031 #define jam_printf(fmt, ...) jam_fprintf(stdout, fmt, ## __VA_ARGS__)
1033 /* inlining */
1035 extern void freeMethodInlinedInfo(MethodBlock *mb);
1036 extern int initialiseInlining(InitArgs *args);
1037 extern void showRelocatability();