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
41 #if defined(HAVE_SYS_IOCTL_H)
42 #define BSD_COMP /* Get FIONREAD on Solaris2 */
43 #include <sys/ioctl.h>
46 #include <sys/socket.h>
48 #include <sys/types.h>
52 #include "mm/memory.h"
54 #include "native/jni.h"
55 #include "native/llni.h"
56 #include "native/native.h"
58 #include "native/include/java_lang_AssertionStatusDirectives.h"
59 #include "native/include/java_lang_String.h" /* required by j.l.CL */
60 #include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
61 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
62 #include "native/include/java_lang_StackTraceElement.h"
63 #include "native/include/java_lang_Throwable.h"
64 #include "native/include/java_security_ProtectionDomain.h"
65 #include "native/include/java_lang_Integer.h"
66 #include "native/include/java_lang_Long.h"
67 #include "native/include/java_lang_Short.h"
68 #include "native/include/java_lang_Byte.h"
69 #include "native/include/java_lang_Character.h"
70 #include "native/include/java_lang_Boolean.h"
71 #include "native/include/java_lang_Float.h"
72 #include "native/include/java_lang_Double.h"
74 #if defined(ENABLE_ANNOTATIONS)
75 #include "native/include/sun_reflect_ConstantPool.h"
78 #include "native/vm/java_lang_Class.h"
79 #include "native/vm/java_lang_ClassLoader.h"
80 #include "native/vm/java_lang_Runtime.h"
81 #include "native/vm/java_lang_Thread.h"
82 #include "native/vm/java_lang_reflect_Constructor.h"
83 #include "native/vm/java_lang_reflect_Method.h"
84 #include "native/vm/reflect.h"
86 #include "threads/lock-common.h"
87 #include "threads/threads-common.h"
89 #include "toolbox/logging.h"
92 #include "vm/builtin.h"
93 #include "vm/exceptions.h"
94 #include "vm/global.h"
95 #include "vm/initialize.h"
96 #include "vm/package.h"
97 #include "vm/primitive.h"
98 #include "vm/properties.h"
99 #include "vm/resolve.h"
100 #include "vm/signallocal.h"
101 #include "vm/stringlocal.h"
104 #include "vm/jit/stacktrace.h"
106 #include "vmcore/classcache.h"
107 #include "vmcore/options.h"
108 #include "vmcore/system.h"
111 /* debugging macros ***********************************************************/
115 # define TRACEJVMCALLS(...) \
117 if (opt_TraceJVMCalls) { \
118 log_println(__VA_ARGS__); \
122 # define PRINTJVMWARNINGS(...)
124 /* if (opt_PrintJVMWarnings) { \ */
125 /* log_println(__VA_ARGS__); \ */
131 # define TRACEJVMCALLS(...)
132 # define PRINTJVMWARNINGS(...)
138 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
139 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
140 /* and build number (xx) */
141 unsigned int update_version : 8; /* Update release version (uu) */
142 unsigned int special_update_version : 8; /* Special update release version (c) */
143 unsigned int reserved1 : 16;
144 unsigned int reserved2;
146 /* The following bits represents JVM supports that JDK has dependency on.
147 * JDK can use these bits to determine which JVM version
148 * and support it has to maintain runtime compatibility.
150 * When a new bit is added in a minor or update release, make sure
151 * the new bit is also added in the main/baseline.
153 unsigned int is_attachable : 1;
161 * A structure used to a capture exception table entry in a Java method.
168 } JVM_ExceptionTableEntryType;
171 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
173 if ((intptr_t) count <= 0)
176 return vsnprintf(str, count, fmt, args);
180 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
186 len = jio_vsnprintf(str, count, fmt, ap);
193 int jio_fprintf(FILE* f, const char *fmt, ...)
195 log_println("jio_fprintf: IMPLEMENT ME!");
199 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
201 log_println("jio_vfprintf: IMPLEMENT ME!");
205 int jio_printf(const char *fmt, ...)
207 log_println("jio_printf: IMPLEMENT ME!");
211 /* JVM_GetInterfaceVersion */
213 jint JVM_GetInterfaceVersion()
215 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
217 #define JVM_INTERFACE_VERSION 4
219 return JVM_INTERFACE_VERSION;
223 /* JVM_CurrentTimeMillis */
225 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
228 log_println("JVM_CurrentTimeMillis");
230 return (jlong) builtin_currenttimemillis();
236 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
239 log_println("JVM_NanoTime");
241 return (jlong) builtin_nanotime();
247 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
252 s = (java_handle_t *) src;
253 d = (java_handle_t *) dst;
256 log_println("JVM_ArrayCopy: src=%p, src_pos=%d, dst=%p, dst_pos=%d, length=%d", src, src_pos, dst, dst_pos, length);
259 builtin_arraycopy(s, src_pos, d, dst_pos, length);
263 /* JVM_InitProperties */
265 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
269 TRACEJVMCALLS("JVM_InitProperties(env=%p, properties=%p)", env, properties);
271 h = (java_handle_t *) properties;
273 properties_system_add_all(h);
281 void JVM_Exit(jint code)
283 log_println("JVM_Exit: IMPLEMENT ME!");
289 void JVM_Halt(jint code)
292 log_println("JVM_Halt: code=%d", code);
299 /* JVM_OnExit(void (*func)) */
301 void JVM_OnExit(void (*func)(void))
303 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
311 TRACEJVMCALLS("JVM_GC()");
317 /* JVM_MaxObjectInspectionAge */
319 jlong JVM_MaxObjectInspectionAge(void)
321 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
325 /* JVM_TraceInstructions */
327 void JVM_TraceInstructions(jboolean on)
329 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
333 /* JVM_TraceMethodCalls */
335 void JVM_TraceMethodCalls(jboolean on)
337 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
341 /* JVM_TotalMemory */
343 jlong JVM_TotalMemory(void)
345 TRACEJVMCALLS("JVM_TotalMemory()");
347 return gc_get_heap_size();
353 jlong JVM_FreeMemory(void)
355 TRACEJVMCALLS("JVM_FreeMemory()");
357 return gc_get_free_bytes();
363 jlong JVM_MaxMemory(void)
365 TRACEJVMCALLS("JVM_MaxMemory()");
367 return gc_get_max_heap_size();
371 /* JVM_ActiveProcessorCount */
373 jint JVM_ActiveProcessorCount(void)
375 TRACEJVMCALLS("JVM_ActiveProcessorCount()");
377 return system_processors_online();
381 /* JVM_FillInStackTrace */
383 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
385 java_lang_Throwable *o;
386 java_handle_bytearray_t *ba;
389 log_println("JVM_FillInStackTrace: receiver=%p", receiver);
392 o = (java_lang_Throwable *) receiver;
394 ba = stacktrace_fillInStackTrace();
399 o->backtrace = (java_lang_Object *) ba;
403 /* JVM_PrintStackTrace */
405 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
407 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
411 /* JVM_GetStackTraceDepth */
413 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
415 java_lang_Throwable *o;
416 java_handle_bytearray_t *ba;
417 stacktracebuffer *stb;
419 TRACEJVMCALLS("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable);
421 if (throwable == NULL) {
422 exceptions_throw_nullpointerexception();
426 o = (java_lang_Throwable *) throwable;
427 ba = (java_handle_bytearray_t *) o->backtrace;
432 stb = (stacktracebuffer *) LLNI_array_data(ba);
438 /* JVM_GetStackTraceElement */
440 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
442 java_lang_Throwable *t;
443 java_handle_bytearray_t *ba;
444 stacktracebuffer *stb;
445 stacktrace_entry *ste;
446 java_lang_StackTraceElement *o;
447 java_lang_String *declaringclass;
448 java_lang_String *filename;
452 log_println("JVM_GetStackTraceElement: throwable=%p, index=%d", throwable, index);
455 t = (java_lang_Throwable *) throwable;
456 ba = (java_handle_bytearray_t *) t->backtrace;
457 stb = (stacktracebuffer *) LLNI_array_data(ba);
459 if ((index < 0) || (index >= stb->used)) {
460 /* XXX This should be an IndexOutOfBoundsException (check this
463 exceptions_throw_arrayindexoutofboundsexception();
467 ste = &(stb->entries[index]);
469 /* allocate a new StackTraceElement */
471 o = (java_lang_StackTraceElement *)
472 builtin_new(class_java_lang_StackTraceElement);
479 if (!(ste->method->flags & ACC_NATIVE)) {
480 if (ste->method->class->sourcefile)
481 filename = (java_lang_String *) javastring_new(ste->method->class->sourcefile);
488 /* get line number */
490 if (ste->method->flags & ACC_NATIVE)
493 linenumber = (ste->linenumber == 0) ? -1 : ste->linenumber;
495 /* get declaring class name */
498 _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(ste->method->class));
500 /* fill the java.lang.StackTraceElement element */
502 o->declaringClass = declaringclass;
503 o->methodName = (java_lang_String *) javastring_new(ste->method->name);
504 o->fileName = filename;
505 o->lineNumber = linenumber;
513 jint JVM_IHashCode(JNIEnv* env, jobject handle)
516 log_println("JVM_IHashCode: jobject=%p", handle);
518 return (jint) ((ptrint) handle);
522 /* JVM_MonitorWait */
524 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
526 #if defined(ENABLE_THREADS)
530 TRACEJVMCALLS("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms);
532 /* exceptions_throw_illegalargumentexception("argument out of range"); */
533 exceptions_throw_illegalargumentexception();
537 #if defined(ENABLE_THREADS)
538 o = (java_handle_t *) handle;
540 lock_wait_for_object(o, ms, 0);
545 /* JVM_MonitorNotify */
547 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
549 #if defined(ENABLE_THREADS)
553 TRACEJVMCALLS("JVM_MonitorNotify(env=%p, handle=%p)", env, handle);
555 #if defined(ENABLE_THREADS)
556 o = (java_handle_t *) handle;
558 lock_notify_object(o);
563 /* JVM_MonitorNotifyAll */
565 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
567 #if defined(ENABLE_THREADS)
571 TRACEJVMCALLS("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle);
573 #if defined(ENABLE_THREADS)
574 o = (java_handle_t *) handle;
576 lock_notify_all_object(o);
583 jobject JVM_Clone(JNIEnv* env, jobject handle)
586 log_println("JVM_Clone: handle=%p", handle);
588 return (jobject) builtin_clone(env, (java_handle_t *) handle);
592 /* JVM_InitializeCompiler */
594 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
596 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
600 /* JVM_IsSilentCompiler */
602 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
604 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
608 /* JVM_CompileClass */
610 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
612 log_println("JVM_CompileClass: IMPLEMENT ME!");
616 /* JVM_CompileClasses */
618 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
620 log_println("JVM_CompileClasses: IMPLEMENT ME!");
624 /* JVM_CompilerCommand */
626 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
628 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
632 /* JVM_EnableCompiler */
634 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
636 TRACEJVMCALLS("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls);
637 PRINTJVMWARNINGS("JVM_EnableCompiler not supported");
641 /* JVM_DisableCompiler */
643 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
645 TRACEJVMCALLS("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls);
646 PRINTJVMWARNINGS("JVM_DisableCompiler not supported");
650 /* JVM_GetLastErrorString */
652 jint JVM_GetLastErrorString(char *buf, int len)
678 char *JVM_NativePath(char *path)
680 TRACEJVMCALLS("JVM_NativePath(path=%s)", path);
682 /* XXX is this correct? */
688 /* JVM_GetCallerClass */
690 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
692 java_handle_objectarray_t *oa;
694 TRACEJVMCALLS("JVM_GetCallerClass(env=%p, depth=%d)", env, depth);
696 oa = stacktrace_getClassContext();
701 if (oa->header.size < depth)
704 return (jclass) oa->data[depth - 1];
709 /* JVM_FindPrimitiveClass */
711 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
716 TRACEJVMCALLS("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s);
719 c = primitive_class_get_by_name(u);
721 return (jclass) LLNI_classinfo_wrap(c);
725 /* JVM_ResolveClass */
727 void JVM_ResolveClass(JNIEnv* env, jclass cls)
729 TRACEJVMCALLS("JVM_ResolveClass(env=%p, cls=%p)", env, cls);
730 PRINTJVMWARNINGS("JVM_ResolveClass not implemented");
734 /* JVM_FindClassFromClassLoader */
736 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
742 TRACEJVMCALLS("JVM_FindClassFromClassLoader: name=%s, init=%d, loader=%p, throwError=%d", name, init, loader, throwError);
744 u = utf_new_char(name);
745 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
747 c = load_class_from_classloader(u, cl);
753 if (!(c->state & CLASS_INITIALIZED))
754 if (!initialize_class(c))
757 return (jclass) LLNI_classinfo_wrap(c);
761 /* JVM_FindClassFromClass */
763 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
765 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
769 /* JVM_DefineClass */
771 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
773 log_println("JVM_DefineClass: IMPLEMENT ME!");
777 /* JVM_DefineClassWithSource */
779 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
785 TRACEJVMCALLS("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source);
788 u = utf_new_char(name);
792 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
794 /* XXX do something with source */
796 c = class_define(u, cl, len, (const uint8_t *) buf, (java_handle_t *) pd);
798 return (jclass) LLNI_classinfo_wrap(c);
802 /* JVM_FindLoadedClass */
804 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
810 TRACEJVMCALLS("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name);
812 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
814 u = javastring_toutf((java_handle_t *) name, true);
815 c = classcache_lookup(cl, u);
817 return (jclass) LLNI_classinfo_wrap(c);
821 /* JVM_GetClassName */
823 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
826 log_println("JVM_GetClassName: cls=%p", cls);
828 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
832 /* JVM_GetClassInterfaces */
834 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
837 java_handle_objectarray_t *oa;
839 TRACEJVMCALLS("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls);
841 c = LLNI_classinfo_unwrap(cls);
843 oa = class_get_interfaces(c);
845 return (jobjectArray) oa;
849 /* JVM_GetClassLoader */
851 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
856 TRACEJVMCALLS("JVM_GetClassLoader(env=%p, cls=%p)", env, cls);
858 c = LLNI_classinfo_unwrap(cls);
859 cl = class_get_classloader(c);
865 /* JVM_IsInterface */
867 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
872 log_println("JVM_IsInterface: cls=%p", cls);
875 c = LLNI_classinfo_unwrap(cls);
877 return class_is_interface(c);
881 /* JVM_GetClassSigners */
883 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
885 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
889 /* JVM_SetClassSigners */
891 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
894 java_handle_objectarray_t *hoa;
896 TRACEJVMCALLS("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers);
898 c = LLNI_classinfo_unwrap(cls);
900 hoa = (java_handle_objectarray_t *) signers;
902 /* This call is ignored for primitive types and arrays. Signers
903 are only set once, ClassLoader.java, and thus shouldn't be
904 called with an array. Only the bootstrap loader creates
907 if (class_is_primitive(c) || class_is_array(c))
910 LLNI_classinfo_field_set(c, signers, hoa);
914 /* JVM_GetProtectionDomain */
916 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
920 TRACEJVMCALLS("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls);
922 c = LLNI_classinfo_unwrap(cls);
925 exceptions_throw_nullpointerexception();
929 /* Primitive types do not have a protection domain. */
931 if (class_is_primitive(c))
934 return (jobject) c->protectiondomain;
938 /* JVM_SetProtectionDomain */
940 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
942 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
946 /* JVM_DoPrivileged */
948 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
953 java_handle_t *result;
957 log_println("JVM_DoPrivileged: action=%p, context=%p, wrapException=%d", action, context, wrapException);
960 o = (java_handle_t *) action;
963 if (action == NULL) {
964 exceptions_throw_nullpointerexception();
968 /* lookup run() method (throw no exceptions) */
970 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
973 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
974 exceptions_throw_internalerror("No run method");
978 /* XXX It seems something with a privileged stack needs to be done
981 result = vm_call_method(m, o);
983 e = exceptions_get_and_clear_exception();
986 exceptions_throw_privilegedactionexception(e);
990 return (jobject) result;
994 /* JVM_GetInheritedAccessControlContext */
996 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
998 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1002 /* JVM_GetStackAccessControlContext */
1004 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1006 TRACEJVMCALLS("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls);
1008 /* XXX All stuff I tested so far works without that function. At
1009 some point we have to implement it, but I disable the output
1010 for now to make IcedTea happy. */
1016 /* JVM_IsArrayClass */
1018 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1021 log_println("JVM_IsArrayClass: cls=%p", cls);
1023 return class_is_array(LLNI_classinfo_unwrap(cls));
1027 /* JVM_IsPrimitiveClass */
1029 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1033 c = LLNI_classinfo_unwrap(cls);
1036 log_println("JVM_IsPrimitiveClass(cls=%p)", cls);
1039 return class_is_primitive(c);
1043 /* JVM_GetComponentType */
1045 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1047 classinfo *component;
1050 TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
1052 c = LLNI_classinfo_unwrap(cls);
1054 component = class_get_componenttype(c);
1056 return (jclass) LLNI_classinfo_wrap(component);
1060 /* JVM_GetClassModifiers */
1062 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1067 TRACEJVMCALLS("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls);
1069 c = LLNI_classinfo_unwrap(cls);
1071 flags = class_get_modifiers(c, false);
1077 /* JVM_GetDeclaredClasses */
1079 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1082 java_handle_objectarray_t *oa;
1084 TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
1086 c = LLNI_classinfo_unwrap(ofClass);
1088 oa = class_get_declaredclasses(c, false);
1090 return (jobjectArray) oa;
1094 /* JVM_GetDeclaringClass */
1096 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1101 TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
1103 c = LLNI_classinfo_unwrap(ofClass);
1105 dc = class_get_declaringclass(c);
1107 return (jclass) LLNI_classinfo_wrap(dc);
1111 /* JVM_GetClassSignature */
1113 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1119 TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
1121 c = LLNI_classinfo_unwrap(cls);
1123 /* Get the signature of the class. */
1125 u = class_get_signature(c);
1130 /* Convert UTF-string to a Java-string. */
1132 s = javastring_new(u);
1138 /* JVM_GetClassAnnotations */
1140 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1142 classinfo *c = NULL; /* classinfo for 'cls' */
1143 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1145 TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
1148 exceptions_throw_nullpointerexception();
1152 c = LLNI_classinfo_unwrap(cls);
1154 /* get annotations: */
1155 annotations = class_get_annotations(c);
1157 return (jbyteArray)annotations;
1161 /* JVM_GetFieldAnnotations */
1163 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1165 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1166 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1168 TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
1170 if (field == NULL) {
1171 exceptions_throw_nullpointerexception();
1175 rf = (java_lang_reflect_Field*)field;
1177 LLNI_field_get_ref(rf, annotations, ba);
1179 return (jbyteArray)ba;
1183 /* JVM_GetMethodAnnotations */
1185 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1187 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1188 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1190 TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
1192 if (method == NULL) {
1193 exceptions_throw_nullpointerexception();
1197 rm = (java_lang_reflect_Method*)method;
1199 LLNI_field_get_ref(rm, annotations, ba);
1201 return (jbyteArray)ba;
1205 /* JVM_GetMethodDefaultAnnotationValue */
1207 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1209 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1210 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1212 TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
1214 if (method == NULL) {
1215 exceptions_throw_nullpointerexception();
1219 rm = (java_lang_reflect_Method*)method;
1221 LLNI_field_get_ref(rm, annotationDefault, ba);
1223 return (jbyteArray)ba;
1227 /* JVM_GetMethodParameterAnnotations */
1229 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1231 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1232 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1234 TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
1236 if (method == NULL) {
1237 exceptions_throw_nullpointerexception();
1241 rm = (java_lang_reflect_Method*)method;
1243 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1245 return (jbyteArray)ba;
1249 /* JVM_GetClassDeclaredFields */
1251 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1254 log_println("JVM_GetClassDeclaredFields: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1256 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1260 /* JVM_GetClassDeclaredMethods */
1262 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1265 log_println("JVM_GetClassDeclaredMethods: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1267 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1271 /* JVM_GetClassDeclaredConstructors */
1273 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1276 log_println("JVM_GetClassDeclaredConstructors: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1278 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1282 /* JVM_GetClassAccessFlags */
1284 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1288 TRACEJVMCALLS("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls);
1290 c = LLNI_classinfo_unwrap(cls);
1292 /* Primitive type classes have the correct access flags. */
1294 return c->flags & ACC_CLASS_REFLECT_MASK;
1298 /* JVM_GetClassConstantPool */
1300 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1302 #if defined(ENABLE_ANNOTATIONS)
1303 sun_reflect_ConstantPool *constantPool = NULL;
1304 /* constant pool object for the class refered by 'cls' */
1305 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1306 /* constantPoolOop field of the constant pool object */
1308 TRACEJVMCALLS("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls);
1311 (sun_reflect_ConstantPool*)native_new_and_init(
1312 class_sun_reflect_ConstantPool);
1314 if (constantPool == NULL) {
1319 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1321 return (jobject)constantPool;
1323 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1329 /* JVM_ConstantPoolGetSize */
1331 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1333 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1335 TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
1337 c = LLNI_classinfo_unwrap(jcpool);
1343 /* JVM_ConstantPoolGetClassAt */
1345 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1347 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1348 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1349 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1351 TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
1353 c = LLNI_classinfo_unwrap(jcpool);
1355 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1358 exceptions_throw_illegalargumentexception();
1362 result = resolve_classref_eager(ref);
1364 return (jclass) LLNI_classinfo_wrap(result);
1368 /* JVM_ConstantPoolGetClassAtIfLoaded */
1370 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1372 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1373 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1374 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1376 TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
1378 c = LLNI_classinfo_unwrap(jcpool);
1380 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1383 exceptions_throw_illegalargumentexception();
1387 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1391 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1395 return (jclass) LLNI_classinfo_wrap(result);
1399 /* JVM_ConstantPoolGetMethodAt */
1401 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1403 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1404 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1406 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
1408 cls = LLNI_classinfo_unwrap(jcpool);
1409 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1412 exceptions_throw_illegalargumentexception();
1416 /* XXX: is that right? or do I have to use resolve_method_*? */
1417 return (jobject)reflect_method_new(ref->p.method);
1421 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1423 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1425 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1426 classinfo *c = NULL; /* resolved declaring class of the method */
1427 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1429 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1431 cls = LLNI_classinfo_unwrap(jcpool);
1432 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1435 exceptions_throw_illegalargumentexception();
1439 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1443 if (c == NULL || !(c->state & CLASS_LOADED)) {
1447 return (jobject)reflect_method_new(ref->p.method);
1451 /* JVM_ConstantPoolGetFieldAt */
1453 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1455 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1456 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1458 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
1460 cls = LLNI_classinfo_unwrap(jcpool);
1461 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1464 exceptions_throw_illegalargumentexception();
1468 return (jobject)reflect_field_new(ref->p.field);
1472 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1474 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1476 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1477 classinfo *c; /* resolved declaring class for the field */
1478 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1480 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1482 cls = LLNI_classinfo_unwrap(jcpool);
1483 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1486 exceptions_throw_illegalargumentexception();
1490 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1494 if (c == NULL || !(c->state & CLASS_LOADED)) {
1498 return (jobject)reflect_field_new(ref->p.field);
1502 /* JVM_ConstantPoolGetMemberRefInfoAt */
1504 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1506 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1508 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1514 /* JVM_ConstantPoolGetIntAt */
1516 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1518 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1519 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1521 TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
1523 cls = LLNI_classinfo_unwrap(jcpool);
1524 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1527 exceptions_throw_illegalargumentexception();
1535 /* JVM_ConstantPoolGetLongAt */
1537 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1539 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1540 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1542 TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
1544 cls = LLNI_classinfo_unwrap(jcpool);
1545 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1548 exceptions_throw_illegalargumentexception();
1556 /* JVM_ConstantPoolGetFloatAt */
1558 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1560 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1561 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1563 TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
1565 cls = LLNI_classinfo_unwrap(jcpool);
1566 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1569 exceptions_throw_illegalargumentexception();
1577 /* JVM_ConstantPoolGetDoubleAt */
1579 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1581 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1582 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1584 TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
1586 cls = LLNI_classinfo_unwrap(jcpool);
1587 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1590 exceptions_throw_illegalargumentexception();
1598 /* JVM_ConstantPoolGetStringAt */
1600 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1602 utf *ref; /* utf object for the string in constant pool at index 'index' */
1603 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1605 TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
1607 cls = LLNI_classinfo_unwrap(jcpool);
1608 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1611 exceptions_throw_illegalargumentexception();
1615 /* XXX: I hope literalstring_new is the right Function. */
1616 return (jstring)literalstring_new(ref);
1620 /* JVM_ConstantPoolGetUTF8At */
1622 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1624 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1625 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1627 TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
1629 cls = LLNI_classinfo_unwrap(jcpool);
1630 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1633 exceptions_throw_illegalargumentexception();
1637 /* XXX: I hope literalstring_new is the right Function. */
1638 return (jstring)literalstring_new(ref);
1642 /* JVM_DesiredAssertionStatus */
1644 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1646 TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
1648 /* TODO: Implement this one, but false should be OK. */
1654 /* JVM_AssertionStatusDirectives */
1656 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1659 java_lang_AssertionStatusDirectives *o;
1660 java_handle_objectarray_t *classes;
1661 java_handle_objectarray_t *packages;
1663 TRACEJVMCALLS("JVM_AssertionStatusDirectives(env=%p, unused=%p): COMPLETE ME!", env, unused);
1665 /* XXX this is not completely implemented */
1667 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1672 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1677 classes = builtin_anewarray(0, class_java_lang_Object);
1679 if (classes == NULL)
1682 packages = builtin_anewarray(0, class_java_lang_Object);
1684 if (packages == NULL)
1687 /* set instance fields */
1689 o->classes = classes;
1690 o->packages = packages;
1696 /* JVM_GetClassNameUTF */
1698 const char* JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1700 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1704 /* JVM_GetClassCPTypes */
1706 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1708 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1712 /* JVM_GetClassCPEntriesCount */
1714 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1716 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1720 /* JVM_GetClassFieldsCount */
1722 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1724 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1728 /* JVM_GetClassMethodsCount */
1730 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1732 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1736 /* JVM_GetMethodIxExceptionIndexes */
1738 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1740 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1744 /* JVM_GetMethodIxExceptionsCount */
1746 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1748 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1752 /* JVM_GetMethodIxByteCode */
1754 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1756 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1760 /* JVM_GetMethodIxByteCodeLength */
1762 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1764 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1768 /* JVM_GetMethodIxExceptionTableEntry */
1770 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1772 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1776 /* JVM_GetMethodIxExceptionTableLength */
1778 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1780 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1784 /* JVM_GetMethodIxModifiers */
1786 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1788 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1792 /* JVM_GetFieldIxModifiers */
1794 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1796 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1800 /* JVM_GetMethodIxLocalsCount */
1802 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1804 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1808 /* JVM_GetMethodIxArgsSize */
1810 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1812 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1816 /* JVM_GetMethodIxMaxStack */
1818 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1820 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1824 /* JVM_IsConstructorIx */
1826 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1828 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1832 /* JVM_GetMethodIxNameUTF */
1834 const char* JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1836 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1840 /* JVM_GetMethodIxSignatureUTF */
1842 const char* JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1844 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1848 /* JVM_GetCPFieldNameUTF */
1850 const char* JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1852 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1856 /* JVM_GetCPMethodNameUTF */
1858 const char* JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1860 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1864 /* JVM_GetCPMethodSignatureUTF */
1866 const char* JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1868 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1872 /* JVM_GetCPFieldSignatureUTF */
1874 const char* JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1876 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1880 /* JVM_GetCPClassNameUTF */
1882 const char* JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1884 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
1888 /* JVM_GetCPFieldClassNameUTF */
1890 const char* JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1892 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
1896 /* JVM_GetCPMethodClassNameUTF */
1898 const char* JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1900 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
1904 /* JVM_GetCPFieldModifiers */
1906 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1908 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
1912 /* JVM_GetCPMethodModifiers */
1914 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1916 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
1920 /* JVM_ReleaseUTF */
1922 void JVM_ReleaseUTF(const char *utf)
1924 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
1928 /* JVM_IsSameClassPackage */
1930 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
1932 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
1938 jint JVM_Open(const char *fname, jint flags, jint mode)
1943 log_println("JVM_Open: fname=%s, flags=%d, mode=%d", fname, flags, mode);
1946 result = open(fname, flags, mode);
1954 /* XXX don't know what to do here */
1955 /* return JVM_EEXIST; */
1966 jint JVM_Close(jint fd)
1969 log_println("JVM_Close: fd=%d", fd);
1977 jint JVM_Read(jint fd, char *buf, jint nbytes)
1980 log_println("JVM_Read: fd=%d, buf=%p, nbytes=%d", fd, buf, nbytes);
1982 return read(fd, buf, nbytes);
1988 jint JVM_Write(jint fd, char *buf, jint nbytes)
1991 log_println("JVM_Write: fd=%d, buf=%s, nbytes=%d", fd, buf, nbytes);
1993 return write(fd, buf, nbytes);
1999 jint JVM_Available(jint fd, jlong *pbytes)
2001 #if defined(FIONREAD)
2004 TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
2008 if (ioctl(fd, FIONREAD, &bytes) < 0)
2015 # error FIONREAD not defined
2022 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2024 TRACEJVMCALLS("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence);
2026 return (jlong) lseek(fd, (off_t) offset, whence);
2032 jint JVM_SetLength(jint fd, jlong length)
2034 TRACEJVMCALLS("JVM_SetLength(fd=%d, length=%ld)", length);
2036 return ftruncate(fd, length);
2042 jint JVM_Sync(jint fd)
2044 TRACEJVMCALLS("JVM_Sync(fd=%d)", fd);
2050 /* JVM_StartThread */
2052 void JVM_StartThread(JNIEnv* env, jobject jthread)
2055 log_println("JVM_StartThread: jthread=%p", jthread);
2057 _Jv_java_lang_Thread_start((java_lang_Thread *) jthread, 0);
2061 /* JVM_StopThread */
2063 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2065 log_println("JVM_StopThread: IMPLEMENT ME!");
2069 /* JVM_IsThreadAlive */
2071 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2077 TRACEJVMCALLS("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread);
2079 /* XXX this is just a quick hack */
2081 for (t = threads_list_first(); t != NULL; t = threads_list_next(t)) {
2082 LLNI_equals(t->object, jthread, equal);
2088 /* The threadobject is null when a thread is created in Java. The
2089 priority is set later during startup. */
2094 result = threads_thread_is_alive(t);
2100 /* JVM_SuspendThread */
2102 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2104 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2108 /* JVM_ResumeThread */
2110 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2112 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2116 /* JVM_SetThreadPriority */
2118 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2121 log_println("JVM_SetThreadPriority: jthread=%p, prio=%d", jthread, prio);
2123 _Jv_java_lang_Thread_setPriority((java_lang_Thread *) jthread, prio);
2129 void JVM_Yield(JNIEnv *env, jclass threadClass)
2131 TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
2139 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2142 log_println("JVM_Sleep: threadClass=%p, millis=%ld", threadClass, millis);
2144 _Jv_java_lang_Thread_sleep(millis);
2148 /* JVM_CurrentThread */
2150 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2153 log_println("JVM_CurrentThread: threadClass=%p", threadClass);
2155 return (jobject) _Jv_java_lang_Thread_currentThread();
2159 /* JVM_CountStackFrames */
2161 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2163 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2169 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2171 log_println("JVM_Interrupt: IMPLEMENT ME!");
2175 /* JVM_IsInterrupted */
2177 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2180 log_println("JVM_IsInterrupted: jthread=%p, clear_interrupted=%d", jthread, clear_interrupted);
2182 /* XXX do something with clear_interrupted */
2183 return _Jv_java_lang_Thread_isInterrupted((java_lang_Thread *) jthread);
2189 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2194 TRACEJVMCALLS("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj);
2196 h = (java_handle_t *) obj;
2199 exceptions_throw_nullpointerexception();
2203 result = lock_is_held_by_current_thread(h);
2209 /* JVM_DumpAllStacks */
2211 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2213 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2217 /* JVM_CurrentLoadedClass */
2219 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2221 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2225 /* JVM_CurrentClassLoader */
2227 jobject JVM_CurrentClassLoader(JNIEnv *env)
2229 /* XXX if a method in a class in a trusted loader is in a
2230 doPrivileged, return NULL */
2232 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2236 /* JVM_GetClassContext */
2238 jobjectArray JVM_GetClassContext(JNIEnv *env)
2241 log_println("JVM_GetClassContext");
2243 return (jobjectArray) stacktrace_getClassContext();
2247 /* JVM_ClassDepth */
2249 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2251 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2255 /* JVM_ClassLoaderDepth */
2257 jint JVM_ClassLoaderDepth(JNIEnv *env)
2259 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2263 /* JVM_GetSystemPackage */
2265 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2271 TRACEJVMCALLS("JVM_GetSystemPackage(env=%p, name=%p)", env, name);
2273 /* s = package_find(name); */
2274 u = javastring_toutf(name, false);
2275 result = package_find(u);
2277 s = javastring_new(result);
2285 /* JVM_GetSystemPackages */
2287 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2289 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2293 /* JVM_AllocateNewObject */
2295 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2297 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2301 /* JVM_AllocateNewArray */
2303 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2305 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2309 /* JVM_LatestUserDefinedLoader */
2311 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2313 log_println("JVM_LatestUserDefinedLoader: IMPLEMENT ME!");
2317 /* JVM_LoadClass0 */
2319 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2321 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2325 /* JVM_GetArrayLength */
2327 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2331 TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
2333 a = (java_handle_t *) arr;
2335 return array_length_get(a);
2339 /* JVM_GetArrayElement */
2341 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2346 TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
2348 a = (java_handle_t *) arr;
2350 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2351 /* exceptions_throw_illegalargumentexception(); */
2355 o = array_element_get(a, index);
2361 /* JVM_GetPrimitiveArrayElement */
2363 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2365 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2369 /* JVM_SetArrayElement */
2371 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2374 java_handle_t *value;
2376 TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
2378 a = (java_handle_t *) arr;
2379 value = (java_handle_t *) val;
2381 array_element_set(a, index, value);
2385 /* JVM_SetPrimitiveArrayElement */
2387 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2389 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2395 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2400 java_handle_objectarray_t *oa;
2402 TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
2404 if (eltClass == NULL) {
2405 exceptions_throw_nullpointerexception();
2409 /* NegativeArraySizeException is checked in builtin_newarray. */
2411 c = LLNI_classinfo_unwrap(eltClass);
2413 /* create primitive or object array */
2415 if (class_is_primitive(c)) {
2416 pc = primitive_arrayclass_get_by_name(c->name);
2417 a = builtin_newarray(length, pc);
2422 oa = builtin_anewarray(length, c);
2424 return (jobject) oa;
2429 /* JVM_NewMultiArray */
2431 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2434 java_handle_intarray_t *ia;
2440 java_handle_objectarray_t *a;
2442 TRACEJVMCALLS("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim);
2444 if (eltClass == NULL) {
2445 exceptions_throw_nullpointerexception();
2449 /* NegativeArraySizeException is checked in builtin_newarray. */
2451 c = LLNI_classinfo_unwrap(eltClass);
2453 /* XXX This is just a quick hack to get it working. */
2455 ia = (java_handle_intarray_t *) dim;
2457 length = array_length_get(ia);
2459 dims = MNEW(long, length);
2461 for (i = 0; i < length; i++) {
2462 value = LLNI_array_direct(ia, i);
2463 dims[i] = (long) value;
2466 /* Create an array-class if necessary. */
2468 if (class_is_primitive(c))
2469 ac = primitive_arrayclass_get_by_name(c->name);
2471 ac = class_array_of(c, true);
2476 a = builtin_multianewarray(length, ac, dims);
2482 /* JVM_InitializeSocketLibrary */
2484 jint JVM_InitializeSocketLibrary()
2486 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2492 jint JVM_Socket(jint domain, jint type, jint protocol)
2494 TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
2496 return socket(domain, type, protocol);
2500 /* JVM_SocketClose */
2502 jint JVM_SocketClose(jint fd)
2504 TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
2510 /* JVM_SocketShutdown */
2512 jint JVM_SocketShutdown(jint fd, jint howto)
2514 TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
2516 return shutdown(fd, howto);
2522 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2524 log_println("JVM_Recv: IMPLEMENT ME!");
2530 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2532 log_println("JVM_Send: IMPLEMENT ME!");
2538 jint JVM_Timeout(int fd, long timeout)
2540 log_println("JVM_Timeout: IMPLEMENT ME!");
2546 jint JVM_Listen(jint fd, jint count)
2548 TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
2550 return listen(fd, count);
2556 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2558 TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
2560 return connect(fd, him, len);
2566 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2568 log_println("JVM_Bind: IMPLEMENT ME!");
2574 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2576 TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
2578 return accept(fd, him, (socklen_t *) len);
2584 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2586 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2590 /* JVM_GetSockName */
2592 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2594 TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
2596 return getsockname(fd, him, (socklen_t *) len);
2602 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2604 log_println("JVM_SendTo: IMPLEMENT ME!");
2608 /* JVM_SocketAvailable */
2610 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2612 #if defined(FIONREAD)
2615 TRACEJVMCALLS("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes);
2619 if (ioctl(fd, FIONREAD, &bytes) < 0)
2626 # error FIONREAD not defined
2631 /* JVM_GetSockOpt */
2633 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2635 #if defined(HAVE_GETSOCKOPT)
2636 TRACEJVMCALLS("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen);
2638 return getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2640 # error getsockopt not available
2645 /* JVM_SetSockOpt */
2647 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2649 #if defined(HAVE_SETSOCKOPT)
2650 TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
2652 return setsockopt(fd, level, optname, optval, optlen);
2654 # error setsockopt not available
2659 /* JVM_GetHostName */
2661 int JVM_GetHostName(char* name, int namelen)
2663 TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
2665 return gethostname(name, namelen);
2669 /* JVM_GetHostByAddr */
2671 struct hostent* JVM_GetHostByAddr(const char* name, int len, int type)
2673 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2677 /* JVM_GetHostByName */
2679 struct hostent* JVM_GetHostByName(char* name)
2681 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2685 /* JVM_GetProtoByName */
2687 struct protoent* JVM_GetProtoByName(char* name)
2689 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2693 /* JVM_LoadLibrary */
2695 void *JVM_LoadLibrary(const char *name)
2699 TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
2701 u = utf_new_char(name);
2703 return native_library_open(u);
2707 /* JVM_UnloadLibrary */
2709 void JVM_UnloadLibrary(void* handle)
2711 log_println("JVM_UnloadLibrary: IMPLEMENT ME!");
2715 /* JVM_FindLibraryEntry */
2717 void *JVM_FindLibraryEntry(void *handle, const char *name)
2721 TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
2723 symbol = lt_dlsym(handle, name);
2731 jboolean JVM_IsNaN(jdouble a)
2733 log_println("JVM_IsNaN: IMPLEMENT ME!");
2737 /* JVM_IsSupportedJNIVersion */
2739 jboolean JVM_IsSupportedJNIVersion(jint version)
2741 TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
2743 return jni_version_check(version);
2747 /* JVM_InternString */
2749 jstring JVM_InternString(JNIEnv *env, jstring str)
2751 TRACEJVMCALLS("JVM_InternString(env=%p, str=%p)", env, str);
2753 return (jstring) javastring_intern((java_handle_t *) str);
2757 /* JVM_RawMonitorCreate */
2759 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2764 log_println("JVM_RawMonitorCreate");
2767 o = NEW(java_object_t);
2769 lock_init_object_lock(o);
2775 /* JVM_RawMonitorDestroy */
2777 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
2780 log_println("JVM_RawMonitorDestroy: mon=%p", mon);
2782 FREE(mon, java_object_t);
2786 /* JVM_RawMonitorEnter */
2788 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
2791 log_println("JVM_RawMonitorEnter: mon=%p", mon);
2793 (void) lock_monitor_enter((java_object_t *) mon);
2799 /* JVM_RawMonitorExit */
2801 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
2804 log_println("JVM_RawMonitorExit: mon=%p", mon);
2806 (void) lock_monitor_exit((java_object_t *) mon);
2810 /* JVM_SetPrimitiveFieldValues */
2812 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2814 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
2818 /* JVM_GetPrimitiveFieldValues */
2820 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2822 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
2826 /* JVM_AccessVMBooleanFlag */
2828 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
2830 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
2834 /* JVM_AccessVMIntFlag */
2836 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
2838 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
2842 /* JVM_VMBreakPoint */
2844 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
2846 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
2850 /* JVM_GetClassFields */
2852 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
2854 log_println("JVM_GetClassFields: IMPLEMENT ME!");
2858 /* JVM_GetClassMethods */
2860 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
2862 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
2866 /* JVM_GetClassConstructors */
2868 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
2870 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
2874 /* JVM_GetClassField */
2876 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
2878 log_println("JVM_GetClassField: IMPLEMENT ME!");
2882 /* JVM_GetClassMethod */
2884 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
2886 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
2890 /* JVM_GetClassConstructor */
2892 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
2894 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
2898 /* JVM_NewInstance */
2900 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
2902 log_println("JVM_NewInstance: IMPLEMENT ME!");
2908 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
2910 log_println("JVM_GetField: IMPLEMENT ME!");
2914 /* JVM_GetPrimitiveField */
2916 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
2918 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
2924 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
2926 log_println("JVM_SetField: IMPLEMENT ME!");
2930 /* JVM_SetPrimitiveField */
2932 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
2934 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
2938 /* JVM_InvokeMethod */
2940 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
2943 log_println("JVM_InvokeMethod: method=%p, obj=%p, args0=%p", method, obj, args0);
2945 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
2949 /* JVM_NewInstanceFromConstructor */
2951 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
2954 log_println("JVM_NewInstanceFromConstructor: c=%p, args0=%p", c, args0);
2956 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
2960 /* JVM_SupportsCX8 */
2962 jboolean JVM_SupportsCX8()
2964 TRACEJVMCALLS("JVM_SupportsCX8()");
2974 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
2976 log_println("JVM_CX8Field: IMPLEMENT ME!");
2980 /* JVM_GetAllThreads */
2982 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
2984 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
2988 /* JVM_DumpThreads */
2990 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
2992 log_println("JVM_DumpThreads: IMPLEMENT ME!");
2996 /* JVM_GetManagement */
2998 void* JVM_GetManagement(jint version)
3000 log_println("JVM_GetManagement: IMPLEMENT ME!");
3004 /* JVM_InitAgentProperties */
3006 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3008 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3012 /* JVM_GetEnclosingMethodInfo */
3014 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3016 log_println("JVM_GetEnclosingMethodInfo: IMPLEMENT ME!");
3020 /* JVM_GetThreadStateValues */
3022 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3024 java_handle_intarray_t *ia;
3026 TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3027 env, javaThreadState);
3029 /* If new thread states are added in future JDK and VM versions,
3030 this should check if the JDK version is compatible with thread
3031 states supported by the VM. Return NULL if not compatible.
3033 This function must map the VM java_lang_Thread::ThreadStatus
3034 to the Java thread state that the JDK supports. */
3036 switch (javaThreadState) {
3037 case THREAD_STATE_NEW:
3038 ia = builtin_newarray_int(1);
3043 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3046 case THREAD_STATE_RUNNABLE:
3047 ia = builtin_newarray_int(1);
3052 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3055 case THREAD_STATE_BLOCKED:
3056 ia = builtin_newarray_int(1);
3061 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3064 case THREAD_STATE_WAITING:
3065 ia = builtin_newarray_int(2);
3070 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3071 /* XXX Implement parked stuff. */
3072 /* array_intarray_element_set(ia, 1, PARKED); */
3075 case THREAD_STATE_TIMED_WAITING:
3076 ia = builtin_newarray_int(3);
3081 /* XXX Not sure about that one. */
3082 /* array_intarray_element_set(ia, 0, SLEEPING); */
3083 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3084 /* XXX Implement parked stuff. */
3085 /* array_intarray_element_set(ia, 2, PARKED); */
3088 case THREAD_STATE_TERMINATED:
3089 ia = builtin_newarray_int(1);
3094 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3098 /* Unknown state - probably incompatible JDK version */
3102 return (jintArray) ia;
3106 /* JVM_GetThreadStateNames */
3108 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3110 java_handle_intarray_t *ia;
3111 java_handle_objectarray_t *oa;
3114 TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3115 env, javaThreadState, values);
3117 ia = (java_handle_intarray_t *) values;
3119 /* If new thread states are added in future JDK and VM versions,
3120 this should check if the JDK version is compatible with thread
3121 states supported by the VM. Return NULL if not compatible.
3123 This function must map the VM java_lang_Thread::ThreadStatus
3124 to the Java thread state that the JDK supports. */
3126 if (values == NULL) {
3127 exceptions_throw_nullpointerexception();
3131 switch (javaThreadState) {
3132 case THREAD_STATE_NEW:
3133 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3135 oa = builtin_anewarray(1, class_java_lang_String);
3140 s = javastring_new(utf_new_char("NEW"));
3145 array_objectarray_element_set(oa, 0, s);
3148 case THREAD_STATE_RUNNABLE:
3149 oa = builtin_anewarray(1, class_java_lang_String);
3154 s = javastring_new(utf_new_char("RUNNABLE"));
3159 array_objectarray_element_set(oa, 0, s);
3162 case THREAD_STATE_BLOCKED:
3163 oa = builtin_anewarray(1, class_java_lang_String);
3168 s = javastring_new(utf_new_char("BLOCKED"));
3173 array_objectarray_element_set(oa, 0, s);
3176 case THREAD_STATE_WAITING:
3177 oa = builtin_anewarray(2, class_java_lang_String);
3182 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3183 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3188 array_objectarray_element_set(oa, 0, s);
3189 /* array_objectarray_element_set(oa, 1, s); */
3192 case THREAD_STATE_TIMED_WAITING:
3193 oa = builtin_anewarray(3, class_java_lang_String);
3198 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3199 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3200 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3205 /* array_objectarray_element_set(oa, 0, s); */
3206 array_objectarray_element_set(oa, 0, s);
3207 /* array_objectarray_element_set(oa, 2, s); */
3210 case THREAD_STATE_TERMINATED:
3211 oa = builtin_anewarray(1, class_java_lang_String);
3216 s = javastring_new(utf_new_char("TERMINATED"));
3221 array_objectarray_element_set(oa, 0, s);
3225 /* Unknown state - probably incompatible JDK version */
3229 return (jobjectArray) oa;
3233 /* JVM_GetVersionInfo */
3235 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3237 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3241 /* OS: JVM_RegisterSignal */
3243 void *JVM_RegisterSignal(jint sig, void *handler)
3245 functionptr newHandler;
3247 TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
3249 if (handler == (void *) 2)
3250 newHandler = (functionptr) signal_thread_handler;
3252 newHandler = (functionptr) (uintptr_t) handler;
3259 /* These signals are already used by the VM. */
3263 /* This signal is used by the VM to dump thread stacks unless
3264 ReduceSignalUsage is set, in which case the user is allowed
3265 to set his own _native_ handler for this signal; thus, in
3266 either case, we do not allow JVM_RegisterSignal to change
3276 signal_register_signal(sig, newHandler, 0);
3278 /* XXX Should return old handler. */
3284 /* OS: JVM_RaiseSignal */
3286 jboolean JVM_RaiseSignal(jint sig)
3288 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3293 /* OS: JVM_FindSignal */
3295 jint JVM_FindSignal(const char *name)
3297 TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
3299 #if defined(__LINUX__)
3300 if (strcmp(name, "HUP") == 0)
3303 if (strcmp(name, "INT") == 0)
3306 if (strcmp(name, "TERM") == 0)
3309 # error not implemented for this OS
3317 * These are local overrides for various environment variables in Emacs.
3318 * Please do not remove this and leave it at the end of the file, where
3319 * Emacs will automagically detect them.
3320 * ---------------------------------------------------------------------
3323 * indent-tabs-mode: t