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/package.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 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 TRACEJVMCALLS("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls);
976 /* XXX All stuff I tested so far works without that function. At
977 some point we have to implement it, but I disable the output
978 for now to make IcedTea happy. */
984 /* JVM_IsArrayClass */
986 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
989 log_println("JVM_IsArrayClass: cls=%p", cls);
991 return class_is_array(LLNI_classinfo_unwrap(cls));
995 /* JVM_IsPrimitiveClass */
997 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1001 c = LLNI_classinfo_unwrap(cls);
1004 log_println("JVM_IsPrimitiveClass(cls=%p)", cls);
1007 return class_is_primitive(c);
1011 /* JVM_GetComponentType */
1013 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1015 classinfo *component;
1018 TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
1020 c = LLNI_classinfo_unwrap(cls);
1022 component = class_get_componenttype(c);
1024 return (jclass) LLNI_classinfo_wrap(component);
1028 /* JVM_GetClassModifiers */
1030 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1035 TRACEJVMCALLS("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls);
1037 c = LLNI_classinfo_unwrap(cls);
1039 flags = class_get_modifiers(c, false);
1045 /* JVM_GetDeclaredClasses */
1047 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1050 java_handle_objectarray_t *oa;
1052 TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
1054 c = LLNI_classinfo_unwrap(ofClass);
1056 oa = class_get_declaredclasses(c, false);
1058 return (jobjectArray) oa;
1062 /* JVM_GetDeclaringClass */
1064 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1069 TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
1071 c = LLNI_classinfo_unwrap(ofClass);
1073 dc = class_get_declaringclass(c);
1075 return (jclass) LLNI_classinfo_wrap(dc);
1079 /* JVM_GetClassSignature */
1081 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1087 TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
1089 c = LLNI_classinfo_unwrap(cls);
1091 /* Get the signature of the class. */
1093 u = class_get_signature(c);
1098 /* Convert UTF-string to a Java-string. */
1100 s = javastring_new(u);
1106 /* JVM_GetClassAnnotations */
1108 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1110 classinfo *c = NULL; /* classinfo for 'cls' */
1111 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1113 TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
1116 exceptions_throw_nullpointerexception();
1120 c = LLNI_classinfo_unwrap(cls);
1122 /* get annotations: */
1123 annotations = class_get_annotations(c);
1125 return (jbyteArray)annotations;
1129 /* JVM_GetFieldAnnotations */
1131 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1133 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1134 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1136 TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
1138 if (field == NULL) {
1139 exceptions_throw_nullpointerexception();
1143 rf = (java_lang_reflect_Field*)field;
1145 LLNI_field_get_ref(rf, annotations, ba);
1147 return (jbyteArray)ba;
1151 /* JVM_GetMethodAnnotations */
1153 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1155 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1156 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1158 TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
1160 if (method == NULL) {
1161 exceptions_throw_nullpointerexception();
1165 rm = (java_lang_reflect_Method*)method;
1167 LLNI_field_get_ref(rm, annotations, ba);
1169 return (jbyteArray)ba;
1173 /* JVM_GetMethodDefaultAnnotationValue */
1175 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1177 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1178 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1180 TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
1182 if (method == NULL) {
1183 exceptions_throw_nullpointerexception();
1187 rm = (java_lang_reflect_Method*)method;
1189 LLNI_field_get_ref(rm, annotationDefault, ba);
1191 return (jbyteArray)ba;
1195 /* JVM_GetMethodParameterAnnotations */
1197 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1199 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1200 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1202 TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
1204 if (method == NULL) {
1205 exceptions_throw_nullpointerexception();
1209 rm = (java_lang_reflect_Method*)method;
1211 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1213 return (jbyteArray)ba;
1217 /* JVM_GetClassDeclaredFields */
1219 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1222 log_println("JVM_GetClassDeclaredFields: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1224 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1228 /* JVM_GetClassDeclaredMethods */
1230 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1233 log_println("JVM_GetClassDeclaredMethods: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1235 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1239 /* JVM_GetClassDeclaredConstructors */
1241 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1244 log_println("JVM_GetClassDeclaredConstructors: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1246 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1250 /* JVM_GetClassAccessFlags */
1252 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1256 TRACEJVMCALLS("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls);
1258 c = LLNI_classinfo_unwrap(cls);
1260 /* Primitive type classes have the correct access flags. */
1262 return c->flags & ACC_CLASS_REFLECT_MASK;
1266 /* JVM_GetClassConstantPool */
1268 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1270 #if defined(ENABLE_ANNOTATIONS)
1271 sun_reflect_ConstantPool *constantPool = NULL;
1272 /* constant pool object for the class refered by 'cls' */
1273 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1274 /* constantPoolOop field of the constant pool object */
1276 TRACEJVMCALLS("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls);
1279 (sun_reflect_ConstantPool*)native_new_and_init(
1280 class_sun_reflect_ConstantPool);
1282 if (constantPool == NULL) {
1287 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1289 return (jobject)constantPool;
1291 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1297 /* JVM_ConstantPoolGetSize */
1299 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1301 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1303 TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
1305 c = LLNI_classinfo_unwrap(jcpool);
1311 /* JVM_ConstantPoolGetClassAt */
1313 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1315 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1316 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1317 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1319 TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
1321 c = LLNI_classinfo_unwrap(jcpool);
1323 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1326 exceptions_throw_illegalargumentexception();
1330 result = resolve_classref_eager(ref);
1332 return (jclass) LLNI_classinfo_wrap(result);
1336 /* JVM_ConstantPoolGetClassAtIfLoaded */
1338 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1340 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1341 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1342 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1344 TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
1346 c = LLNI_classinfo_unwrap(jcpool);
1348 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1351 exceptions_throw_illegalargumentexception();
1355 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1359 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1363 return (jclass) LLNI_classinfo_wrap(result);
1367 /* JVM_ConstantPoolGetMethodAt */
1369 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1371 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1372 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1374 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
1376 cls = LLNI_classinfo_unwrap(jcpool);
1377 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1380 exceptions_throw_illegalargumentexception();
1384 /* XXX: is that right? or do I have to use resolve_method_*? */
1385 return (jobject)reflect_method_new(ref->p.method);
1389 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1391 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1393 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1394 classinfo *c = NULL; /* resolved declaring class of the method */
1395 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1397 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1399 cls = LLNI_classinfo_unwrap(jcpool);
1400 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1403 exceptions_throw_illegalargumentexception();
1407 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1411 if (c == NULL || !(c->state & CLASS_LOADED)) {
1415 return (jobject)reflect_method_new(ref->p.method);
1419 /* JVM_ConstantPoolGetFieldAt */
1421 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1423 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1424 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1426 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
1428 cls = LLNI_classinfo_unwrap(jcpool);
1429 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1432 exceptions_throw_illegalargumentexception();
1436 return (jobject)reflect_field_new(ref->p.field);
1440 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1442 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1444 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1445 classinfo *c; /* resolved declaring class for the field */
1446 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1448 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1450 cls = LLNI_classinfo_unwrap(jcpool);
1451 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1454 exceptions_throw_illegalargumentexception();
1458 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1462 if (c == NULL || !(c->state & CLASS_LOADED)) {
1466 return (jobject)reflect_field_new(ref->p.field);
1470 /* JVM_ConstantPoolGetMemberRefInfoAt */
1472 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1474 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1476 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1482 /* JVM_ConstantPoolGetIntAt */
1484 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1486 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1487 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1489 TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
1491 cls = LLNI_classinfo_unwrap(jcpool);
1492 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1495 exceptions_throw_illegalargumentexception();
1503 /* JVM_ConstantPoolGetLongAt */
1505 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1507 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1508 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1510 TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
1512 cls = LLNI_classinfo_unwrap(jcpool);
1513 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1516 exceptions_throw_illegalargumentexception();
1524 /* JVM_ConstantPoolGetFloatAt */
1526 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1528 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1529 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1531 TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
1533 cls = LLNI_classinfo_unwrap(jcpool);
1534 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1537 exceptions_throw_illegalargumentexception();
1545 /* JVM_ConstantPoolGetDoubleAt */
1547 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1549 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1550 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1552 TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
1554 cls = LLNI_classinfo_unwrap(jcpool);
1555 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1558 exceptions_throw_illegalargumentexception();
1566 /* JVM_ConstantPoolGetStringAt */
1568 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1570 utf *ref; /* utf object for the string in constant pool at index 'index' */
1571 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1573 TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
1575 cls = LLNI_classinfo_unwrap(jcpool);
1576 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1579 exceptions_throw_illegalargumentexception();
1583 /* XXX: I hope literalstring_new is the right Function. */
1584 return (jstring)literalstring_new(ref);
1588 /* JVM_ConstantPoolGetUTF8At */
1590 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1592 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1593 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1595 TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
1597 cls = LLNI_classinfo_unwrap(jcpool);
1598 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1601 exceptions_throw_illegalargumentexception();
1605 /* XXX: I hope literalstring_new is the right Function. */
1606 return (jstring)literalstring_new(ref);
1610 /* JVM_DesiredAssertionStatus */
1612 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1614 TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
1616 /* TODO: Implement this one, but false should be OK. */
1622 /* JVM_AssertionStatusDirectives */
1624 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1627 java_lang_AssertionStatusDirectives *o;
1628 java_handle_objectarray_t *classes;
1629 java_handle_objectarray_t *packages;
1631 TRACEJVMCALLS("JVM_AssertionStatusDirectives(env=%p, unused=%p): COMPLETE ME!", env, unused);
1633 /* XXX this is not completely implemented */
1635 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1640 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1645 classes = builtin_anewarray(0, class_java_lang_Object);
1647 if (classes == NULL)
1650 packages = builtin_anewarray(0, class_java_lang_Object);
1652 if (packages == NULL)
1655 /* set instance fields */
1657 o->classes = classes;
1658 o->packages = packages;
1664 /* JVM_GetClassNameUTF */
1666 const char* JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1668 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1672 /* JVM_GetClassCPTypes */
1674 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1676 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1680 /* JVM_GetClassCPEntriesCount */
1682 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1684 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1688 /* JVM_GetClassFieldsCount */
1690 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1692 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1696 /* JVM_GetClassMethodsCount */
1698 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1700 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1704 /* JVM_GetMethodIxExceptionIndexes */
1706 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1708 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1712 /* JVM_GetMethodIxExceptionsCount */
1714 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1716 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1720 /* JVM_GetMethodIxByteCode */
1722 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1724 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1728 /* JVM_GetMethodIxByteCodeLength */
1730 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1732 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1736 /* JVM_GetMethodIxExceptionTableEntry */
1738 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1740 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1744 /* JVM_GetMethodIxExceptionTableLength */
1746 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1748 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1752 /* JVM_GetMethodIxModifiers */
1754 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1756 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1760 /* JVM_GetFieldIxModifiers */
1762 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1764 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1768 /* JVM_GetMethodIxLocalsCount */
1770 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1772 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1776 /* JVM_GetMethodIxArgsSize */
1778 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1780 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1784 /* JVM_GetMethodIxMaxStack */
1786 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1788 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1792 /* JVM_IsConstructorIx */
1794 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1796 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1800 /* JVM_GetMethodIxNameUTF */
1802 const char* JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1804 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1808 /* JVM_GetMethodIxSignatureUTF */
1810 const char* JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1812 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1816 /* JVM_GetCPFieldNameUTF */
1818 const char* JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1820 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1824 /* JVM_GetCPMethodNameUTF */
1826 const char* JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1828 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1832 /* JVM_GetCPMethodSignatureUTF */
1834 const char* JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1836 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1840 /* JVM_GetCPFieldSignatureUTF */
1842 const char* JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1844 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1848 /* JVM_GetCPClassNameUTF */
1850 const char* JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1852 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
1856 /* JVM_GetCPFieldClassNameUTF */
1858 const char* JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1860 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
1864 /* JVM_GetCPMethodClassNameUTF */
1866 const char* JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1868 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
1872 /* JVM_GetCPFieldModifiers */
1874 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1876 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
1880 /* JVM_GetCPMethodModifiers */
1882 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1884 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
1888 /* JVM_ReleaseUTF */
1890 void JVM_ReleaseUTF(const char *utf)
1892 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
1896 /* JVM_IsSameClassPackage */
1898 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
1900 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
1906 jint JVM_Open(const char *fname, jint flags, jint mode)
1911 log_println("JVM_Open: fname=%s, flags=%d, mode=%d", fname, flags, mode);
1914 result = open(fname, flags, mode);
1922 /* XXX don't know what to do here */
1923 /* return JVM_EEXIST; */
1934 jint JVM_Close(jint fd)
1937 log_println("JVM_Close: fd=%d", fd);
1945 jint JVM_Read(jint fd, char *buf, jint nbytes)
1948 log_println("JVM_Read: fd=%d, buf=%p, nbytes=%d", fd, buf, nbytes);
1950 return read(fd, buf, nbytes);
1956 jint JVM_Write(jint fd, char *buf, jint nbytes)
1959 log_println("JVM_Write: fd=%d, buf=%s, nbytes=%d", fd, buf, nbytes);
1961 return write(fd, buf, nbytes);
1967 jint JVM_Available(jint fd, jlong *pbytes)
1969 #if defined(FIONREAD)
1972 TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
1976 if (ioctl(fd, FIONREAD, &bytes) < 0)
1983 # error FIONREAD not defined
1990 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
1993 log_println("JVM_Lseek: fd=%d, offset=%ld, whence=%d", fd, offset, whence);
1995 return (jlong) lseek(fd, (off_t) offset, whence);
2001 jint JVM_SetLength(jint fd, jlong length)
2003 log_println("JVM_SetLength: IMPLEMENT ME!");
2009 jint JVM_Sync(jint fd)
2011 TRACEJVMCALLS("JVM_Sync(fd=%d)", fd);
2017 /* JVM_StartThread */
2019 void JVM_StartThread(JNIEnv* env, jobject jthread)
2022 log_println("JVM_StartThread: jthread=%p", jthread);
2024 _Jv_java_lang_Thread_start((java_lang_Thread *) jthread, 0);
2028 /* JVM_StopThread */
2030 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2032 log_println("JVM_StopThread: IMPLEMENT ME!");
2036 /* JVM_IsThreadAlive */
2038 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2044 TRACEJVMCALLS("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread);
2046 /* XXX this is just a quick hack */
2048 for (t = threads_list_first(); t != NULL; t = threads_list_next(t)) {
2049 LLNI_equals(t->object, jthread, equal);
2055 /* The threadobject is null when a thread is created in Java. The
2056 priority is set later during startup. */
2061 result = threads_thread_is_alive(t);
2067 /* JVM_SuspendThread */
2069 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2071 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2075 /* JVM_ResumeThread */
2077 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2079 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2083 /* JVM_SetThreadPriority */
2085 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2088 log_println("JVM_SetThreadPriority: jthread=%p, prio=%d", jthread, prio);
2090 _Jv_java_lang_Thread_setPriority((java_lang_Thread *) jthread, prio);
2096 void JVM_Yield(JNIEnv *env, jclass threadClass)
2098 TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
2106 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2109 log_println("JVM_Sleep: threadClass=%p, millis=%ld", threadClass, millis);
2111 _Jv_java_lang_Thread_sleep(millis);
2115 /* JVM_CurrentThread */
2117 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2120 log_println("JVM_CurrentThread: threadClass=%p", threadClass);
2122 return (jobject) _Jv_java_lang_Thread_currentThread();
2126 /* JVM_CountStackFrames */
2128 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2130 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2136 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2138 log_println("JVM_Interrupt: IMPLEMENT ME!");
2142 /* JVM_IsInterrupted */
2144 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2147 log_println("JVM_IsInterrupted: jthread=%p, clear_interrupted=%d", jthread, clear_interrupted);
2149 /* XXX do something with clear_interrupted */
2150 return _Jv_java_lang_Thread_isInterrupted((java_lang_Thread *) jthread);
2156 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2158 log_println("JVM_HoldsLock: IMPLEMENT ME!");
2162 /* JVM_DumpAllStacks */
2164 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2166 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2170 /* JVM_CurrentLoadedClass */
2172 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2174 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2178 /* JVM_CurrentClassLoader */
2180 jobject JVM_CurrentClassLoader(JNIEnv *env)
2182 /* XXX if a method in a class in a trusted loader is in a
2183 doPrivileged, return NULL */
2185 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2189 /* JVM_GetClassContext */
2191 jobjectArray JVM_GetClassContext(JNIEnv *env)
2194 log_println("JVM_GetClassContext");
2196 return (jobjectArray) stacktrace_getClassContext();
2200 /* JVM_ClassDepth */
2202 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2204 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2208 /* JVM_ClassLoaderDepth */
2210 jint JVM_ClassLoaderDepth(JNIEnv *env)
2212 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2216 /* JVM_GetSystemPackage */
2218 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2224 TRACEJVMCALLS("JVM_GetSystemPackage(env=%p, name=%p)", env, name);
2226 /* s = package_find(name); */
2227 u = javastring_toutf(name, false);
2228 result = package_find(u);
2230 s = javastring_new(result);
2238 /* JVM_GetSystemPackages */
2240 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2242 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2246 /* JVM_AllocateNewObject */
2248 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2250 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2254 /* JVM_AllocateNewArray */
2256 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2258 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2262 /* JVM_LatestUserDefinedLoader */
2264 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2266 log_println("JVM_LatestUserDefinedLoader: IMPLEMENT ME!");
2270 /* JVM_LoadClass0 */
2272 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2274 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2278 /* JVM_GetArrayLength */
2280 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2284 TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
2286 a = (java_handle_t *) arr;
2288 return array_length_get(a);
2292 /* JVM_GetArrayElement */
2294 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2299 TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
2301 a = (java_handle_t *) arr;
2303 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2304 /* exceptions_throw_illegalargumentexception(); */
2308 o = array_element_get(a, index);
2314 /* JVM_GetPrimitiveArrayElement */
2316 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2318 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2322 /* JVM_SetArrayElement */
2324 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2327 java_handle_t *value;
2329 TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
2331 a = (java_handle_t *) arr;
2332 value = (java_handle_t *) val;
2334 array_element_set(a, index, value);
2338 /* JVM_SetPrimitiveArrayElement */
2340 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2342 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2348 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2353 java_handle_objectarray_t *oa;
2355 TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
2357 if (eltClass == NULL) {
2358 exceptions_throw_nullpointerexception();
2362 /* NegativeArraySizeException is checked in builtin_newarray. */
2364 c = LLNI_classinfo_unwrap(eltClass);
2366 /* create primitive or object array */
2368 if (class_is_primitive(c)) {
2369 pc = primitive_arrayclass_get_by_name(c->name);
2370 a = builtin_newarray(length, pc);
2375 oa = builtin_anewarray(length, c);
2377 return (jobject) oa;
2382 /* JVM_NewMultiArray */
2384 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2387 java_handle_intarray_t *ia;
2393 java_handle_objectarray_t *a;
2395 TRACEJVMCALLS("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim);
2397 if (eltClass == NULL) {
2398 exceptions_throw_nullpointerexception();
2402 /* NegativeArraySizeException is checked in builtin_newarray. */
2404 c = LLNI_classinfo_unwrap(eltClass);
2406 /* XXX This is just a quick hack to get it working. */
2408 ia = (java_handle_intarray_t *) dim;
2410 length = array_length_get(ia);
2412 dims = MNEW(long, length);
2414 for (i = 0; i < length; i++) {
2415 value = LLNI_array_direct(ia, i);
2416 dims[i] = (long) value;
2419 /* Create an array-class if necessary. */
2421 if (class_is_primitive(c))
2422 ac = primitive_arrayclass_get_by_name(c->name);
2424 ac = class_array_of(c, true);
2429 a = builtin_multianewarray(length, ac, dims);
2435 /* JVM_InitializeSocketLibrary */
2437 jint JVM_InitializeSocketLibrary()
2439 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2445 jint JVM_Socket(jint domain, jint type, jint protocol)
2447 TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
2449 return socket(domain, type, protocol);
2453 /* JVM_SocketClose */
2455 jint JVM_SocketClose(jint fd)
2457 TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
2463 /* JVM_SocketShutdown */
2465 jint JVM_SocketShutdown(jint fd, jint howto)
2467 TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
2469 return shutdown(fd, howto);
2475 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2477 log_println("JVM_Recv: IMPLEMENT ME!");
2483 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2485 log_println("JVM_Send: IMPLEMENT ME!");
2491 jint JVM_Timeout(int fd, long timeout)
2493 log_println("JVM_Timeout: IMPLEMENT ME!");
2499 jint JVM_Listen(jint fd, jint count)
2501 TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
2503 return listen(fd, count);
2509 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2511 TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
2513 return connect(fd, him, len);
2519 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2521 log_println("JVM_Bind: IMPLEMENT ME!");
2527 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2529 TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
2531 return accept(fd, him, (socklen_t *) len);
2537 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2539 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2543 /* JVM_GetSockName */
2545 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2547 TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
2549 return getsockname(fd, him, (socklen_t *) len);
2555 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2557 log_println("JVM_SendTo: IMPLEMENT ME!");
2561 /* JVM_SocketAvailable */
2563 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2565 log_println("JVM_SocketAvailable: IMPLEMENT ME!");
2569 /* JVM_GetSockOpt */
2571 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2573 log_println("JVM_GetSockOpt: IMPLEMENT ME!");
2577 /* JVM_SetSockOpt */
2579 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2581 TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
2583 return setsockopt(fd, level, optname, optval, optlen);
2587 /* JVM_GetHostName */
2589 int JVM_GetHostName(char* name, int namelen)
2591 TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
2593 return gethostname(name, namelen);
2597 /* JVM_GetHostByAddr */
2599 struct hostent* JVM_GetHostByAddr(const char* name, int len, int type)
2601 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2605 /* JVM_GetHostByName */
2607 struct hostent* JVM_GetHostByName(char* name)
2609 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2613 /* JVM_GetProtoByName */
2615 struct protoent* JVM_GetProtoByName(char* name)
2617 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2621 /* JVM_LoadLibrary */
2623 void *JVM_LoadLibrary(const char *name)
2627 TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
2629 u = utf_new_char(name);
2631 return native_library_open(u);
2635 /* JVM_UnloadLibrary */
2637 void JVM_UnloadLibrary(void* handle)
2639 log_println("JVM_UnloadLibrary: IMPLEMENT ME!");
2643 /* JVM_FindLibraryEntry */
2645 void *JVM_FindLibraryEntry(void *handle, const char *name)
2649 TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
2651 symbol = lt_dlsym(handle, name);
2659 jboolean JVM_IsNaN(jdouble a)
2661 log_println("JVM_IsNaN: IMPLEMENT ME!");
2665 /* JVM_IsSupportedJNIVersion */
2667 jboolean JVM_IsSupportedJNIVersion(jint version)
2669 TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
2671 return jni_version_check(version);
2675 /* JVM_InternString */
2677 jstring JVM_InternString(JNIEnv *env, jstring str)
2679 TRACEJVMCALLS("JVM_InternString(env=%p, str=%p)", env, str);
2681 return (jstring) javastring_intern((java_handle_t *) str);
2685 /* JVM_RawMonitorCreate */
2687 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2692 log_println("JVM_RawMonitorCreate");
2695 o = NEW(java_object_t);
2697 lock_init_object_lock(o);
2703 /* JVM_RawMonitorDestroy */
2705 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
2708 log_println("JVM_RawMonitorDestroy: mon=%p", mon);
2710 FREE(mon, java_object_t);
2714 /* JVM_RawMonitorEnter */
2716 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
2719 log_println("JVM_RawMonitorEnter: mon=%p", mon);
2721 (void) lock_monitor_enter((java_object_t *) mon);
2727 /* JVM_RawMonitorExit */
2729 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
2732 log_println("JVM_RawMonitorExit: mon=%p", mon);
2734 (void) lock_monitor_exit((java_object_t *) mon);
2738 /* JVM_SetPrimitiveFieldValues */
2740 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2742 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
2746 /* JVM_GetPrimitiveFieldValues */
2748 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2750 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
2754 /* JVM_AccessVMBooleanFlag */
2756 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
2758 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
2762 /* JVM_AccessVMIntFlag */
2764 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
2766 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
2770 /* JVM_VMBreakPoint */
2772 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
2774 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
2778 /* JVM_GetClassFields */
2780 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
2782 log_println("JVM_GetClassFields: IMPLEMENT ME!");
2786 /* JVM_GetClassMethods */
2788 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
2790 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
2794 /* JVM_GetClassConstructors */
2796 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
2798 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
2802 /* JVM_GetClassField */
2804 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
2806 log_println("JVM_GetClassField: IMPLEMENT ME!");
2810 /* JVM_GetClassMethod */
2812 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
2814 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
2818 /* JVM_GetClassConstructor */
2820 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
2822 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
2826 /* JVM_NewInstance */
2828 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
2830 log_println("JVM_NewInstance: IMPLEMENT ME!");
2836 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
2838 log_println("JVM_GetField: IMPLEMENT ME!");
2842 /* JVM_GetPrimitiveField */
2844 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
2846 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
2852 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
2854 log_println("JVM_SetField: IMPLEMENT ME!");
2858 /* JVM_SetPrimitiveField */
2860 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
2862 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
2866 /* JVM_InvokeMethod */
2868 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
2871 log_println("JVM_InvokeMethod: method=%p, obj=%p, args0=%p", method, obj, args0);
2873 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
2877 /* JVM_NewInstanceFromConstructor */
2879 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
2882 log_println("JVM_NewInstanceFromConstructor: c=%p, args0=%p", c, args0);
2884 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
2888 /* JVM_SupportsCX8 */
2890 jboolean JVM_SupportsCX8()
2892 TRACEJVMCALLS("JVM_SupportsCX8()");
2902 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
2904 log_println("JVM_CX8Field: IMPLEMENT ME!");
2908 /* JVM_GetAllThreads */
2910 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
2912 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
2916 /* JVM_DumpThreads */
2918 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
2920 log_println("JVM_DumpThreads: IMPLEMENT ME!");
2924 /* JVM_GetManagement */
2926 void* JVM_GetManagement(jint version)
2928 log_println("JVM_GetManagement: IMPLEMENT ME!");
2932 /* JVM_InitAgentProperties */
2934 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
2936 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
2940 /* JVM_GetEnclosingMethodInfo */
2942 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
2944 log_println("JVM_GetEnclosingMethodInfo: IMPLEMENT ME!");
2948 /* JVM_GetThreadStateValues */
2950 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
2952 java_handle_intarray_t *ia;
2954 TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
2955 env, javaThreadState);
2957 /* If new thread states are added in future JDK and VM versions,
2958 this should check if the JDK version is compatible with thread
2959 states supported by the VM. Return NULL if not compatible.
2961 This function must map the VM java_lang_Thread::ThreadStatus
2962 to the Java thread state that the JDK supports. */
2964 switch (javaThreadState) {
2965 case THREAD_STATE_NEW:
2966 ia = builtin_newarray_int(1);
2971 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
2974 case THREAD_STATE_RUNNABLE:
2975 ia = builtin_newarray_int(1);
2980 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
2983 case THREAD_STATE_BLOCKED:
2984 ia = builtin_newarray_int(1);
2989 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
2992 case THREAD_STATE_WAITING:
2993 ia = builtin_newarray_int(2);
2998 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
2999 /* XXX Implement parked stuff. */
3000 /* array_intarray_element_set(ia, 1, PARKED); */
3003 case THREAD_STATE_TIMED_WAITING:
3004 ia = builtin_newarray_int(3);
3009 /* XXX Not sure about that one. */
3010 /* array_intarray_element_set(ia, 0, SLEEPING); */
3011 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3012 /* XXX Implement parked stuff. */
3013 /* array_intarray_element_set(ia, 2, PARKED); */
3016 case THREAD_STATE_TERMINATED:
3017 ia = builtin_newarray_int(1);
3022 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3026 /* Unknown state - probably incompatible JDK version */
3030 return (jintArray) ia;
3034 /* JVM_GetThreadStateNames */
3036 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3038 java_handle_intarray_t *ia;
3039 java_handle_objectarray_t *oa;
3042 TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3043 env, javaThreadState, values);
3045 ia = (java_handle_intarray_t *) values;
3047 /* If new thread states are added in future JDK and VM versions,
3048 this should check if the JDK version is compatible with thread
3049 states supported by the VM. Return NULL if not compatible.
3051 This function must map the VM java_lang_Thread::ThreadStatus
3052 to the Java thread state that the JDK supports. */
3054 if (values == NULL) {
3055 exceptions_throw_nullpointerexception();
3059 switch (javaThreadState) {
3060 case THREAD_STATE_NEW:
3061 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3063 oa = builtin_anewarray(1, class_java_lang_String);
3068 s = javastring_new(utf_new_char("NEW"));
3073 array_objectarray_element_set(oa, 0, s);
3076 case THREAD_STATE_RUNNABLE:
3077 oa = builtin_anewarray(1, class_java_lang_String);
3082 s = javastring_new(utf_new_char("RUNNABLE"));
3087 array_objectarray_element_set(oa, 0, s);
3090 case THREAD_STATE_BLOCKED:
3091 oa = builtin_anewarray(1, class_java_lang_String);
3096 s = javastring_new(utf_new_char("BLOCKED"));
3101 array_objectarray_element_set(oa, 0, s);
3104 case THREAD_STATE_WAITING:
3105 oa = builtin_anewarray(2, class_java_lang_String);
3110 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3111 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3116 array_objectarray_element_set(oa, 0, s);
3117 /* array_objectarray_element_set(oa, 1, s); */
3120 case THREAD_STATE_TIMED_WAITING:
3121 oa = builtin_anewarray(3, class_java_lang_String);
3126 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3127 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3128 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3133 /* array_objectarray_element_set(oa, 0, s); */
3134 array_objectarray_element_set(oa, 0, s);
3135 /* array_objectarray_element_set(oa, 2, s); */
3138 case THREAD_STATE_TERMINATED:
3139 oa = builtin_anewarray(1, class_java_lang_String);
3144 s = javastring_new(utf_new_char("TERMINATED"));
3149 array_objectarray_element_set(oa, 0, s);
3153 /* Unknown state - probably incompatible JDK version */
3157 return (jobjectArray) oa;
3161 /* JVM_GetVersionInfo */
3163 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3165 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3169 /* OS: JVM_RegisterSignal */
3171 void *JVM_RegisterSignal(jint sig, void *handler)
3173 functionptr newHandler;
3175 TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
3177 if (handler == (void *) 2)
3178 newHandler = (functionptr) signal_thread_handler;
3180 newHandler = (functionptr) (uintptr_t) handler;
3187 /* These signals are already used by the VM. */
3191 /* This signal is used by the VM to dump thread stacks unless
3192 ReduceSignalUsage is set, in which case the user is allowed
3193 to set his own _native_ handler for this signal; thus, in
3194 either case, we do not allow JVM_RegisterSignal to change
3204 signal_register_signal(sig, newHandler, 0);
3206 /* XXX Should return old handler. */
3212 /* OS: JVM_RaiseSignal */
3214 jboolean JVM_RaiseSignal(jint sig)
3216 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3221 /* OS: JVM_FindSignal */
3223 jint JVM_FindSignal(const char *name)
3225 TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
3227 #if defined(__LINUX__)
3228 if (strcmp(name, "HUP") == 0)
3231 if (strcmp(name, "INT") == 0)
3234 if (strcmp(name, "TERM") == 0)
3237 # error not implemented for this OS
3245 * These are local overrides for various environment variables in Emacs.
3246 * Please do not remove this and leave it at the end of the file, where
3247 * Emacs will automagically detect them.
3248 * ---------------------------------------------------------------------
3251 * indent-tabs-mode: t