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/reflect.h"
84 #include "threads/lock-common.h"
85 #include "threads/threads-common.h"
87 #include "toolbox/logging.h"
90 #include "vm/builtin.h"
91 #include "vm/exceptions.h"
92 #include "vm/global.h"
93 #include "vm/initialize.h"
94 #include "vm/primitive.h"
95 #include "vm/properties.h"
96 #include "vm/resolve.h"
97 #include "vm/signallocal.h"
98 #include "vm/stringlocal.h"
101 #include "vm/jit/stacktrace.h"
103 #include "vmcore/classcache.h"
104 #include "vmcore/options.h"
107 /* debugging macros ***********************************************************/
111 # define TRACEJVMCALLS(...) \
113 if (opt_TraceJVMCalls) { \
114 log_println(__VA_ARGS__); \
118 # define PRINTJVMWARNINGS(...)
120 /* if (opt_PrintJVMWarnings) { \ */
121 /* log_println(__VA_ARGS__); \ */
127 # define TRACEJVMCALLS(...)
128 # define PRINTJVMWARNINGS(...)
134 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
135 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
136 /* and build number (xx) */
137 unsigned int update_version : 8; /* Update release version (uu) */
138 unsigned int special_update_version : 8; /* Special update release version (c) */
139 unsigned int reserved1 : 16;
140 unsigned int reserved2;
142 /* The following bits represents JVM supports that JDK has dependency on.
143 * JDK can use these bits to determine which JVM version
144 * and support it has to maintain runtime compatibility.
146 * When a new bit is added in a minor or update release, make sure
147 * the new bit is also added in the main/baseline.
149 unsigned int is_attachable : 1;
157 * A structure used to a capture exception table entry in a Java method.
164 } JVM_ExceptionTableEntryType;
167 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
169 if ((intptr_t) count <= 0)
172 return vsnprintf(str, count, fmt, args);
176 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
182 len = jio_vsnprintf(str, count, fmt, ap);
189 int jio_fprintf(FILE* f, const char *fmt, ...)
191 log_println("jio_fprintf: IMPLEMENT ME!");
195 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
197 log_println("jio_vfprintf: IMPLEMENT ME!");
201 int jio_printf(const char *fmt, ...)
203 log_println("jio_printf: IMPLEMENT ME!");
207 /* JVM_GetInterfaceVersion */
209 jint JVM_GetInterfaceVersion()
211 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
213 #define JVM_INTERFACE_VERSION 4
215 return JVM_INTERFACE_VERSION;
219 /* JVM_CurrentTimeMillis */
221 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
224 log_println("JVM_CurrentTimeMillis");
226 return (jlong) builtin_currenttimemillis();
232 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
235 log_println("JVM_NanoTime");
237 return (jlong) builtin_nanotime();
243 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
248 s = (java_handle_t *) src;
249 d = (java_handle_t *) dst;
252 log_println("JVM_ArrayCopy: src=%p, src_pos=%d, dst=%p, dst_pos=%d, length=%d", src, src_pos, dst, dst_pos, length);
255 builtin_arraycopy(s, src_pos, d, dst_pos, length);
259 /* JVM_InitProperties */
261 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
264 log_println("JVM_InitProperties: properties=%d", properties);
266 properties_system_add_all((java_handle_t *) properties);
272 void JVM_Exit(jint code)
274 log_println("JVM_Exit: IMPLEMENT ME!");
280 void JVM_Halt(jint code)
283 log_println("JVM_Halt: code=%d", code);
290 /* JVM_OnExit(void (*func)) */
292 void JVM_OnExit(void (*func)(void))
294 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
302 TRACEJVMCALLS("JVM_GC()");
308 /* JVM_MaxObjectInspectionAge */
310 jlong JVM_MaxObjectInspectionAge(void)
312 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
316 /* JVM_TraceInstructions */
318 void JVM_TraceInstructions(jboolean on)
320 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
324 /* JVM_TraceMethodCalls */
326 void JVM_TraceMethodCalls(jboolean on)
328 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
332 /* JVM_TotalMemory */
334 jlong JVM_TotalMemory(void)
336 TRACEJVMCALLS("JVM_TotalMemory()");
338 return gc_get_heap_size();
344 jlong JVM_FreeMemory(void)
346 TRACEJVMCALLS("JVM_FreeMemory()");
348 return gc_get_free_bytes();
354 jlong JVM_MaxMemory(void)
356 TRACEJVMCALLS("JVM_MaxMemory()");
358 return gc_get_max_heap_size();
362 /* JVM_ActiveProcessorCount */
364 jint JVM_ActiveProcessorCount(void)
366 log_println("JVM_ActiveProcessorCount: IMPLEMENT ME!");
370 /* JVM_FillInStackTrace */
372 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
374 java_lang_Throwable *o;
375 stacktracecontainer *stc;
378 log_println("JVM_FillInStackTrace: receiver=%p", receiver);
381 o = (java_lang_Throwable *) receiver;
383 stc = stacktrace_fillInStackTrace();
388 o->backtrace = (java_lang_Object *) stc;
392 /* JVM_PrintStackTrace */
394 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
396 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
400 /* JVM_GetStackTraceDepth */
402 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
404 java_lang_Throwable *o;
405 stacktracecontainer *stc;
406 stacktracebuffer *stb;
409 log_println("JVM_GetStackTraceDepth: throwable=%p", throwable);
412 o = (java_lang_Throwable *) throwable;
413 stc = (stacktracecontainer *) o->backtrace;
420 /* JVM_GetStackTraceElement */
422 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
424 java_lang_Throwable *t;
425 stacktracecontainer *stc;
426 stacktracebuffer *stb;
427 stacktrace_entry *ste;
428 java_lang_StackTraceElement *o;
429 java_lang_String *declaringclass;
430 java_lang_String *filename;
434 log_println("JVM_GetStackTraceElement: throwable=%p, index=%d", throwable, index);
437 t = (java_lang_Throwable *) throwable;
438 stc = (stacktracecontainer *) t->backtrace;
441 if ((index < 0) || (index >= stb->used)) {
442 /* XXX This should be an IndexOutOfBoundsException (check this
445 exceptions_throw_arrayindexoutofboundsexception();
449 ste = &(stb->entries[index]);
451 /* allocate a new StackTraceElement */
453 o = (java_lang_StackTraceElement *)
454 builtin_new(class_java_lang_StackTraceElement);
461 if (!(ste->method->flags & ACC_NATIVE)) {
462 if (ste->method->class->sourcefile)
463 filename = (java_lang_String *) javastring_new(ste->method->class->sourcefile);
470 /* get line number */
472 if (ste->method->flags & ACC_NATIVE)
475 linenumber = (ste->linenumber == 0) ? -1 : ste->linenumber;
477 /* get declaring class name */
480 _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(ste->method->class));
482 /* fill the java.lang.StackTraceElement element */
484 o->declaringClass = declaringclass;
485 o->methodName = (java_lang_String *) javastring_new(ste->method->name);
486 o->fileName = filename;
487 o->lineNumber = linenumber;
495 jint JVM_IHashCode(JNIEnv* env, jobject handle)
498 log_println("JVM_IHashCode: jobject=%p", handle);
500 return (jint) ((ptrint) handle);
504 /* JVM_MonitorWait */
506 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
508 #if defined(ENABLE_THREADS)
512 TRACEJVMCALLS("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms);
514 /* exceptions_throw_illegalargumentexception("argument out of range"); */
515 exceptions_throw_illegalargumentexception();
519 #if defined(ENABLE_THREADS)
520 o = (java_handle_t *) handle;
523 lock_wait_for_object(LLNI_DIRECT(o), ms, 0);
529 /* JVM_MonitorNotify */
531 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
533 #if defined(ENABLE_THREADS)
537 TRACEJVMCALLS("JVM_MonitorNotify(env=%p, handle=%p)", env, handle);
539 #if defined(ENABLE_THREADS)
540 o = (java_handle_t *) handle;
543 lock_notify_object(LLNI_DIRECT(o));
549 /* JVM_MonitorNotifyAll */
551 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
553 #if defined(ENABLE_THREADS)
557 TRACEJVMCALLS("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle);
559 #if defined(ENABLE_THREADS)
560 o = (java_handle_t *) handle;
563 lock_notify_all_object(LLNI_DIRECT(o));
571 jobject JVM_Clone(JNIEnv* env, jobject handle)
574 log_println("JVM_Clone: handle=%p", handle);
576 return (jobject) builtin_clone(env, (java_handle_t *) handle);
580 /* JVM_InitializeCompiler */
582 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
584 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
588 /* JVM_IsSilentCompiler */
590 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
592 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
596 /* JVM_CompileClass */
598 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
600 log_println("JVM_CompileClass: IMPLEMENT ME!");
604 /* JVM_CompileClasses */
606 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
608 log_println("JVM_CompileClasses: IMPLEMENT ME!");
612 /* JVM_CompilerCommand */
614 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
616 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
620 /* JVM_EnableCompiler */
622 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
624 TRACEJVMCALLS("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls);
625 PRINTJVMWARNINGS("JVM_EnableCompiler not supported");
629 /* JVM_DisableCompiler */
631 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
633 TRACEJVMCALLS("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls);
634 PRINTJVMWARNINGS("JVM_DisableCompiler not supported");
638 /* JVM_GetLastErrorString */
640 jint JVM_GetLastErrorString(char *buf, int len)
666 char *JVM_NativePath(char *path)
668 TRACEJVMCALLS("JVM_NativePath(path=%s)", path);
670 /* XXX is this correct? */
676 /* JVM_GetCallerClass */
678 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
680 java_handle_objectarray_t *oa;
682 TRACEJVMCALLS("JVM_GetCallerClass(env=%p, depth=%d)", env, depth);
684 oa = stacktrace_getClassContext();
689 if (oa->header.size < depth)
692 return (jclass) oa->data[depth - 1];
697 /* JVM_FindPrimitiveClass */
699 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
704 TRACEJVMCALLS("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s);
707 c = primitive_class_get_by_name(u);
709 return (jclass) LLNI_classinfo_wrap(c);
713 /* JVM_ResolveClass */
715 void JVM_ResolveClass(JNIEnv* env, jclass cls)
717 TRACEJVMCALLS("JVM_ResolveClass(env=%p, cls=%p)", env, cls);
718 PRINTJVMWARNINGS("JVM_ResolveClass not implemented");
722 /* JVM_FindClassFromClassLoader */
724 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
730 TRACEJVMCALLS("JVM_FindClassFromClassLoader: name=%s, init=%d, loader=%p, throwError=%d", name, init, loader, throwError);
732 u = utf_new_char(name);
733 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
735 c = load_class_from_classloader(u, cl);
741 if (!(c->state & CLASS_INITIALIZED))
742 if (!initialize_class(c))
745 return (jclass) LLNI_classinfo_wrap(c);
749 /* JVM_FindClassFromClass */
751 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
753 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
757 /* JVM_DefineClass */
759 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
761 log_println("JVM_DefineClass: IMPLEMENT ME!");
765 /* JVM_DefineClassWithSource */
767 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
773 TRACEJVMCALLS("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source);
775 u = utf_new_char(name);
776 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
778 /* XXX do something with source */
780 c = class_define(u, cl, len, (const uint8_t *) buf, (java_handle_t *) pd);
782 return (jclass) LLNI_classinfo_wrap(c);
786 /* JVM_FindLoadedClass */
788 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
794 TRACEJVMCALLS("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name);
796 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
798 u = javastring_toutf((java_handle_t *) name, true);
799 c = classcache_lookup(cl, u);
801 return (jclass) LLNI_classinfo_wrap(c);
805 /* JVM_GetClassName */
807 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
810 log_println("JVM_GetClassName: cls=%p", cls);
812 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
816 /* JVM_GetClassInterfaces */
818 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
821 java_handle_objectarray_t *oa;
823 TRACEJVMCALLS("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls);
825 c = LLNI_classinfo_unwrap(cls);
827 oa = class_get_interfaces(c);
829 return (jobjectArray) oa;
833 /* JVM_GetClassLoader */
835 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
840 TRACEJVMCALLS("JVM_GetClassLoader(env=%p, cls=%p)", env, cls);
842 c = LLNI_classinfo_unwrap(cls);
843 cl = class_get_classloader(c);
849 /* JVM_IsInterface */
851 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
856 log_println("JVM_IsInterface: cls=%p", cls);
859 c = LLNI_classinfo_unwrap(cls);
861 return class_is_interface(c);
865 /* JVM_GetClassSigners */
867 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
869 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
873 /* JVM_SetClassSigners */
875 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
877 log_println("JVM_SetClassSigners: IMPLEMENT ME!");
881 /* JVM_GetProtectionDomain */
883 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
887 TRACEJVMCALLS("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls);
889 c = LLNI_classinfo_unwrap(cls);
892 exceptions_throw_nullpointerexception();
896 /* Primitive types do not have a protection domain. */
898 if (class_is_primitive(c))
901 return (jobject) c->protectiondomain;
905 /* JVM_SetProtectionDomain */
907 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
909 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
913 /* JVM_DoPrivileged */
915 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
920 java_handle_t *result;
924 log_println("JVM_DoPrivileged: action=%p, context=%p, wrapException=%d", action, context, wrapException);
927 o = (java_handle_t *) action;
930 if (action == NULL) {
931 exceptions_throw_nullpointerexception();
935 /* lookup run() method (throw no exceptions) */
937 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
940 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
941 exceptions_throw_internalerror("No run method");
945 /* XXX It seems something with a privileged stack needs to be done
948 result = vm_call_method(m, o);
950 e = exceptions_get_and_clear_exception();
953 exceptions_throw_privilegedactionexception(e);
957 return (jobject) result;
961 /* JVM_GetInheritedAccessControlContext */
963 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
965 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
969 /* JVM_GetStackAccessControlContext */
971 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
973 log_println("JVM_GetStackAccessControlContext: IMPLEMENT ME!");
977 /* JVM_IsArrayClass */
979 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
982 log_println("JVM_IsArrayClass: cls=%p", cls);
984 return class_is_array(LLNI_classinfo_unwrap(cls));
988 /* JVM_IsPrimitiveClass */
990 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
994 c = LLNI_classinfo_unwrap(cls);
997 log_println("JVM_IsPrimitiveClass(cls=%p)", cls);
1000 return class_is_primitive(c);
1004 /* JVM_GetComponentType */
1006 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1008 classinfo *component;
1011 TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
1013 c = LLNI_classinfo_unwrap(cls);
1015 component = class_get_componenttype(c);
1017 return (jclass) LLNI_classinfo_wrap(component);
1021 /* JVM_GetClassModifiers */
1023 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1028 log_println("JVM_GetClassModifiers: cls=%p", cls);
1031 c = LLNI_classinfo_unwrap(cls);
1033 /* XXX is this correct? */
1035 return c->flags & ACC_CLASS_REFLECT_MASK;
1039 /* JVM_GetDeclaredClasses */
1041 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1044 java_handle_objectarray_t *oa;
1046 TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
1048 c = LLNI_classinfo_unwrap(ofClass);
1050 oa = class_get_declaredclasses(c, false);
1052 return (jobjectArray) oa;
1056 /* JVM_GetDeclaringClass */
1058 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1063 TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
1065 c = LLNI_classinfo_unwrap(ofClass);
1067 dc = class_get_declaringclass(c);
1069 return (jclass) LLNI_classinfo_wrap(dc);
1073 /* JVM_GetClassSignature */
1075 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1081 TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
1083 c = LLNI_classinfo_unwrap(cls);
1085 /* Get the signature of the class. */
1087 u = class_get_signature(c);
1092 /* Convert UTF-string to a Java-string. */
1094 s = javastring_new(u);
1100 /* JVM_GetClassAnnotations */
1102 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1104 classinfo *c = NULL; /* classinfo for 'cls' */
1105 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1107 TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
1110 exceptions_throw_nullpointerexception();
1114 c = LLNI_classinfo_unwrap(cls);
1116 /* get annotations: */
1117 annotations = class_get_annotations(c);
1119 return (jbyteArray)annotations;
1123 /* JVM_GetFieldAnnotations */
1125 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1127 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1128 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1130 TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
1132 if (field == NULL) {
1133 exceptions_throw_nullpointerexception();
1137 rf = (java_lang_reflect_Field*)field;
1139 LLNI_field_get_ref(rf, annotations, ba);
1141 return (jbyteArray)ba;
1145 /* JVM_GetMethodAnnotations */
1147 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1149 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1150 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1152 TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
1154 if (method == NULL) {
1155 exceptions_throw_nullpointerexception();
1159 rm = (java_lang_reflect_Method*)method;
1161 LLNI_field_get_ref(rm, annotations, ba);
1163 return (jbyteArray)ba;
1167 /* JVM_GetMethodDefaultAnnotationValue */
1169 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1171 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1172 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1174 TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
1176 if (method == NULL) {
1177 exceptions_throw_nullpointerexception();
1181 rm = (java_lang_reflect_Method*)method;
1183 LLNI_field_get_ref(rm, annotationDefault, ba);
1185 return (jbyteArray)ba;
1189 /* JVM_GetMethodParameterAnnotations */
1191 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1193 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1194 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1196 TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
1198 if (method == NULL) {
1199 exceptions_throw_nullpointerexception();
1203 rm = (java_lang_reflect_Method*)method;
1205 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1207 return (jbyteArray)ba;
1211 /* JVM_GetClassDeclaredFields */
1213 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1216 log_println("JVM_GetClassDeclaredFields: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1218 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1222 /* JVM_GetClassDeclaredMethods */
1224 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1227 log_println("JVM_GetClassDeclaredMethods: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1229 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1233 /* JVM_GetClassDeclaredConstructors */
1235 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1238 log_println("JVM_GetClassDeclaredConstructors: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1240 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1244 /* JVM_GetClassAccessFlags */
1246 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1251 log_println("JVM_GetClassAccessFlags: cls=%p", cls);
1254 c = LLNI_classinfo_unwrap(cls);
1256 return c->flags & ACC_CLASS_REFLECT_MASK;
1260 /* JVM_GetClassConstantPool */
1262 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1264 #if defined(ENABLE_ANNOTATIONS)
1265 sun_reflect_ConstantPool *constantPool = NULL;
1266 /* constant pool object for the class refered by 'cls' */
1267 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1268 /* constantPoolOop field of the constant pool object */
1270 TRACEJVMCALLS("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls);
1273 (sun_reflect_ConstantPool*)native_new_and_init(
1274 class_sun_reflect_ConstantPool);
1276 if (constantPool == NULL) {
1281 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1283 return (jobject)constantPool;
1285 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1291 /* JVM_ConstantPoolGetSize */
1293 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1295 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1297 TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
1299 c = LLNI_classinfo_unwrap(jcpool);
1305 /* JVM_ConstantPoolGetClassAt */
1307 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1309 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1310 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1311 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1313 TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
1315 c = LLNI_classinfo_unwrap(jcpool);
1317 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1320 exceptions_throw_illegalargumentexception();
1324 result = resolve_classref_eager(ref);
1326 return (jclass) LLNI_classinfo_wrap(result);
1330 /* JVM_ConstantPoolGetClassAtIfLoaded */
1332 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1334 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1335 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1336 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1338 TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
1340 c = LLNI_classinfo_unwrap(jcpool);
1342 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1345 exceptions_throw_illegalargumentexception();
1349 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1353 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1357 return (jclass) LLNI_classinfo_wrap(result);
1361 /* JVM_ConstantPoolGetMethodAt */
1363 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1365 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1366 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1368 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
1370 cls = LLNI_classinfo_unwrap(jcpool);
1371 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1374 exceptions_throw_illegalargumentexception();
1378 /* XXX: is that right? or do I have to use resolve_method_*? */
1379 return (jobject)reflect_method_new(ref->p.method);
1383 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1385 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1387 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1388 classinfo *c = NULL; /* resolved declaring class of the method */
1389 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1391 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1393 cls = LLNI_classinfo_unwrap(jcpool);
1394 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1397 exceptions_throw_illegalargumentexception();
1401 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1405 if (c == NULL || !(c->state & CLASS_LOADED)) {
1409 return (jobject)reflect_method_new(ref->p.method);
1413 /* JVM_ConstantPoolGetFieldAt */
1415 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1417 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1418 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1420 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
1422 cls = LLNI_classinfo_unwrap(jcpool);
1423 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1426 exceptions_throw_illegalargumentexception();
1430 return (jobject)reflect_field_new(ref->p.field);
1434 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1436 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1438 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1439 classinfo *c; /* resolved declaring class for the field */
1440 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1442 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1444 cls = LLNI_classinfo_unwrap(jcpool);
1445 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1448 exceptions_throw_illegalargumentexception();
1452 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1456 if (c == NULL || !(c->state & CLASS_LOADED)) {
1460 return (jobject)reflect_field_new(ref->p.field);
1464 /* JVM_ConstantPoolGetMemberRefInfoAt */
1466 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1468 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1470 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1476 /* JVM_ConstantPoolGetIntAt */
1478 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1480 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1481 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1483 TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
1485 cls = LLNI_classinfo_unwrap(jcpool);
1486 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1489 exceptions_throw_illegalargumentexception();
1497 /* JVM_ConstantPoolGetLongAt */
1499 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1501 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1502 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1504 TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
1506 cls = LLNI_classinfo_unwrap(jcpool);
1507 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1510 exceptions_throw_illegalargumentexception();
1518 /* JVM_ConstantPoolGetFloatAt */
1520 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1522 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1523 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1525 TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
1527 cls = LLNI_classinfo_unwrap(jcpool);
1528 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1531 exceptions_throw_illegalargumentexception();
1539 /* JVM_ConstantPoolGetDoubleAt */
1541 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1543 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1544 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1546 TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
1548 cls = LLNI_classinfo_unwrap(jcpool);
1549 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1552 exceptions_throw_illegalargumentexception();
1560 /* JVM_ConstantPoolGetStringAt */
1562 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1564 utf *ref; /* utf object for the string in constant pool at index 'index' */
1565 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1567 TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
1569 cls = LLNI_classinfo_unwrap(jcpool);
1570 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1573 exceptions_throw_illegalargumentexception();
1577 /* XXX: I hope literalstring_new is the right Function. */
1578 return (jstring)literalstring_new(ref);
1582 /* JVM_ConstantPoolGetUTF8At */
1584 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1586 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1587 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1589 TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
1591 cls = LLNI_classinfo_unwrap(jcpool);
1592 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1595 exceptions_throw_illegalargumentexception();
1599 /* XXX: I hope literalstring_new is the right Function. */
1600 return (jstring)literalstring_new(ref);
1604 /* JVM_DesiredAssertionStatus */
1606 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1608 TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
1610 /* TODO: Implement this one, but false should be OK. */
1616 /* JVM_AssertionStatusDirectives */
1618 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1621 java_lang_AssertionStatusDirectives *o;
1622 java_handle_objectarray_t *classes;
1623 java_handle_objectarray_t *packages;
1626 log_println("JVM_AssertionStatusDirectives");
1628 /* XXX this is not completely implemented */
1630 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1635 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1640 classes = builtin_anewarray(0, class_java_lang_Object);
1642 if (classes == NULL)
1645 packages = builtin_anewarray(0, class_java_lang_Object);
1647 if (packages == NULL)
1650 /* set instance fields */
1652 o->classes = classes;
1653 o->packages = packages;
1659 /* JVM_GetClassNameUTF */
1661 const char* JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1663 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1667 /* JVM_GetClassCPTypes */
1669 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1671 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1675 /* JVM_GetClassCPEntriesCount */
1677 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1679 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1683 /* JVM_GetClassFieldsCount */
1685 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1687 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1691 /* JVM_GetClassMethodsCount */
1693 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1695 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1699 /* JVM_GetMethodIxExceptionIndexes */
1701 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1703 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1707 /* JVM_GetMethodIxExceptionsCount */
1709 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1711 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1715 /* JVM_GetMethodIxByteCode */
1717 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1719 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1723 /* JVM_GetMethodIxByteCodeLength */
1725 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1727 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1731 /* JVM_GetMethodIxExceptionTableEntry */
1733 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1735 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1739 /* JVM_GetMethodIxExceptionTableLength */
1741 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1743 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1747 /* JVM_GetMethodIxModifiers */
1749 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1751 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1755 /* JVM_GetFieldIxModifiers */
1757 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1759 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1763 /* JVM_GetMethodIxLocalsCount */
1765 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1767 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1771 /* JVM_GetMethodIxArgsSize */
1773 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1775 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1779 /* JVM_GetMethodIxMaxStack */
1781 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1783 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1787 /* JVM_IsConstructorIx */
1789 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1791 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1795 /* JVM_GetMethodIxNameUTF */
1797 const char* JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1799 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1803 /* JVM_GetMethodIxSignatureUTF */
1805 const char* JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1807 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1811 /* JVM_GetCPFieldNameUTF */
1813 const char* JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1815 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1819 /* JVM_GetCPMethodNameUTF */
1821 const char* JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1823 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1827 /* JVM_GetCPMethodSignatureUTF */
1829 const char* JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1831 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1835 /* JVM_GetCPFieldSignatureUTF */
1837 const char* JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1839 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1843 /* JVM_GetCPClassNameUTF */
1845 const char* JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1847 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
1851 /* JVM_GetCPFieldClassNameUTF */
1853 const char* JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1855 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
1859 /* JVM_GetCPMethodClassNameUTF */
1861 const char* JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1863 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
1867 /* JVM_GetCPFieldModifiers */
1869 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1871 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
1875 /* JVM_GetCPMethodModifiers */
1877 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1879 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
1883 /* JVM_ReleaseUTF */
1885 void JVM_ReleaseUTF(const char *utf)
1887 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
1891 /* JVM_IsSameClassPackage */
1893 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
1895 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
1901 jint JVM_Open(const char *fname, jint flags, jint mode)
1906 log_println("JVM_Open: fname=%s, flags=%d, mode=%d", fname, flags, mode);
1909 result = open(fname, flags, mode);
1917 /* XXX don't know what to do here */
1918 /* return JVM_EEXIST; */
1929 jint JVM_Close(jint fd)
1932 log_println("JVM_Close: fd=%d", fd);
1940 jint JVM_Read(jint fd, char *buf, jint nbytes)
1943 log_println("JVM_Read: fd=%d, buf=%p, nbytes=%d", fd, buf, nbytes);
1945 return read(fd, buf, nbytes);
1951 jint JVM_Write(jint fd, char *buf, jint nbytes)
1954 log_println("JVM_Write: fd=%d, buf=%s, nbytes=%d", fd, buf, nbytes);
1956 return write(fd, buf, nbytes);
1962 jint JVM_Available(jint fd, jlong *pbytes)
1964 #if defined(FIONREAD)
1967 TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
1971 if (ioctl(fd, FIONREAD, &bytes) < 0)
1978 # error FIONREAD not defined
1985 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
1988 log_println("JVM_Lseek: fd=%d, offset=%ld, whence=%d", fd, offset, whence);
1990 return (jlong) lseek(fd, (off_t) offset, whence);
1996 jint JVM_SetLength(jint fd, jlong length)
1998 log_println("JVM_SetLength: IMPLEMENT ME!");
2004 jint JVM_Sync(jint fd)
2006 log_println("JVM_Sync: IMPLEMENT ME!");
2010 /* JVM_StartThread */
2012 void JVM_StartThread(JNIEnv* env, jobject jthread)
2015 log_println("JVM_StartThread: jthread=%p", jthread);
2017 _Jv_java_lang_Thread_start((java_lang_Thread *) jthread, 0);
2021 /* JVM_StopThread */
2023 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2025 log_println("JVM_StopThread: IMPLEMENT ME!");
2029 /* JVM_IsThreadAlive */
2031 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2036 TRACEJVMCALLS("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread);
2038 /* XXX this is just a quick hack */
2040 for (t = threads_list_first(); t != NULL; t = threads_list_next(t)) {
2041 if (t->object == jthread)
2045 /* The threadobject is null when a thread is created in Java. The
2046 priority is set later during startup. */
2051 result = threads_thread_is_alive(t);
2057 /* JVM_SuspendThread */
2059 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2061 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2065 /* JVM_ResumeThread */
2067 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2069 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2073 /* JVM_SetThreadPriority */
2075 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2078 log_println("JVM_SetThreadPriority: jthread=%p, prio=%d", jthread, prio);
2080 _Jv_java_lang_Thread_setPriority((java_lang_Thread *) jthread, prio);
2086 void JVM_Yield(JNIEnv *env, jclass threadClass)
2088 TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
2096 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2099 log_println("JVM_Sleep: threadClass=%p, millis=%ld", threadClass, millis);
2101 _Jv_java_lang_Thread_sleep(millis);
2105 /* JVM_CurrentThread */
2107 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2110 log_println("JVM_CurrentThread: threadClass=%p", threadClass);
2112 return (jobject) _Jv_java_lang_Thread_currentThread();
2116 /* JVM_CountStackFrames */
2118 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2120 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2126 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2128 log_println("JVM_Interrupt: IMPLEMENT ME!");
2132 /* JVM_IsInterrupted */
2134 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2137 log_println("JVM_IsInterrupted: jthread=%p, clear_interrupted=%d", jthread, clear_interrupted);
2139 /* XXX do something with clear_interrupted */
2140 return _Jv_java_lang_Thread_isInterrupted((java_lang_Thread *) jthread);
2146 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2148 log_println("JVM_HoldsLock: IMPLEMENT ME!");
2152 /* JVM_DumpAllStacks */
2154 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2156 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2160 /* JVM_CurrentLoadedClass */
2162 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2164 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2168 /* JVM_CurrentClassLoader */
2170 jobject JVM_CurrentClassLoader(JNIEnv *env)
2172 /* XXX if a method in a class in a trusted loader is in a
2173 doPrivileged, return NULL */
2175 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2179 /* JVM_GetClassContext */
2181 jobjectArray JVM_GetClassContext(JNIEnv *env)
2184 log_println("JVM_GetClassContext");
2186 return (jobjectArray) stacktrace_getClassContext();
2190 /* JVM_ClassDepth */
2192 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2194 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2198 /* JVM_ClassLoaderDepth */
2200 jint JVM_ClassLoaderDepth(JNIEnv *env)
2202 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2206 /* JVM_GetSystemPackage */
2208 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2210 log_println("JVM_GetSystemPackage(env=%p, name=%p)");
2211 javastring_print((java_handle_t *) name);
2218 /* JVM_GetSystemPackages */
2220 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2222 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2226 /* JVM_AllocateNewObject */
2228 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2230 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2234 /* JVM_AllocateNewArray */
2236 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2238 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2242 /* JVM_LatestUserDefinedLoader */
2244 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2246 log_println("JVM_LatestUserDefinedLoader: IMPLEMENT ME!");
2250 /* JVM_LoadClass0 */
2252 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2254 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2258 /* JVM_GetArrayLength */
2260 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2264 TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
2266 a = (java_handle_t *) arr;
2268 return array_length_get(a);
2272 /* JVM_GetArrayElement */
2274 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2279 TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
2281 a = (java_handle_t *) arr;
2283 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2284 /* exceptions_throw_illegalargumentexception(); */
2288 o = array_element_get(a, index);
2294 /* JVM_GetPrimitiveArrayElement */
2296 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2298 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2302 /* JVM_SetArrayElement */
2304 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2307 java_handle_t *value;
2309 TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
2311 a = (java_handle_t *) arr;
2312 value = (java_handle_t *) val;
2314 array_element_set(a, index, value);
2318 /* JVM_SetPrimitiveArrayElement */
2320 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2322 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2328 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2333 java_handle_objectarray_t *oa;
2335 TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
2337 if (eltClass == NULL) {
2338 exceptions_throw_nullpointerexception();
2342 /* NegativeArraySizeException is checked in builtin_newarray. */
2344 c = LLNI_classinfo_unwrap(eltClass);
2346 /* create primitive or object array */
2348 if (class_is_primitive(c)) {
2349 pc = primitive_arrayclass_get_by_name(c->name);
2350 a = builtin_newarray(length, pc);
2355 oa = builtin_anewarray(length, c);
2357 return (jobject) oa;
2362 /* JVM_NewMultiArray */
2364 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2367 java_handle_intarray_t *ia;
2373 java_handle_objectarray_t *a;
2375 TRACEJVMCALLS("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim);
2377 if (eltClass == NULL) {
2378 exceptions_throw_nullpointerexception();
2382 /* NegativeArraySizeException is checked in builtin_newarray. */
2384 c = LLNI_classinfo_unwrap(eltClass);
2386 /* XXX This is just a quick hack to get it working. */
2388 ia = (java_handle_intarray_t *) dim;
2390 length = array_length_get(ia);
2392 dims = MNEW(long, length);
2394 for (i = 0; i < length; i++) {
2395 value = LLNI_array_direct(ia, i);
2396 dims[i] = (long) value;
2399 /* Create an array-class if necessary. */
2401 if (class_is_primitive(c))
2402 ac = primitive_arrayclass_get_by_name(c->name);
2404 ac = class_array_of(c, true);
2409 a = builtin_multianewarray(length, ac, dims);
2415 /* JVM_InitializeSocketLibrary */
2417 jint JVM_InitializeSocketLibrary()
2419 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2425 jint JVM_Socket(jint domain, jint type, jint protocol)
2427 TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
2429 return socket(domain, type, protocol);
2433 /* JVM_SocketClose */
2435 jint JVM_SocketClose(jint fd)
2437 TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
2443 /* JVM_SocketShutdown */
2445 jint JVM_SocketShutdown(jint fd, jint howto)
2447 TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
2449 return shutdown(fd, howto);
2455 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2457 log_println("JVM_Recv: IMPLEMENT ME!");
2463 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2465 log_println("JVM_Send: IMPLEMENT ME!");
2471 jint JVM_Timeout(int fd, long timeout)
2473 log_println("JVM_Timeout: IMPLEMENT ME!");
2479 jint JVM_Listen(jint fd, jint count)
2481 TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
2483 return listen(fd, count);
2489 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2491 TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
2493 return connect(fd, him, len);
2499 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2501 log_println("JVM_Bind: IMPLEMENT ME!");
2507 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2509 TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
2511 return accept(fd, him, (socklen_t *) len);
2517 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2519 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2523 /* JVM_GetSockName */
2525 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2527 TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
2529 return getsockname(fd, him, (socklen_t *) len);
2535 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2537 log_println("JVM_SendTo: IMPLEMENT ME!");
2541 /* JVM_SocketAvailable */
2543 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2545 log_println("JVM_SocketAvailable: IMPLEMENT ME!");
2549 /* JVM_GetSockOpt */
2551 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2553 log_println("JVM_GetSockOpt: IMPLEMENT ME!");
2557 /* JVM_SetSockOpt */
2559 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2561 TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
2563 return setsockopt(fd, level, optname, optval, optlen);
2567 /* JVM_GetHostName */
2569 int JVM_GetHostName(char* name, int namelen)
2571 TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
2573 return gethostname(name, namelen);
2577 /* JVM_GetHostByAddr */
2579 struct hostent* JVM_GetHostByAddr(const char* name, int len, int type)
2581 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2585 /* JVM_GetHostByName */
2587 struct hostent* JVM_GetHostByName(char* name)
2589 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2593 /* JVM_GetProtoByName */
2595 struct protoent* JVM_GetProtoByName(char* name)
2597 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2601 /* JVM_LoadLibrary */
2603 void *JVM_LoadLibrary(const char *name)
2607 TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
2609 u = utf_new_char(name);
2611 return native_library_open(u);
2615 /* JVM_UnloadLibrary */
2617 void JVM_UnloadLibrary(void* handle)
2619 log_println("JVM_UnloadLibrary: IMPLEMENT ME!");
2623 /* JVM_FindLibraryEntry */
2625 void *JVM_FindLibraryEntry(void *handle, const char *name)
2629 TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
2631 symbol = lt_dlsym(handle, name);
2639 jboolean JVM_IsNaN(jdouble a)
2641 log_println("JVM_IsNaN: IMPLEMENT ME!");
2645 /* JVM_IsSupportedJNIVersion */
2647 jboolean JVM_IsSupportedJNIVersion(jint version)
2649 TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
2651 return jni_version_check(version);
2655 /* JVM_InternString */
2657 jstring JVM_InternString(JNIEnv *env, jstring str)
2659 TRACEJVMCALLS("JVM_InternString(env=%p, str=%p)", env, str);
2661 return (jstring) javastring_intern((java_handle_t *) str);
2665 /* JVM_RawMonitorCreate */
2667 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2672 log_println("JVM_RawMonitorCreate");
2675 o = NEW(java_object_t);
2677 lock_init_object_lock(o);
2683 /* JVM_RawMonitorDestroy */
2685 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
2688 log_println("JVM_RawMonitorDestroy: mon=%p", mon);
2690 FREE(mon, java_object_t);
2694 /* JVM_RawMonitorEnter */
2696 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
2699 log_println("JVM_RawMonitorEnter: mon=%p", mon);
2701 (void) lock_monitor_enter((java_object_t *) mon);
2707 /* JVM_RawMonitorExit */
2709 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
2712 log_println("JVM_RawMonitorExit: mon=%p", mon);
2714 (void) lock_monitor_exit((java_object_t *) mon);
2718 /* JVM_SetPrimitiveFieldValues */
2720 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2722 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
2726 /* JVM_GetPrimitiveFieldValues */
2728 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2730 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
2734 /* JVM_AccessVMBooleanFlag */
2736 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
2738 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
2742 /* JVM_AccessVMIntFlag */
2744 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
2746 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
2750 /* JVM_VMBreakPoint */
2752 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
2754 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
2758 /* JVM_GetClassFields */
2760 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
2762 log_println("JVM_GetClassFields: IMPLEMENT ME!");
2766 /* JVM_GetClassMethods */
2768 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
2770 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
2774 /* JVM_GetClassConstructors */
2776 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
2778 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
2782 /* JVM_GetClassField */
2784 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
2786 log_println("JVM_GetClassField: IMPLEMENT ME!");
2790 /* JVM_GetClassMethod */
2792 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
2794 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
2798 /* JVM_GetClassConstructor */
2800 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
2802 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
2806 /* JVM_NewInstance */
2808 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
2810 log_println("JVM_NewInstance: IMPLEMENT ME!");
2816 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
2818 log_println("JVM_GetField: IMPLEMENT ME!");
2822 /* JVM_GetPrimitiveField */
2824 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
2826 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
2832 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
2834 log_println("JVM_SetField: IMPLEMENT ME!");
2838 /* JVM_SetPrimitiveField */
2840 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
2842 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
2846 /* JVM_InvokeMethod */
2848 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
2851 log_println("JVM_InvokeMethod: method=%p, obj=%p, args0=%p", method, obj, args0);
2853 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
2857 /* JVM_NewInstanceFromConstructor */
2859 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
2862 log_println("JVM_NewInstanceFromConstructor: c=%p, args0=%p", c, args0);
2864 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
2868 /* JVM_SupportsCX8 */
2870 jboolean JVM_SupportsCX8()
2872 TRACEJVMCALLS("JVM_SupportsCX8()");
2882 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
2884 log_println("JVM_CX8Field: IMPLEMENT ME!");
2888 /* JVM_GetAllThreads */
2890 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
2892 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
2896 /* JVM_DumpThreads */
2898 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
2900 log_println("JVM_DumpThreads: IMPLEMENT ME!");
2904 /* JVM_GetManagement */
2906 void* JVM_GetManagement(jint version)
2908 log_println("JVM_GetManagement: IMPLEMENT ME!");
2912 /* JVM_InitAgentProperties */
2914 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
2916 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
2920 /* JVM_GetEnclosingMethodInfo */
2922 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
2924 log_println("JVM_GetEnclosingMethodInfo: IMPLEMENT ME!");
2928 /* JVM_GetThreadStateValues */
2930 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
2932 java_handle_intarray_t *ia;
2934 TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
2935 env, javaThreadState);
2937 /* If new thread states are added in future JDK and VM versions,
2938 this should check if the JDK version is compatible with thread
2939 states supported by the VM. Return NULL if not compatible.
2941 This function must map the VM java_lang_Thread::ThreadStatus
2942 to the Java thread state that the JDK supports. */
2944 switch (javaThreadState) {
2945 case THREAD_STATE_NEW:
2946 ia = builtin_newarray_int(1);
2951 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
2954 case THREAD_STATE_RUNNABLE:
2955 ia = builtin_newarray_int(1);
2960 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
2963 case THREAD_STATE_BLOCKED:
2964 ia = builtin_newarray_int(1);
2969 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
2972 case THREAD_STATE_WAITING:
2973 ia = builtin_newarray_int(2);
2978 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
2979 /* XXX Implement parked stuff. */
2980 /* array_intarray_element_set(ia, 1, PARKED); */
2983 case THREAD_STATE_TIMED_WAITING:
2984 ia = builtin_newarray_int(3);
2989 /* XXX Not sure about that one. */
2990 /* array_intarray_element_set(ia, 0, SLEEPING); */
2991 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
2992 /* XXX Implement parked stuff. */
2993 /* array_intarray_element_set(ia, 2, PARKED); */
2996 case THREAD_STATE_TERMINATED:
2997 ia = builtin_newarray_int(1);
3002 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3006 /* Unknown state - probably incompatible JDK version */
3010 return (jintArray) ia;
3014 /* JVM_GetThreadStateNames */
3016 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3018 java_handle_intarray_t *ia;
3019 java_handle_objectarray_t *oa;
3022 TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3023 env, javaThreadState, values);
3025 ia = (java_handle_intarray_t *) values;
3027 /* If new thread states are added in future JDK and VM versions,
3028 this should check if the JDK version is compatible with thread
3029 states supported by the VM. Return NULL if not compatible.
3031 This function must map the VM java_lang_Thread::ThreadStatus
3032 to the Java thread state that the JDK supports. */
3034 if (values == NULL) {
3035 exceptions_throw_nullpointerexception();
3039 switch (javaThreadState) {
3040 case THREAD_STATE_NEW:
3041 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3043 oa = builtin_anewarray(1, class_java_lang_String);
3048 s = javastring_new(utf_new_char("NEW"));
3053 array_objectarray_element_set(oa, 0, s);
3056 case THREAD_STATE_RUNNABLE:
3057 oa = builtin_anewarray(1, class_java_lang_String);
3062 s = javastring_new(utf_new_char("RUNNABLE"));
3067 array_objectarray_element_set(oa, 0, s);
3070 case THREAD_STATE_BLOCKED:
3071 oa = builtin_anewarray(1, class_java_lang_String);
3076 s = javastring_new(utf_new_char("BLOCKED"));
3081 array_objectarray_element_set(oa, 0, s);
3084 case THREAD_STATE_WAITING:
3085 oa = builtin_anewarray(2, class_java_lang_String);
3090 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3091 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3096 array_objectarray_element_set(oa, 0, s);
3097 /* array_objectarray_element_set(oa, 1, s); */
3100 case THREAD_STATE_TIMED_WAITING:
3101 oa = builtin_anewarray(3, class_java_lang_String);
3106 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3107 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3108 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3113 /* array_objectarray_element_set(oa, 0, s); */
3114 array_objectarray_element_set(oa, 0, s);
3115 /* array_objectarray_element_set(oa, 2, s); */
3118 case THREAD_STATE_TERMINATED:
3119 oa = builtin_anewarray(1, class_java_lang_String);
3124 s = javastring_new(utf_new_char("TERMINATED"));
3129 array_objectarray_element_set(oa, 0, s);
3133 /* Unknown state - probably incompatible JDK version */
3137 return (jobjectArray) oa;
3141 /* JVM_GetVersionInfo */
3143 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3145 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3149 /* OS: JVM_RegisterSignal */
3151 void *JVM_RegisterSignal(jint sig, void *handler)
3153 functionptr newHandler;
3155 TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
3157 if (handler == (void *) 2)
3158 newHandler = (functionptr) signal_thread_handler;
3160 newHandler = (functionptr) (uintptr_t) handler;
3167 /* These signals are already used by the VM. */
3171 /* This signal is used by the VM to dump thread stacks unless
3172 ReduceSignalUsage is set, in which case the user is allowed
3173 to set his own _native_ handler for this signal; thus, in
3174 either case, we do not allow JVM_RegisterSignal to change
3184 signal_register_signal(sig, newHandler, 0);
3186 /* XXX Should return old handler. */
3192 /* OS: JVM_RaiseSignal */
3194 jboolean JVM_RaiseSignal(jint sig)
3196 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3201 /* OS: JVM_FindSignal */
3203 jint JVM_FindSignal(const char *name)
3205 TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
3207 #if defined(__LINUX__)
3208 if (strcmp(name, "HUP") == 0)
3211 if (strcmp(name, "INT") == 0)
3214 if (strcmp(name, "TERM") == 0)
3217 # error not implemented for this OS
3225 * These are local overrides for various environment variables in Emacs.
3226 * Please do not remove this and leave it at the end of the file, where
3227 * Emacs will automagically detect them.
3228 * ---------------------------------------------------------------------
3231 * indent-tabs-mode: t