1 /* src/native/vm/sun/jvm.c - HotSpot JVM interface functions
3 Copyright (C) 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
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.
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA
40 #if defined(HAVE_SYS_IOCTL_H)
41 #define BSD_COMP /* Get FIONREAD on Solaris2 */
42 #include <sys/ioctl.h>
45 #include <sys/socket.h>
50 #include "mm/memory.h"
52 #include "native/jni.h"
53 #include "native/llni.h"
54 #include "native/native.h"
56 #include "native/include/java_lang_AssertionStatusDirectives.h"
57 #include "native/include/java_lang_String.h" /* required by j.l.CL */
58 #include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
59 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
60 #include "native/include/java_lang_StackTraceElement.h"
61 #include "native/include/java_lang_Throwable.h"
62 #include "native/include/java_security_ProtectionDomain.h"
63 #include "native/include/java_lang_Integer.h"
64 #include "native/include/java_lang_Long.h"
65 #include "native/include/java_lang_Short.h"
66 #include "native/include/java_lang_Byte.h"
67 #include "native/include/java_lang_Character.h"
68 #include "native/include/java_lang_Boolean.h"
69 #include "native/include/java_lang_Float.h"
70 #include "native/include/java_lang_Double.h"
72 #if defined(ENABLE_ANNOTATIONS)
73 #include "native/include/sun_reflect_ConstantPool.h"
76 #include "native/vm/java_lang_Class.h"
77 #include "native/vm/java_lang_ClassLoader.h"
78 #include "native/vm/java_lang_Runtime.h"
79 #include "native/vm/java_lang_Thread.h"
80 #include "native/vm/java_lang_reflect_Constructor.h"
81 #include "native/vm/java_lang_reflect_Method.h"
82 #include "native/vm/java_util_concurrent_atomic_AtomicLong.h"
83 #include "native/vm/reflect.h"
85 #include "threads/lock-common.h"
86 #include "threads/threads-common.h"
88 #include "toolbox/logging.h"
91 #include "vm/builtin.h"
92 #include "vm/exceptions.h"
93 #include "vm/global.h"
94 #include "vm/initialize.h"
95 #include "vm/primitive.h"
96 #include "vm/properties.h"
97 #include "vm/resolve.h"
98 #include "vm/signallocal.h"
99 #include "vm/stringlocal.h"
102 #include "vm/jit/stacktrace.h"
104 #include "vmcore/classcache.h"
105 #include "vmcore/options.h"
108 /* debugging macros ***********************************************************/
112 # define TRACEJVMCALLS(...) \
114 if (opt_TraceJVMCalls) { \
115 log_println(__VA_ARGS__); \
119 # define PRINTJVMWARNINGS(...)
121 /* if (opt_PrintJVMWarnings) { \ */
122 /* log_println(__VA_ARGS__); \ */
128 # define TRACEJVMCALLS(...)
129 # define PRINTJVMWARNINGS(...)
135 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
136 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
137 /* and build number (xx) */
138 unsigned int update_version : 8; /* Update release version (uu) */
139 unsigned int special_update_version : 8; /* Special update release version (c) */
140 unsigned int reserved1 : 16;
141 unsigned int reserved2;
143 /* The following bits represents JVM supports that JDK has dependency on.
144 * JDK can use these bits to determine which JVM version
145 * and support it has to maintain runtime compatibility.
147 * When a new bit is added in a minor or update release, make sure
148 * the new bit is also added in the main/baseline.
150 unsigned int is_attachable : 1;
158 * A structure used to a capture exception table entry in a Java method.
165 } JVM_ExceptionTableEntryType;
168 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
170 if ((intptr_t) count <= 0)
173 return vsnprintf(str, count, fmt, args);
177 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
183 len = jio_vsnprintf(str, count, fmt, ap);
190 int jio_fprintf(FILE* f, const char *fmt, ...)
192 log_println("jio_fprintf: IMPLEMENT ME!");
196 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
198 log_println("jio_vfprintf: IMPLEMENT ME!");
202 int jio_printf(const char *fmt, ...)
204 log_println("jio_printf: IMPLEMENT ME!");
208 /* JVM_GetInterfaceVersion */
210 jint JVM_GetInterfaceVersion()
212 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
214 #define JVM_INTERFACE_VERSION 4
216 return JVM_INTERFACE_VERSION;
220 /* JVM_CurrentTimeMillis */
222 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
225 log_println("JVM_CurrentTimeMillis");
227 return (jlong) builtin_currenttimemillis();
233 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
236 log_println("JVM_NanoTime");
238 return (jlong) builtin_nanotime();
244 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
249 s = (java_handle_t *) src;
250 d = (java_handle_t *) dst;
253 log_println("JVM_ArrayCopy: src=%p, src_pos=%d, dst=%p, dst_pos=%d, length=%d", src, src_pos, dst, dst_pos, length);
256 (void) builtin_arraycopy(s, src_pos, d, dst_pos, length);
260 /* JVM_InitProperties */
262 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
265 log_println("JVM_InitProperties: properties=%d", properties);
267 properties_system_add_all((java_handle_t *) properties);
273 void JVM_Exit(jint code)
275 log_println("JVM_Exit: IMPLEMENT ME!");
281 void JVM_Halt(jint code)
284 log_println("JVM_Halt: code=%d", code);
291 /* JVM_OnExit(void (*func)) */
293 void JVM_OnExit(void (*func)(void))
295 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
303 TRACEJVMCALLS("JVM_GC()");
309 /* JVM_MaxObjectInspectionAge */
311 jlong JVM_MaxObjectInspectionAge(void)
313 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
317 /* JVM_TraceInstructions */
319 void JVM_TraceInstructions(jboolean on)
321 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
325 /* JVM_TraceMethodCalls */
327 void JVM_TraceMethodCalls(jboolean on)
329 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
333 /* JVM_TotalMemory */
335 jlong JVM_TotalMemory(void)
337 TRACEJVMCALLS("JVM_TotalMemory()");
339 return gc_get_heap_size();
345 jlong JVM_FreeMemory(void)
347 TRACEJVMCALLS("JVM_FreeMemory()");
349 return gc_get_free_bytes();
355 jlong JVM_MaxMemory(void)
357 TRACEJVMCALLS("JVM_MaxMemory()");
359 return gc_get_max_heap_size();
363 /* JVM_ActiveProcessorCount */
365 jint JVM_ActiveProcessorCount(void)
367 log_println("JVM_ActiveProcessorCount: IMPLEMENT ME!");
371 /* JVM_FillInStackTrace */
373 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
375 java_lang_Throwable *o;
376 stacktracecontainer *stc;
379 log_println("JVM_FillInStackTrace: receiver=%p", receiver);
382 o = (java_lang_Throwable *) receiver;
384 stc = stacktrace_fillInStackTrace();
389 o->backtrace = (java_lang_Object *) stc;
393 /* JVM_PrintStackTrace */
395 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
397 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
401 /* JVM_GetStackTraceDepth */
403 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
405 java_lang_Throwable *o;
406 stacktracecontainer *stc;
407 stacktracebuffer *stb;
410 log_println("JVM_GetStackTraceDepth: throwable=%p", throwable);
413 o = (java_lang_Throwable *) throwable;
414 stc = (stacktracecontainer *) o->backtrace;
421 /* JVM_GetStackTraceElement */
423 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
425 java_lang_Throwable *t;
426 stacktracecontainer *stc;
427 stacktracebuffer *stb;
428 stacktrace_entry *ste;
429 java_lang_StackTraceElement *o;
430 java_lang_String *declaringclass;
431 java_lang_String *filename;
435 log_println("JVM_GetStackTraceElement: throwable=%p, index=%d", throwable, index);
438 t = (java_lang_Throwable *) throwable;
439 stc = (stacktracecontainer *) t->backtrace;
442 if ((index < 0) || (index >= stb->used)) {
443 /* XXX This should be an IndexOutOfBoundsException (check this
446 exceptions_throw_arrayindexoutofboundsexception();
450 ste = &(stb->entries[index]);
452 /* allocate a new StackTraceElement */
454 o = (java_lang_StackTraceElement *)
455 builtin_new(class_java_lang_StackTraceElement);
462 if (!(ste->method->flags & ACC_NATIVE)) {
463 if (ste->method->class->sourcefile)
464 filename = (java_lang_String *) javastring_new(ste->method->class->sourcefile);
471 /* get line number */
473 if (ste->method->flags & ACC_NATIVE)
476 linenumber = (ste->linenumber == 0) ? -1 : ste->linenumber;
478 /* get declaring class name */
481 _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(ste->method->class));
483 /* fill the java.lang.StackTraceElement element */
485 o->declaringClass = declaringclass;
486 o->methodName = (java_lang_String *) javastring_new(ste->method->name);
487 o->fileName = filename;
488 o->lineNumber = linenumber;
496 jint JVM_IHashCode(JNIEnv* env, jobject handle)
499 log_println("JVM_IHashCode: jobject=%p", handle);
501 return (jint) ((ptrint) handle);
505 /* JVM_MonitorWait */
507 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
509 #if defined(ENABLE_THREADS)
513 TRACEJVMCALLS("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms);
515 /* exceptions_throw_illegalargumentexception("argument out of range"); */
516 exceptions_throw_illegalargumentexception();
520 #if defined(ENABLE_THREADS)
521 o = (java_handle_t *) handle;
524 lock_wait_for_object(LLNI_DIRECT(o), ms, 0);
530 /* JVM_MonitorNotify */
532 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
534 #if defined(ENABLE_THREADS)
538 TRACEJVMCALLS("JVM_MonitorNotify(env=%p, handle=%p)", env, handle);
540 #if defined(ENABLE_THREADS)
541 o = (java_handle_t *) handle;
544 lock_notify_object(LLNI_DIRECT(o));
550 /* JVM_MonitorNotifyAll */
552 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
554 #if defined(ENABLE_THREADS)
558 TRACEJVMCALLS("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle);
560 #if defined(ENABLE_THREADS)
561 o = (java_handle_t *) handle;
564 lock_notify_all_object(LLNI_DIRECT(o));
572 jobject JVM_Clone(JNIEnv* env, jobject handle)
575 log_println("JVM_Clone: handle=%p", handle);
577 return (jobject) builtin_clone(env, (java_handle_t *) handle);
581 /* JVM_InitializeCompiler */
583 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
585 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
589 /* JVM_IsSilentCompiler */
591 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
593 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
597 /* JVM_CompileClass */
599 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
601 log_println("JVM_CompileClass: IMPLEMENT ME!");
605 /* JVM_CompileClasses */
607 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
609 log_println("JVM_CompileClasses: IMPLEMENT ME!");
613 /* JVM_CompilerCommand */
615 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
617 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
621 /* JVM_EnableCompiler */
623 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
625 TRACEJVMCALLS("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls);
626 PRINTJVMWARNINGS("JVM_EnableCompiler not supported");
630 /* JVM_DisableCompiler */
632 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
634 TRACEJVMCALLS("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls);
635 PRINTJVMWARNINGS("JVM_DisableCompiler not supported");
639 /* JVM_GetLastErrorString */
641 jint JVM_GetLastErrorString(char *buf, int len)
667 char *JVM_NativePath(char *path)
669 TRACEJVMCALLS("JVM_NativePath(path=%s)", path);
671 /* XXX is this correct? */
677 /* JVM_GetCallerClass */
679 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
681 java_handle_objectarray_t *oa;
683 TRACEJVMCALLS("JVM_GetCallerClass(env=%p, depth=%d)", env, depth);
685 oa = stacktrace_getClassContext();
690 if (oa->header.size < depth)
693 return (jclass) oa->data[depth - 1];
698 /* JVM_FindPrimitiveClass */
700 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
705 TRACEJVMCALLS("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s);
708 c = primitive_class_get_by_name(u);
710 return (jclass) LLNI_classinfo_wrap(c);
714 /* JVM_ResolveClass */
716 void JVM_ResolveClass(JNIEnv* env, jclass cls)
718 TRACEJVMCALLS("JVM_ResolveClass(env=%p, cls=%p)", env, cls);
719 PRINTJVMWARNINGS("JVM_ResolveClass not implemented");
723 /* JVM_FindClassFromClassLoader */
725 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
731 TRACEJVMCALLS("JVM_FindClassFromClassLoader: name=%s, init=%d, loader=%p, throwError=%d", name, init, loader, throwError);
733 u = utf_new_char(name);
734 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
736 c = load_class_from_classloader(u, cl);
742 if (!(c->state & CLASS_INITIALIZED))
743 if (!initialize_class(c))
746 return (jclass) LLNI_classinfo_wrap(c);
750 /* JVM_FindClassFromClass */
752 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
754 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
758 /* JVM_DefineClass */
760 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
762 log_println("JVM_DefineClass: IMPLEMENT ME!");
766 /* JVM_DefineClassWithSource */
768 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
774 TRACEJVMCALLS("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source);
776 u = utf_new_char(name);
777 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
779 /* XXX do something with source */
781 c = class_define(u, cl, len, (const uint8_t *) buf, (java_handle_t *) pd);
783 return (jclass) LLNI_classinfo_wrap(c);
787 /* JVM_FindLoadedClass */
789 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
795 TRACEJVMCALLS("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name);
797 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
799 u = javastring_toutf((java_handle_t *) name, true);
800 c = classcache_lookup(cl, u);
802 return (jclass) LLNI_classinfo_wrap(c);
806 /* JVM_GetClassName */
808 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
811 log_println("JVM_GetClassName: cls=%p", cls);
813 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
817 /* JVM_GetClassInterfaces */
819 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
822 java_handle_objectarray_t *oa;
824 TRACEJVMCALLS("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls);
826 c = LLNI_classinfo_unwrap(cls);
828 oa = class_get_interfaces(c);
830 return (jobjectArray) oa;
834 /* JVM_GetClassLoader */
836 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
841 TRACEJVMCALLS("JVM_GetClassLoader(env=%p, cls=%p)", env, cls);
843 c = LLNI_classinfo_unwrap(cls);
844 cl = class_get_classloader(c);
850 /* JVM_IsInterface */
852 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
857 log_println("JVM_IsInterface: cls=%p", cls);
860 c = LLNI_classinfo_unwrap(cls);
862 return class_is_interface(c);
866 /* JVM_GetClassSigners */
868 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
870 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
874 /* JVM_SetClassSigners */
876 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
878 log_println("JVM_SetClassSigners: IMPLEMENT ME!");
882 /* JVM_GetProtectionDomain */
884 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
888 TRACEJVMCALLS("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls);
890 c = LLNI_classinfo_unwrap(cls);
893 exceptions_throw_nullpointerexception();
897 /* Primitive types do not have a protection domain. */
899 if (class_is_primitive(c))
902 return (jobject) c->protectiondomain;
906 /* JVM_SetProtectionDomain */
908 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
910 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
914 /* JVM_DoPrivileged */
916 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
921 java_handle_t *result;
925 log_println("JVM_DoPrivileged: action=%p, context=%p, wrapException=%d", action, context, wrapException);
928 o = (java_handle_t *) action;
931 if (action == NULL) {
932 exceptions_throw_nullpointerexception();
936 /* lookup run() method (throw no exceptions) */
938 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
941 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
942 exceptions_throw_internalerror("No run method");
946 /* XXX It seems something with a privileged stack needs to be done
949 result = vm_call_method(m, o);
951 e = exceptions_get_and_clear_exception();
954 exceptions_throw_privilegedactionexception(e);
958 return (jobject) result;
962 /* JVM_GetInheritedAccessControlContext */
964 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
966 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
970 /* JVM_GetStackAccessControlContext */
972 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
974 log_println("JVM_GetStackAccessControlContext: IMPLEMENT ME!");
978 /* JVM_IsArrayClass */
980 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
983 log_println("JVM_IsArrayClass: cls=%p", cls);
985 return class_is_array(LLNI_classinfo_unwrap(cls));
989 /* JVM_IsPrimitiveClass */
991 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
995 c = LLNI_classinfo_unwrap(cls);
998 log_println("JVM_IsPrimitiveClass(cls=%p)", cls);
1001 return class_is_primitive(c);
1005 /* JVM_GetComponentType */
1007 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1009 classinfo *component;
1012 TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
1014 c = LLNI_classinfo_unwrap(cls);
1016 component = class_get_componenttype(c);
1018 return (jclass) LLNI_classinfo_wrap(component);
1022 /* JVM_GetClassModifiers */
1024 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1029 log_println("JVM_GetClassModifiers: cls=%p", cls);
1032 c = LLNI_classinfo_unwrap(cls);
1034 /* XXX is this correct? */
1036 return c->flags & ACC_CLASS_REFLECT_MASK;
1040 /* JVM_GetDeclaredClasses */
1042 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1045 java_handle_objectarray_t *oa;
1047 TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
1049 c = LLNI_classinfo_unwrap(ofClass);
1051 oa = class_get_declaredclasses(c, false);
1053 return (jobjectArray) oa;
1057 /* JVM_GetDeclaringClass */
1059 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1064 TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
1066 c = LLNI_classinfo_unwrap(ofClass);
1068 dc = class_get_declaringclass(c);
1070 return (jclass) LLNI_classinfo_wrap(dc);
1074 /* JVM_GetClassSignature */
1076 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1082 TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
1084 c = (classinfo *) cls;
1086 /* Get the signature of the class. */
1088 u = class_get_signature(c);
1093 /* Convert UTF-string to a Java-string. */
1095 s = javastring_new(u);
1101 /* JVM_GetClassAnnotations */
1103 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1105 classinfo *c = NULL;
1106 java_handle_bytearray_t *annotations = NULL;
1108 TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
1111 exceptions_throw_nullpointerexception();
1115 c = LLNI_classinfo_unwrap(cls);
1117 /* get annotations: */
1118 annotations = class_get_annotations(c);
1120 return (jbyteArray)annotations;
1124 /* JVM_GetFieldAnnotations */
1126 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1128 java_lang_reflect_Field *rf = (java_lang_reflect_Field*)field;
1129 java_handle_bytearray_t *ba = NULL;
1131 TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
1133 if (field == NULL) {
1134 exceptions_throw_nullpointerexception();
1138 LLNI_field_get_ref(rf, annotations, ba);
1140 return (jbyteArray)ba;
1144 /* JVM_GetMethodAnnotations */
1146 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1148 java_lang_reflect_Method *rm = (java_lang_reflect_Method*)method;
1149 java_handle_bytearray_t *ba = NULL;
1151 TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
1153 if (method == NULL) {
1154 exceptions_throw_nullpointerexception();
1158 LLNI_field_get_ref(rm, annotations, ba);
1160 return (jbyteArray)ba;
1164 /* JVM_GetMethodDefaultAnnotationValue */
1166 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1168 java_lang_reflect_Method *rm = (java_lang_reflect_Method*)method;
1169 java_handle_bytearray_t *ba = NULL;
1171 TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
1173 if (method == NULL) {
1174 exceptions_throw_nullpointerexception();
1178 LLNI_field_get_ref(rm, annotationDefault, ba);
1180 return (jbyteArray)ba;
1184 /* JVM_GetMethodParameterAnnotations */
1186 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1188 java_lang_reflect_Method *rm = (java_lang_reflect_Method*)method;
1189 java_handle_bytearray_t *ba = NULL;
1191 TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
1193 if (method == NULL) {
1194 exceptions_throw_nullpointerexception();
1198 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1200 return (jbyteArray)ba;
1204 /* JVM_GetClassDeclaredFields */
1206 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1209 log_println("JVM_GetClassDeclaredFields: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1211 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1215 /* JVM_GetClassDeclaredMethods */
1217 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1220 log_println("JVM_GetClassDeclaredMethods: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1222 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1226 /* JVM_GetClassDeclaredConstructors */
1228 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1231 log_println("JVM_GetClassDeclaredConstructors: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1233 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1237 /* JVM_GetClassAccessFlags */
1239 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1244 log_println("JVM_GetClassAccessFlags: cls=%p", cls);
1247 c = LLNI_classinfo_unwrap(cls);
1249 return c->flags & ACC_CLASS_REFLECT_MASK;
1253 /* JVM_GetClassConstantPool */
1255 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1257 #if defined(ENABLE_ANNOTATIONS)
1258 sun_reflect_ConstantPool *constantPool = NULL;
1259 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1261 TRACEJVMCALLS("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls);
1264 (sun_reflect_ConstantPool*)native_new_and_init(
1265 class_sun_reflect_ConstantPool);
1267 if (constantPool == NULL) {
1272 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1274 return (jobject)constantPool;
1276 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1282 /* JVM_ConstantPoolGetSize */
1284 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1288 TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
1290 c = LLNI_classinfo_unwrap(jcpool);
1296 /* JVM_ConstantPoolGetClassAt */
1298 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1300 constant_classref *ref;
1304 TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
1306 c = LLNI_classinfo_unwrap(jcpool);
1308 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1311 exceptions_throw_illegalargumentexception();
1315 result = resolve_classref_eager(ref);
1317 return (jclass) LLNI_classinfo_wrap(result);
1321 /* JVM_ConstantPoolGetClassAtIfLoaded */
1323 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1325 constant_classref *ref;
1329 TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
1331 c = LLNI_classinfo_unwrap(jcpool);
1333 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1336 exceptions_throw_illegalargumentexception();
1340 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1344 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1348 return (jclass) LLNI_classinfo_wrap(result);
1352 /* JVM_ConstantPoolGetMethodAt */
1354 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1356 constant_FMIref *ref;
1357 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1359 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
1361 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1364 exceptions_throw_illegalargumentexception();
1368 /* XXX: is that right? or do I have to use resolve_method_*? */
1369 return (jobject)reflect_method_new(ref->p.method);
1373 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1375 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1377 constant_FMIref *ref;
1378 classinfo *c = NULL;
1379 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1381 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1383 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1386 exceptions_throw_illegalargumentexception();
1390 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1394 if (c == NULL || !(c->state & CLASS_LOADED)) {
1398 return (jobject)reflect_method_new(ref->p.method);
1402 /* JVM_ConstantPoolGetFieldAt */
1404 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1406 constant_FMIref *ref;
1407 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1409 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
1411 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1414 exceptions_throw_illegalargumentexception();
1418 return (jobject)reflect_field_new(ref->p.field);
1422 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1424 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1426 constant_FMIref *ref;
1428 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1430 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1432 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1435 exceptions_throw_illegalargumentexception();
1439 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1443 if (c == NULL || !(c->state & CLASS_LOADED)) {
1447 return (jobject)reflect_field_new(ref->p.field);
1451 /* JVM_ConstantPoolGetMemberRefInfoAt */
1453 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1455 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1460 /* JVM_ConstantPoolGetIntAt */
1462 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1464 constant_integer *ref;
1465 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1467 TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
1469 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1472 exceptions_throw_illegalargumentexception();
1480 /* JVM_ConstantPoolGetLongAt */
1482 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1485 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1487 TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
1489 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1492 exceptions_throw_illegalargumentexception();
1500 /* JVM_ConstantPoolGetFloatAt */
1502 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1504 constant_float *ref;
1505 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1507 TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
1509 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1512 exceptions_throw_illegalargumentexception();
1520 /* JVM_ConstantPoolGetDoubleAt */
1522 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1524 constant_double *ref;
1525 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1527 TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
1529 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1532 exceptions_throw_illegalargumentexception();
1540 /* JVM_ConstantPoolGetStringAt */
1542 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1545 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1547 TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
1549 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1552 exceptions_throw_illegalargumentexception();
1556 /* XXX: I hope literalstring_new is the right Function. */
1557 return (jstring)literalstring_new(ref);
1561 /* JVM_ConstantPoolGetUTF8At */
1563 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1566 classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1568 TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
1570 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1573 exceptions_throw_illegalargumentexception();
1577 /* XXX: I hope literalstring_new is the right Function. */
1578 return (jstring)literalstring_new(ref);
1582 /* JVM_DesiredAssertionStatus */
1584 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1586 TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
1588 /* TODO: Implement this one, but false should be OK. */
1594 /* JVM_AssertionStatusDirectives */
1596 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1599 java_lang_AssertionStatusDirectives *o;
1600 java_handle_objectarray_t *classes;
1601 java_handle_objectarray_t *packages;
1604 log_println("JVM_AssertionStatusDirectives");
1606 /* XXX this is not completely implemented */
1608 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1613 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1618 classes = builtin_anewarray(0, class_java_lang_Object);
1620 if (classes == NULL)
1623 packages = builtin_anewarray(0, class_java_lang_Object);
1625 if (packages == NULL)
1628 /* set instance fields */
1630 o->classes = classes;
1631 o->packages = packages;
1637 /* JVM_GetClassNameUTF */
1639 const char* JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1641 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1645 /* JVM_GetClassCPTypes */
1647 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1649 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1653 /* JVM_GetClassCPEntriesCount */
1655 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1657 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1661 /* JVM_GetClassFieldsCount */
1663 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1665 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1669 /* JVM_GetClassMethodsCount */
1671 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1673 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1677 /* JVM_GetMethodIxExceptionIndexes */
1679 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1681 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1685 /* JVM_GetMethodIxExceptionsCount */
1687 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1689 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1693 /* JVM_GetMethodIxByteCode */
1695 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1697 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1701 /* JVM_GetMethodIxByteCodeLength */
1703 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1705 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1709 /* JVM_GetMethodIxExceptionTableEntry */
1711 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1713 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1717 /* JVM_GetMethodIxExceptionTableLength */
1719 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1721 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1725 /* JVM_GetMethodIxModifiers */
1727 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1729 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1733 /* JVM_GetFieldIxModifiers */
1735 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1737 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1741 /* JVM_GetMethodIxLocalsCount */
1743 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1745 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1749 /* JVM_GetMethodIxArgsSize */
1751 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1753 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1757 /* JVM_GetMethodIxMaxStack */
1759 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1761 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1765 /* JVM_IsConstructorIx */
1767 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1769 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1773 /* JVM_GetMethodIxNameUTF */
1775 const char* JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1777 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1781 /* JVM_GetMethodIxSignatureUTF */
1783 const char* JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1785 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1789 /* JVM_GetCPFieldNameUTF */
1791 const char* JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1793 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1797 /* JVM_GetCPMethodNameUTF */
1799 const char* JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1801 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1805 /* JVM_GetCPMethodSignatureUTF */
1807 const char* JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1809 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1813 /* JVM_GetCPFieldSignatureUTF */
1815 const char* JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1817 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1821 /* JVM_GetCPClassNameUTF */
1823 const char* JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1825 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
1829 /* JVM_GetCPFieldClassNameUTF */
1831 const char* JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1833 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
1837 /* JVM_GetCPMethodClassNameUTF */
1839 const char* JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1841 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
1845 /* JVM_GetCPFieldModifiers */
1847 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1849 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
1853 /* JVM_GetCPMethodModifiers */
1855 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1857 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
1861 /* JVM_ReleaseUTF */
1863 void JVM_ReleaseUTF(const char *utf)
1865 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
1869 /* JVM_IsSameClassPackage */
1871 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
1873 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
1879 jint JVM_Open(const char *fname, jint flags, jint mode)
1884 log_println("JVM_Open: fname=%s, flags=%d, mode=%d", fname, flags, mode);
1887 result = open(fname, flags, mode);
1895 /* XXX don't know what to do here */
1896 /* return JVM_EEXIST; */
1907 jint JVM_Close(jint fd)
1910 log_println("JVM_Close: fd=%d", fd);
1918 jint JVM_Read(jint fd, char *buf, jint nbytes)
1921 log_println("JVM_Read: fd=%d, buf=%p, nbytes=%d", fd, buf, nbytes);
1923 return read(fd, buf, nbytes);
1929 jint JVM_Write(jint fd, char *buf, jint nbytes)
1932 log_println("JVM_Write: fd=%d, buf=%s, nbytes=%d", fd, buf, nbytes);
1934 return write(fd, buf, nbytes);
1940 jint JVM_Available(jint fd, jlong *pbytes)
1942 #if defined(FIONREAD)
1945 TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
1949 if (ioctl(fd, FIONREAD, &bytes) < 0)
1956 # error FIONREAD not defined
1963 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
1966 log_println("JVM_Lseek: fd=%d, offset=%ld, whence=%d", fd, offset, whence);
1968 return (jlong) lseek(fd, (off_t) offset, whence);
1974 jint JVM_SetLength(jint fd, jlong length)
1976 log_println("JVM_SetLength: IMPLEMENT ME!");
1982 jint JVM_Sync(jint fd)
1984 log_println("JVM_Sync: IMPLEMENT ME!");
1988 /* JVM_StartThread */
1990 void JVM_StartThread(JNIEnv* env, jobject jthread)
1993 log_println("JVM_StartThread: jthread=%p", jthread);
1995 _Jv_java_lang_Thread_start((java_lang_Thread *) jthread, 0);
1999 /* JVM_StopThread */
2001 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2003 log_println("JVM_StopThread: IMPLEMENT ME!");
2007 /* JVM_IsThreadAlive */
2009 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2012 log_println("JVM_IsThreadAlive: jthread=%p", jthread);
2014 return _Jv_java_lang_Thread_isAlive((java_lang_Thread *) jthread);
2018 /* JVM_SuspendThread */
2020 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2022 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2026 /* JVM_ResumeThread */
2028 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2030 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2034 /* JVM_SetThreadPriority */
2036 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2039 log_println("JVM_SetThreadPriority: jthread=%p, prio=%d", jthread, prio);
2041 _Jv_java_lang_Thread_setPriority((java_lang_Thread *) jthread, prio);
2047 void JVM_Yield(JNIEnv *env, jclass threadClass)
2049 TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
2057 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2060 log_println("JVM_Sleep: threadClass=%p, millis=%ld", threadClass, millis);
2062 _Jv_java_lang_Thread_sleep(millis);
2066 /* JVM_CurrentThread */
2068 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2071 log_println("JVM_CurrentThread: threadClass=%p", threadClass);
2073 return (jobject) _Jv_java_lang_Thread_currentThread();
2077 /* JVM_CountStackFrames */
2079 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2081 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2087 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2089 log_println("JVM_Interrupt: IMPLEMENT ME!");
2093 /* JVM_IsInterrupted */
2095 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2098 log_println("JVM_IsInterrupted: jthread=%p, clear_interrupted=%d", jthread, clear_interrupted);
2100 /* XXX do something with clear_interrupted */
2101 return _Jv_java_lang_Thread_isInterrupted((java_lang_Thread *) jthread);
2107 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2109 log_println("JVM_HoldsLock: IMPLEMENT ME!");
2113 /* JVM_DumpAllStacks */
2115 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2117 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2121 /* JVM_CurrentLoadedClass */
2123 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2125 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2129 /* JVM_CurrentClassLoader */
2131 jobject JVM_CurrentClassLoader(JNIEnv *env)
2133 /* XXX if a method in a class in a trusted loader is in a
2134 doPrivileged, return NULL */
2136 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2140 /* JVM_GetClassContext */
2142 jobjectArray JVM_GetClassContext(JNIEnv *env)
2145 log_println("JVM_GetClassContext");
2147 return (jobjectArray) stacktrace_getClassContext();
2151 /* JVM_ClassDepth */
2153 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2155 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2159 /* JVM_ClassLoaderDepth */
2161 jint JVM_ClassLoaderDepth(JNIEnv *env)
2163 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2167 /* JVM_GetSystemPackage */
2169 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2171 log_println("JVM_GetSystemPackage(env=%p, name=%p)");
2172 javastring_print((java_handle_t *) name);
2179 /* JVM_GetSystemPackages */
2181 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2183 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2187 /* JVM_AllocateNewObject */
2189 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2191 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2195 /* JVM_AllocateNewArray */
2197 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2199 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2203 /* JVM_LatestUserDefinedLoader */
2205 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2207 log_println("JVM_LatestUserDefinedLoader: IMPLEMENT ME!");
2211 /* JVM_LoadClass0 */
2213 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2215 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2219 /* JVM_GetArrayLength */
2221 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2225 TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
2227 a = (java_handle_t *) arr;
2229 return array_length_get(a);
2233 /* JVM_GetArrayElement */
2235 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2240 TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
2242 a = (java_handle_t *) arr;
2244 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2245 /* exceptions_throw_illegalargumentexception(); */
2249 o = array_element_get(a, index);
2255 /* JVM_GetPrimitiveArrayElement */
2257 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2259 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2263 /* JVM_SetArrayElement */
2265 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2268 java_handle_t *value;
2270 TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
2272 a = (java_handle_t *) arr;
2273 value = (java_handle_t *) val;
2275 array_element_set(a, index, value);
2279 /* JVM_SetPrimitiveArrayElement */
2281 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2283 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2289 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2294 java_handle_objectarray_t *oa;
2296 TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
2298 if (eltClass == NULL) {
2299 exceptions_throw_nullpointerexception();
2303 /* NegativeArraySizeException is checked in builtin_newarray. */
2305 c = LLNI_classinfo_unwrap(eltClass);
2307 /* create primitive or object array */
2309 if (class_is_primitive(c)) {
2310 pc = primitive_arrayclass_get_by_name(c->name);
2311 a = builtin_newarray(length, pc);
2316 oa = builtin_anewarray(length, c);
2318 return (jobject) oa;
2323 /* JVM_NewMultiArray */
2325 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2328 java_handle_intarray_t *ia;
2334 java_handle_objectarray_t *a;
2336 TRACEJVMCALLS("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim);
2338 if (eltClass == NULL) {
2339 exceptions_throw_nullpointerexception();
2343 /* NegativeArraySizeException is checked in builtin_newarray. */
2345 c = LLNI_classinfo_unwrap(eltClass);
2347 /* XXX This is just a quick hack to get it working. */
2349 ia = (java_handle_intarray_t *) dim;
2351 length = array_length_get(ia);
2353 dims = MNEW(long, length);
2355 for (i = 0; i < length; i++) {
2356 value = LLNI_array_direct(ia, i);
2357 dims[i] = (long) value;
2360 /* Create an array-class if necessary. */
2362 if (class_is_primitive(c))
2363 ac = primitive_arrayclass_get_by_name(c->name);
2365 ac = class_array_of(c, true);
2370 a = builtin_multianewarray(length, ac, dims);
2376 /* JVM_InitializeSocketLibrary */
2378 jint JVM_InitializeSocketLibrary()
2380 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2386 jint JVM_Socket(jint domain, jint type, jint protocol)
2388 TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
2390 return socket(domain, type, protocol);
2394 /* JVM_SocketClose */
2396 jint JVM_SocketClose(jint fd)
2398 TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
2404 /* JVM_SocketShutdown */
2406 jint JVM_SocketShutdown(jint fd, jint howto)
2408 TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
2410 return shutdown(fd, howto);
2416 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2418 log_println("JVM_Recv: IMPLEMENT ME!");
2424 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2426 log_println("JVM_Send: IMPLEMENT ME!");
2432 jint JVM_Timeout(int fd, long timeout)
2434 log_println("JVM_Timeout: IMPLEMENT ME!");
2440 jint JVM_Listen(jint fd, jint count)
2442 TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
2444 return listen(fd, count);
2450 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2452 TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
2454 return connect(fd, him, len);
2460 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2462 log_println("JVM_Bind: IMPLEMENT ME!");
2468 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2470 TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
2472 return accept(fd, him, (socklen_t *) len);
2478 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2480 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2484 /* JVM_GetSockName */
2486 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2488 TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
2490 return getsockname(fd, him, (socklen_t *) len);
2496 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2498 log_println("JVM_SendTo: IMPLEMENT ME!");
2502 /* JVM_SocketAvailable */
2504 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2506 log_println("JVM_SocketAvailable: IMPLEMENT ME!");
2510 /* JVM_GetSockOpt */
2512 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2514 log_println("JVM_GetSockOpt: IMPLEMENT ME!");
2518 /* JVM_SetSockOpt */
2520 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2522 TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
2524 return setsockopt(fd, level, optname, optval, optlen);
2528 /* JVM_GetHostName */
2530 int JVM_GetHostName(char* name, int namelen)
2532 TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
2534 return gethostname(name, namelen);
2538 /* JVM_GetHostByAddr */
2540 struct hostent* JVM_GetHostByAddr(const char* name, int len, int type)
2542 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2546 /* JVM_GetHostByName */
2548 struct hostent* JVM_GetHostByName(char* name)
2550 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2554 /* JVM_GetProtoByName */
2556 struct protoent* JVM_GetProtoByName(char* name)
2558 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2562 /* JVM_LoadLibrary */
2564 void *JVM_LoadLibrary(const char *name)
2568 TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
2570 u = utf_new_char(name);
2572 return native_library_open(u);
2576 /* JVM_UnloadLibrary */
2578 void JVM_UnloadLibrary(void* handle)
2580 log_println("JVM_UnloadLibrary: IMPLEMENT ME!");
2584 /* JVM_FindLibraryEntry */
2586 void *JVM_FindLibraryEntry(void *handle, const char *name)
2590 TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
2592 symbol = lt_dlsym(handle, name);
2600 jboolean JVM_IsNaN(jdouble a)
2602 log_println("JVM_IsNaN: IMPLEMENT ME!");
2606 /* JVM_IsSupportedJNIVersion */
2608 jboolean JVM_IsSupportedJNIVersion(jint version)
2610 TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
2613 case JNI_VERSION_1_1:
2614 case JNI_VERSION_1_2:
2615 case JNI_VERSION_1_4:
2616 case JNI_VERSION_1_6:
2624 /* JVM_InternString */
2626 jstring JVM_InternString(JNIEnv *env, jstring str)
2628 TRACEJVMCALLS("JVM_InternString(env=%p, str=%p)", env, str);
2630 return (jstring) javastring_intern((java_handle_t *) str);
2634 /* JVM_RawMonitorCreate */
2636 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2641 log_println("JVM_RawMonitorCreate");
2644 o = NEW(java_object_t);
2646 lock_init_object_lock(o);
2652 /* JVM_RawMonitorDestroy */
2654 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
2657 log_println("JVM_RawMonitorDestroy: mon=%p", mon);
2659 FREE(mon, java_object_t);
2663 /* JVM_RawMonitorEnter */
2665 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
2668 log_println("JVM_RawMonitorEnter: mon=%p", mon);
2670 (void) lock_monitor_enter((java_object_t *) mon);
2676 /* JVM_RawMonitorExit */
2678 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
2681 log_println("JVM_RawMonitorExit: mon=%p", mon);
2683 (void) lock_monitor_exit((java_object_t *) mon);
2687 /* JVM_SetPrimitiveFieldValues */
2689 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2691 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
2695 /* JVM_GetPrimitiveFieldValues */
2697 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2699 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
2703 /* JVM_AccessVMBooleanFlag */
2705 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
2707 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
2711 /* JVM_AccessVMIntFlag */
2713 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
2715 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
2719 /* JVM_VMBreakPoint */
2721 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
2723 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
2727 /* JVM_GetClassFields */
2729 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
2731 log_println("JVM_GetClassFields: IMPLEMENT ME!");
2735 /* JVM_GetClassMethods */
2737 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
2739 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
2743 /* JVM_GetClassConstructors */
2745 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
2747 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
2751 /* JVM_GetClassField */
2753 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
2755 log_println("JVM_GetClassField: IMPLEMENT ME!");
2759 /* JVM_GetClassMethod */
2761 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
2763 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
2767 /* JVM_GetClassConstructor */
2769 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
2771 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
2775 /* JVM_NewInstance */
2777 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
2779 log_println("JVM_NewInstance: IMPLEMENT ME!");
2785 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
2787 log_println("JVM_GetField: IMPLEMENT ME!");
2791 /* JVM_GetPrimitiveField */
2793 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
2795 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
2801 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
2803 log_println("JVM_SetField: IMPLEMENT ME!");
2807 /* JVM_SetPrimitiveField */
2809 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
2811 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
2815 /* JVM_InvokeMethod */
2817 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
2820 log_println("JVM_InvokeMethod: method=%p, obj=%p, args0=%p", method, obj, args0);
2822 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
2826 /* JVM_NewInstanceFromConstructor */
2828 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
2831 log_println("JVM_NewInstanceFromConstructor: c=%p, args0=%p", c, args0);
2833 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
2837 /* JVM_SupportsCX8 */
2839 jboolean JVM_SupportsCX8()
2842 log_println("JVM_SupportsCX8");
2844 return _Jv_java_util_concurrent_atomic_AtomicLong_VMSupportsCS8(NULL, NULL);
2850 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
2852 log_println("JVM_CX8Field: IMPLEMENT ME!");
2856 /* JVM_GetAllThreads */
2858 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
2860 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
2864 /* JVM_DumpThreads */
2866 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
2868 log_println("JVM_DumpThreads: IMPLEMENT ME!");
2872 /* JVM_GetManagement */
2874 void* JVM_GetManagement(jint version)
2876 log_println("JVM_GetManagement: IMPLEMENT ME!");
2880 /* JVM_InitAgentProperties */
2882 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
2884 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
2888 /* JVM_GetEnclosingMethodInfo */
2890 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
2892 log_println("JVM_GetEnclosingMethodInfo: IMPLEMENT ME!");
2896 /* JVM_GetThreadStateValues */
2898 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
2900 java_handle_intarray_t *ia;
2902 TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
2903 env, javaThreadState);
2905 /* If new thread states are added in future JDK and VM versions,
2906 this should check if the JDK version is compatible with thread
2907 states supported by the VM. Return NULL if not compatible.
2909 This function must map the VM java_lang_Thread::ThreadStatus
2910 to the Java thread state that the JDK supports. */
2912 switch (javaThreadState) {
2913 case THREAD_STATE_NEW:
2914 ia = builtin_newarray_int(1);
2919 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
2922 case THREAD_STATE_RUNNABLE:
2923 ia = builtin_newarray_int(1);
2928 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
2931 case THREAD_STATE_BLOCKED:
2932 ia = builtin_newarray_int(1);
2937 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
2940 case THREAD_STATE_WAITING:
2941 ia = builtin_newarray_int(2);
2946 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
2947 /* XXX Implement parked stuff. */
2948 /* array_intarray_element_set(ia, 1, PARKED); */
2951 case THREAD_STATE_TIMED_WAITING:
2952 ia = builtin_newarray_int(3);
2957 /* XXX Not sure about that one. */
2958 /* array_intarray_element_set(ia, 0, SLEEPING); */
2959 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
2960 /* XXX Implement parked stuff. */
2961 /* array_intarray_element_set(ia, 2, PARKED); */
2964 case THREAD_STATE_TERMINATED:
2965 ia = builtin_newarray_int(1);
2970 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
2974 /* Unknown state - probably incompatible JDK version */
2978 return (jintArray) ia;
2982 /* JVM_GetThreadStateNames */
2984 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
2986 java_handle_intarray_t *ia;
2987 java_handle_objectarray_t *oa;
2990 TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
2991 env, javaThreadState, values);
2993 ia = (java_handle_intarray_t *) values;
2995 /* If new thread states are added in future JDK and VM versions,
2996 this should check if the JDK version is compatible with thread
2997 states supported by the VM. Return NULL if not compatible.
2999 This function must map the VM java_lang_Thread::ThreadStatus
3000 to the Java thread state that the JDK supports. */
3002 if (values == NULL) {
3003 exceptions_throw_nullpointerexception();
3007 switch (javaThreadState) {
3008 case THREAD_STATE_NEW:
3009 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3011 oa = builtin_anewarray(1, class_java_lang_String);
3016 s = javastring_new(utf_new_char("NEW"));
3021 array_objectarray_element_set(oa, 0, s);
3024 case THREAD_STATE_RUNNABLE:
3025 oa = builtin_anewarray(1, class_java_lang_String);
3030 s = javastring_new(utf_new_char("RUNNABLE"));
3035 array_objectarray_element_set(oa, 0, s);
3038 case THREAD_STATE_BLOCKED:
3039 oa = builtin_anewarray(1, class_java_lang_String);
3044 s = javastring_new(utf_new_char("BLOCKED"));
3049 array_objectarray_element_set(oa, 0, s);
3052 case THREAD_STATE_WAITING:
3053 oa = builtin_anewarray(2, class_java_lang_String);
3058 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3059 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3064 array_objectarray_element_set(oa, 0, s);
3065 /* array_objectarray_element_set(oa, 1, s); */
3068 case THREAD_STATE_TIMED_WAITING:
3069 oa = builtin_anewarray(3, class_java_lang_String);
3074 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3075 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3076 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3081 /* array_objectarray_element_set(oa, 0, s); */
3082 array_objectarray_element_set(oa, 0, s);
3083 /* array_objectarray_element_set(oa, 2, s); */
3086 case THREAD_STATE_TERMINATED:
3087 oa = builtin_anewarray(1, class_java_lang_String);
3092 s = javastring_new(utf_new_char("TERMINATED"));
3097 array_objectarray_element_set(oa, 0, s);
3101 /* Unknown state - probably incompatible JDK version */
3105 return (jobjectArray) oa;
3109 /* JVM_GetVersionInfo */
3111 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3113 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3117 /* OS: JVM_RegisterSignal */
3119 void *JVM_RegisterSignal(jint sig, void *handler)
3121 functionptr newHandler;
3123 TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
3125 if (handler == (void *) 2)
3126 newHandler = (functionptr) signal_thread_handler;
3128 newHandler = (functionptr) (uintptr_t) handler;
3135 /* These signals are already used by the VM. */
3139 /* This signal is used by the VM to dump thread stacks unless
3140 ReduceSignalUsage is set, in which case the user is allowed
3141 to set his own _native_ handler for this signal; thus, in
3142 either case, we do not allow JVM_RegisterSignal to change
3152 signal_register_signal(sig, newHandler, 0);
3154 /* XXX Should return old handler. */
3160 /* OS: JVM_RaiseSignal */
3162 jboolean JVM_RaiseSignal(jint sig)
3164 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3169 /* OS: JVM_FindSignal */
3171 jint JVM_FindSignal(const char *name)
3173 TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
3175 #if defined(__LINUX__)
3176 if (strcmp(name, "HUP") == 0)
3179 if (strcmp(name, "INT") == 0)
3182 if (strcmp(name, "TERM") == 0)
3185 # error not implemented for this OS
3193 * These are local overrides for various environment variables in Emacs.
3194 * Please do not remove this and leave it at the end of the file, where
3195 * Emacs will automagically detect them.
3196 * ---------------------------------------------------------------------
3199 * indent-tabs-mode: t