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.
27 /* Configure options */
30 /* Architecture dependent definitions */
38 /* These should go in the interpreter file */
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
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
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
130 #define OPC_DUP_X1 90
131 #define OPC_DUP_X2 91
133 #define OPC_DUP2_X1 93
134 #define OPC_DUP2_X2 94
164 #define OPC_IUSHR 124
165 #define OPC_LUSHR 125
189 #define OPC_FCMPL 149
190 #define OPC_FCMPG 150
191 #define OPC_DCMPL 151
192 #define OPC_DCMPG 152
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
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
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
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
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
315 #define CLASS_LOADED 1
316 #define CLASS_LINKED 2
318 #define CLASS_INITING 4
319 #define CLASS_INITED 5
321 #define CLASS_ARRAY 6
326 #define CLASS_CLASS 1
328 #define SOFT_REFERENCE 4
329 #define WEAK_REFERENCE 8
330 #define PHANTOM_REFERENCE 16
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
{
347 ConstantPoolEntry
*info
;
350 typedef struct exception_table_entry
{
355 } ExceptionTableEntry
;
357 typedef struct line_no_table_entry
{
362 typedef struct object Class
;
364 typedef struct object
{
367 uintptr_t instance
[];
371 typedef union ins_operand
{
390 typedef struct instruction
{
392 unsigned char opcode
;
400 typedef struct switch_table
{
404 Instruction
**entries
;
407 typedef struct lookup_entry
{
409 Instruction
*handler
;
412 typedef struct lookup_table
{
415 LookupEntry
*entries
;
419 typedef struct opcode_info
{
420 unsigned char opcode
;
421 unsigned char cache_depth
;
424 typedef struct code_block
{
430 typedef struct quick_prepare_info
{
432 Instruction
*quickened
;
433 struct quick_prepare_info
*next
;
436 typedef struct prepare_info
{
442 typedef Instruction
*CodePntr
;
444 typedef unsigned char *CodePntr
;
447 typedef struct annotation_data
{
452 typedef struct method_annotation_data
{
453 AnnotationData
*annotations
;
454 AnnotationData
*parameters
;
455 AnnotationData
*dft_val
;
456 } MethodAnnotationData
;
458 typedef struct methodblock
{
468 u2 exception_table_size
;
469 u2 line_no_table_size
;
470 int native_extra_arg
;
471 void *native_invoker
;
475 ExceptionTableEntry
*exception_table
;
476 LineNoTableEntry
*line_no_table
;
477 int method_table_index
;
478 MethodAnnotationData
*annotations
;
480 QuickPrepareInfo
*quick_prepare_info
;
484 typedef struct fieldblock
{
491 uintptr_t static_value
;
493 AnnotationData
*annotations
;
496 typedef struct itable_entry
{
501 typedef struct refs_offsets_entry
{
506 #define CLASS_PAD_SIZE 4
508 typedef struct classblock
{
509 uintptr_t pad
[CLASS_PAD_SIZE
];
513 char *source_file_name
;
521 u2 constant_pool_count
;
524 MethodBlock
*methods
;
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
;
534 Object
*class_loader
;
536 u2 inner_access_flags
;
537 u2 inner_class_count
;
539 int refs_offsets_size
;
540 RefsOffsetsEntry
*refs_offsets_table
;
543 AnnotationData
*annotations
;
546 typedef struct frame
{
551 uintptr_t *lvars_jem
;
558 typedef struct jni_frame
{
566 typedef struct exec_env
{
576 typedef struct prop
{
581 typedef struct InitArgs
{
587 int compact_specified
; /* Whether compaction has been given on the
588 command line, and the value if it has */
596 unsigned long min_heap
;
597 unsigned long max_heap
;
599 Property
*commandline_props
;
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
);
611 unsigned int codemem
;
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)
676 #define IS_JAM_OBJECT(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) ({ \
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); })
689 #define IS_JAM_OBJECT(ptr) 0
690 #define IS_JAM_ARRAY(ptr) 0
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])
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
727 /* default maximum size of object heap */
728 #ifndef DEFAULT_MAX_HEAP
729 #define DEFAULT_MAX_HEAP 128*MB
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 --------------------------- */
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
);
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
);
785 extern void threadReference(Object
**ref
);
786 extern int isMarked(Object
*ob
);
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
);
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
);
844 extern char isSubClassOf(Class
*class, Class
*test
);
845 extern char isInstanceOf(Class
*class, Class
*test
);
846 extern char arrayStoreCheck(Class
*class, Class
*test
);
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)
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) \
877 #define signalException(excep_name, excep_mess) \
878 signalChainedException(excep_name, excep_mess, NULL)
880 #define setStackTrace() \
881 setStackTrace0(getExecEnv(), INT_MAX)
885 extern uintptr_t *executeJava();
886 extern void initialiseInterpreter(InitArgs
*args
);
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)
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();
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();
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();
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();
955 extern void initialiseMonitor();
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
,
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)
992 extern void initialiseJNI();
993 extern void *getJNIInterface();
994 extern void markJNIGlobalRefs();
998 extern void initialiseProperties(InitArgs
*args
);
999 extern void addCommandLineProperties(Object
*properties
);
1000 extern void addDefaultProperties(Object
*properties
);
1001 extern char *getCommandLineProperty(char *key
);
1005 extern int checkClassAccess(Class
*class1
, Class
*class2
);
1006 extern int checkMethodAccess(MethodBlock
*mb
, Class
*class);
1007 extern int checkFieldAccess(FieldBlock
*fb
, Class
*class);
1011 extern Frame
*getCallerFrame(Frame
*last
);
1012 extern Class
*getCallerCallerClass();
1016 extern void initialiseNatives();
1020 extern void setDefaultInitArgs(InitArgs
*args
);
1021 extern unsigned long parseMemValue(char *str
);
1022 extern void initVM(InitArgs
*args
);
1023 extern int VMInitialising();
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__)
1035 extern void freeMethodInlinedInfo(MethodBlock
*mb
);
1036 extern int initialiseInlining(InitArgs
*args
);
1037 extern void showRelocatability();