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>
47 #include <sys/types.h>
51 #include "mm/memory.h"
53 #include "native/jni.h"
54 #include "native/llni.h"
55 #include "native/native.h"
57 #include "native/include/java_lang_AssertionStatusDirectives.h"
58 #include "native/include/java_lang_String.h" /* required by j.l.CL */
59 #include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
60 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
61 #include "native/include/java_lang_StackTraceElement.h"
62 #include "native/include/java_lang_Throwable.h"
63 #include "native/include/java_security_ProtectionDomain.h"
64 #include "native/include/java_lang_Integer.h"
65 #include "native/include/java_lang_Long.h"
66 #include "native/include/java_lang_Short.h"
67 #include "native/include/java_lang_Byte.h"
68 #include "native/include/java_lang_Character.h"
69 #include "native/include/java_lang_Boolean.h"
70 #include "native/include/java_lang_Float.h"
71 #include "native/include/java_lang_Double.h"
73 #if defined(ENABLE_ANNOTATIONS)
74 #include "native/include/sun_reflect_ConstantPool.h"
77 #include "native/vm/java_lang_Class.h"
78 #include "native/vm/java_lang_ClassLoader.h"
79 #include "native/vm/java_lang_Runtime.h"
80 #include "native/vm/java_lang_Thread.h"
81 #include "native/vm/java_lang_reflect_Constructor.h"
82 #include "native/vm/java_lang_reflect_Method.h"
83 #include "native/vm/reflect.h"
85 #include "threads/lock-common.h"
86 #include "threads/threads-common.h"
88 #include "toolbox/logging.h"
89 #include "toolbox/list.h"
93 #if defined(ENABLE_ASSERTION)
94 #include "vm/assertion.h"
97 #include "vm/builtin.h"
98 #include "vm/exceptions.h"
99 #include "vm/global.h"
100 #include "vm/initialize.h"
101 #include "vm/package.h"
102 #include "vm/primitive.h"
103 #include "vm/properties.h"
104 #include "vm/resolve.h"
105 #include "vm/signallocal.h"
106 #include "vm/stringlocal.h"
109 #include "vm/jit/stacktrace.h"
111 #include "vmcore/classcache.h"
112 #include "vmcore/options.h"
113 #include "vmcore/system.h"
116 /* debugging macros ***********************************************************/
120 # define TRACEJVMCALLS(...) \
122 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
123 log_println(__VA_ARGS__); \
127 # define TRACEJVMCALLSVERBOSE(x) \
129 if (opt_TraceJVMCallsVerbose) { \
134 # define PRINTJVMWARNINGS(...)
136 /* if (opt_PrintJVMWarnings) { \ */
137 /* log_println(__VA_ARGS__); \ */
143 # define TRACEJVMCALLS(...)
144 # define TRACEJVMCALLSVERBOSE(x)
145 # define PRINTJVMWARNINGS(...)
151 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
152 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
153 /* and build number (xx) */
154 unsigned int update_version : 8; /* Update release version (uu) */
155 unsigned int special_update_version : 8; /* Special update release version (c) */
156 unsigned int reserved1 : 16;
157 unsigned int reserved2;
159 /* The following bits represents JVM supports that JDK has dependency on.
160 * JDK can use these bits to determine which JVM version
161 * and support it has to maintain runtime compatibility.
163 * When a new bit is added in a minor or update release, make sure
164 * the new bit is also added in the main/baseline.
166 unsigned int is_attachable : 1;
174 * A structure used to a capture exception table entry in a Java method.
181 } JVM_ExceptionTableEntryType;
184 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
186 if ((intptr_t) count <= 0)
189 return vsnprintf(str, count, fmt, args);
193 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
199 len = jio_vsnprintf(str, count, fmt, ap);
206 int jio_fprintf(FILE* f, const char *fmt, ...)
208 log_println("jio_fprintf: IMPLEMENT ME!");
212 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
214 log_println("jio_vfprintf: IMPLEMENT ME!");
218 int jio_printf(const char *fmt, ...)
220 log_println("jio_printf: IMPLEMENT ME!");
224 /* JVM_GetInterfaceVersion */
226 jint JVM_GetInterfaceVersion()
228 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
230 #define JVM_INTERFACE_VERSION 4
232 return JVM_INTERFACE_VERSION;
236 /* JVM_CurrentTimeMillis */
238 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
240 TRACEJVMCALLS("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored);
242 return (jlong) builtin_currenttimemillis();
248 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
250 TRACEJVMCALLS("JVM_NanoTime(env=%p, ignored=%p)", env, ignored);
252 return (jlong) builtin_nanotime();
258 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
263 s = (java_handle_t *) src;
264 d = (java_handle_t *) dst;
266 TRACEJVMCALLSVERBOSE(("JVM_ArrayCopy(env=%p, ignored=%p, src=%p, src_pos=%d, dst=%p, dst_pos=%d, length=%d)", env, ignored, src, src_pos, dst, dst_pos, length));
268 builtin_arraycopy(s, src_pos, d, dst_pos, length);
272 /* JVM_InitProperties */
274 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
278 TRACEJVMCALLS("JVM_InitProperties(env=%p, properties=%p)", env, properties);
280 h = (java_handle_t *) properties;
282 properties_system_add_all(h);
290 void JVM_Exit(jint code)
292 log_println("JVM_Exit: IMPLEMENT ME!");
298 void JVM_Halt(jint code)
300 TRACEJVMCALLS("JVM_Halt(code=%d)", code);
307 /* JVM_OnExit(void (*func)) */
309 void JVM_OnExit(void (*func)(void))
311 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
319 TRACEJVMCALLS("JVM_GC()");
325 /* JVM_MaxObjectInspectionAge */
327 jlong JVM_MaxObjectInspectionAge(void)
329 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
333 /* JVM_TraceInstructions */
335 void JVM_TraceInstructions(jboolean on)
337 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
341 /* JVM_TraceMethodCalls */
343 void JVM_TraceMethodCalls(jboolean on)
345 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
349 /* JVM_TotalMemory */
351 jlong JVM_TotalMemory(void)
353 TRACEJVMCALLS("JVM_TotalMemory()");
355 return gc_get_heap_size();
361 jlong JVM_FreeMemory(void)
363 TRACEJVMCALLS("JVM_FreeMemory()");
365 return gc_get_free_bytes();
371 jlong JVM_MaxMemory(void)
373 TRACEJVMCALLS("JVM_MaxMemory()");
375 return gc_get_max_heap_size();
379 /* JVM_ActiveProcessorCount */
381 jint JVM_ActiveProcessorCount(void)
383 TRACEJVMCALLS("JVM_ActiveProcessorCount()");
385 return system_processors_online();
389 /* JVM_FillInStackTrace */
391 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
393 java_lang_Throwable *o;
394 java_handle_bytearray_t *ba;
396 TRACEJVMCALLS("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver);
398 o = (java_lang_Throwable *) receiver;
400 ba = stacktrace_get();
405 LLNI_field_set_ref(o, backtrace, ba);
409 /* JVM_PrintStackTrace */
411 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
413 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
417 /* JVM_GetStackTraceDepth */
419 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
421 java_lang_Throwable *t;
422 java_handle_bytearray_t *ba;
426 TRACEJVMCALLS("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable);
428 if (throwable == NULL) {
429 exceptions_throw_nullpointerexception();
433 t = (java_lang_Throwable *) throwable;
435 LLNI_field_get_ref(t, backtrace, ba);
440 /* We need a critical section here as the stacktrace structure is
441 mapped onto a Java byte-array. */
445 st = (stacktrace_t *) LLNI_array_data(ba);
455 /* JVM_GetStackTraceElement */
457 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
459 java_lang_Throwable *t;
460 java_handle_bytearray_t *ba;
462 stacktrace_entry_t *ste;
466 java_lang_StackTraceElement *o;
467 java_lang_String *declaringclass;
468 java_lang_String *filename;
471 TRACEJVMCALLS("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index);
473 t = (java_lang_Throwable *) throwable;
475 LLNI_field_get_ref(t, backtrace, ba);
477 /* FIXME critical section */
479 st = (stacktrace_t *) LLNI_array_data(ba);
481 if ((index < 0) || (index >= st->length)) {
482 /* XXX This should be an IndexOutOfBoundsException (check this
485 exceptions_throw_arrayindexoutofboundsexception();
489 /* Get the stacktrace entry. */
491 ste = &(st->entries[index]);
493 /* Get the codeinfo, methodinfo and classinfo. */
499 /* allocate a new StackTraceElement */
501 o = (java_lang_StackTraceElement *)
502 builtin_new(class_java_lang_StackTraceElement);
509 if (!(m->flags & ACC_NATIVE)) {
510 if (c->sourcefile != NULL)
511 filename = (java_lang_String *) javastring_new(c->sourcefile);
518 /* get line number */
520 if (m->flags & ACC_NATIVE) {
524 /* FIXME The linenumbertable_linenumber_for_pc could change
525 the methodinfo pointer when hitting an inlined method. */
527 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
528 linenumber = (linenumber == 0) ? -1 : linenumber;
531 /* get declaring class name */
533 declaringclass = _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(c));
535 /* fill the java.lang.StackTraceElement element */
537 /* FIXME critical section */
539 o->declaringClass = declaringclass;
540 o->methodName = (java_lang_String *) javastring_new(m->name);
541 o->fileName = filename;
542 o->lineNumber = linenumber;
550 jint JVM_IHashCode(JNIEnv* env, jobject handle)
552 TRACEJVMCALLS("JVM_IHashCode(env=%p, jobject=%p)", env, handle);
554 return (jint) ((ptrint) handle);
558 /* JVM_MonitorWait */
560 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
562 #if defined(ENABLE_THREADS)
566 TRACEJVMCALLS("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms);
568 /* exceptions_throw_illegalargumentexception("argument out of range"); */
569 exceptions_throw_illegalargumentexception();
573 #if defined(ENABLE_THREADS)
574 o = (java_handle_t *) handle;
576 lock_wait_for_object(o, ms, 0);
581 /* JVM_MonitorNotify */
583 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
585 #if defined(ENABLE_THREADS)
589 TRACEJVMCALLS("JVM_MonitorNotify(env=%p, handle=%p)", env, handle);
591 #if defined(ENABLE_THREADS)
592 o = (java_handle_t *) handle;
594 lock_notify_object(o);
599 /* JVM_MonitorNotifyAll */
601 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
603 #if defined(ENABLE_THREADS)
607 TRACEJVMCALLS("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle);
609 #if defined(ENABLE_THREADS)
610 o = (java_handle_t *) handle;
612 lock_notify_all_object(o);
619 jobject JVM_Clone(JNIEnv* env, jobject handle)
621 TRACEJVMCALLS("JVM_Clone(env=%p, handle=%p)", env, handle);
623 return (jobject) builtin_clone(env, (java_handle_t *) handle);
627 /* JVM_InitializeCompiler */
629 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
631 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
635 /* JVM_IsSilentCompiler */
637 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
639 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
643 /* JVM_CompileClass */
645 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
647 log_println("JVM_CompileClass: IMPLEMENT ME!");
651 /* JVM_CompileClasses */
653 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
655 log_println("JVM_CompileClasses: IMPLEMENT ME!");
659 /* JVM_CompilerCommand */
661 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
663 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
667 /* JVM_EnableCompiler */
669 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
671 TRACEJVMCALLS("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls);
672 PRINTJVMWARNINGS("JVM_EnableCompiler not supported");
676 /* JVM_DisableCompiler */
678 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
680 TRACEJVMCALLS("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls);
681 PRINTJVMWARNINGS("JVM_DisableCompiler not supported");
685 /* JVM_GetLastErrorString */
687 jint JVM_GetLastErrorString(char *buf, int len)
713 char *JVM_NativePath(char *path)
715 TRACEJVMCALLS("JVM_NativePath(path=%s)", path);
717 /* XXX is this correct? */
723 /* JVM_GetCallerClass */
725 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
727 java_handle_objectarray_t *oa;
729 TRACEJVMCALLS("JVM_GetCallerClass(env=%p, depth=%d)", env, depth);
731 oa = stacktrace_getClassContext();
736 if (oa->header.size < depth)
739 return (jclass) oa->data[depth - 1];
744 /* JVM_FindPrimitiveClass */
746 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
751 TRACEJVMCALLS("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s);
754 c = primitive_class_get_by_name(u);
756 return (jclass) LLNI_classinfo_wrap(c);
760 /* JVM_ResolveClass */
762 void JVM_ResolveClass(JNIEnv* env, jclass cls)
764 TRACEJVMCALLS("JVM_ResolveClass(env=%p, cls=%p)", env, cls);
765 PRINTJVMWARNINGS("JVM_ResolveClass not implemented");
769 /* JVM_FindClassFromClassLoader */
771 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
777 TRACEJVMCALLS("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError);
779 u = utf_new_char(name);
780 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
782 c = load_class_from_classloader(u, cl);
788 if (!(c->state & CLASS_INITIALIZED))
789 if (!initialize_class(c))
792 return (jclass) LLNI_classinfo_wrap(c);
796 /* JVM_FindClassFromClass */
798 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
800 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
804 /* JVM_DefineClass */
806 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
808 log_println("JVM_DefineClass: IMPLEMENT ME!");
812 /* JVM_DefineClassWithSource */
814 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
820 TRACEJVMCALLS("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source);
823 u = utf_new_char(name);
827 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
829 /* XXX do something with source */
831 c = class_define(u, cl, len, (const uint8_t *) buf, (java_handle_t *) pd);
833 return (jclass) LLNI_classinfo_wrap(c);
837 /* JVM_FindLoadedClass */
839 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
845 TRACEJVMCALLS("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name);
847 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
849 u = javastring_toutf((java_handle_t *) name, true);
850 c = classcache_lookup(cl, u);
852 return (jclass) LLNI_classinfo_wrap(c);
856 /* JVM_GetClassName */
858 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
860 TRACEJVMCALLS("JVM_GetClassName(env=%p, cls=%p)", env, cls);
862 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
866 /* JVM_GetClassInterfaces */
868 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
871 java_handle_objectarray_t *oa;
873 TRACEJVMCALLS("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls);
875 c = LLNI_classinfo_unwrap(cls);
877 oa = class_get_interfaces(c);
879 return (jobjectArray) oa;
883 /* JVM_GetClassLoader */
885 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
890 TRACEJVMCALLS("JVM_GetClassLoader(env=%p, cls=%p)", env, cls);
892 c = LLNI_classinfo_unwrap(cls);
893 cl = class_get_classloader(c);
899 /* JVM_IsInterface */
901 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
905 TRACEJVMCALLS("JVM_IsInterface(env=%p, cls=%p)", env, cls);
907 c = LLNI_classinfo_unwrap(cls);
909 return class_is_interface(c);
913 /* JVM_GetClassSigners */
915 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
917 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
921 /* JVM_SetClassSigners */
923 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
926 java_handle_objectarray_t *hoa;
928 TRACEJVMCALLS("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers);
930 c = LLNI_classinfo_unwrap(cls);
932 hoa = (java_handle_objectarray_t *) signers;
934 /* This call is ignored for primitive types and arrays. Signers
935 are only set once, ClassLoader.java, and thus shouldn't be
936 called with an array. Only the bootstrap loader creates
939 if (class_is_primitive(c) || class_is_array(c))
942 LLNI_classinfo_field_set(c, signers, hoa);
946 /* JVM_GetProtectionDomain */
948 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
952 TRACEJVMCALLS("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls);
954 c = LLNI_classinfo_unwrap(cls);
957 exceptions_throw_nullpointerexception();
961 /* Primitive types do not have a protection domain. */
963 if (class_is_primitive(c))
966 return (jobject) c->protectiondomain;
970 /* JVM_SetProtectionDomain */
972 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
974 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
978 /* JVM_DoPrivileged */
980 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
985 java_handle_t *result;
988 TRACEJVMCALLS("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException);
990 o = (java_handle_t *) action;
993 if (action == NULL) {
994 exceptions_throw_nullpointerexception();
998 /* lookup run() method (throw no exceptions) */
1000 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1003 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1004 exceptions_throw_internalerror("No run method");
1008 /* XXX It seems something with a privileged stack needs to be done
1011 result = vm_call_method(m, o);
1013 e = exceptions_get_and_clear_exception();
1016 exceptions_throw_privilegedactionexception(e);
1020 return (jobject) result;
1024 /* JVM_GetInheritedAccessControlContext */
1026 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1028 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1032 /* JVM_GetStackAccessControlContext */
1034 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1036 TRACEJVMCALLS("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls);
1038 /* XXX All stuff I tested so far works without that function. At
1039 some point we have to implement it, but I disable the output
1040 for now to make IcedTea happy. */
1046 /* JVM_IsArrayClass */
1048 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1052 TRACEJVMCALLS("JVM_IsArrayClass(env=%p, cls=%p)", env, cls);
1054 c = LLNI_classinfo_unwrap(cls);
1056 return class_is_array(c);
1060 /* JVM_IsPrimitiveClass */
1062 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1066 TRACEJVMCALLS("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls);
1068 c = LLNI_classinfo_unwrap(cls);
1070 return class_is_primitive(c);
1074 /* JVM_GetComponentType */
1076 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1078 classinfo *component;
1081 TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
1083 c = LLNI_classinfo_unwrap(cls);
1085 component = class_get_componenttype(c);
1087 return (jclass) LLNI_classinfo_wrap(component);
1091 /* JVM_GetClassModifiers */
1093 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1098 TRACEJVMCALLS("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls);
1100 c = LLNI_classinfo_unwrap(cls);
1102 flags = class_get_modifiers(c, false);
1108 /* JVM_GetDeclaredClasses */
1110 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1113 java_handle_objectarray_t *oa;
1115 TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
1117 c = LLNI_classinfo_unwrap(ofClass);
1119 oa = class_get_declaredclasses(c, false);
1121 return (jobjectArray) oa;
1125 /* JVM_GetDeclaringClass */
1127 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1132 TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
1134 c = LLNI_classinfo_unwrap(ofClass);
1136 dc = class_get_declaringclass(c);
1138 return (jclass) LLNI_classinfo_wrap(dc);
1142 /* JVM_GetClassSignature */
1144 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1150 TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
1152 c = LLNI_classinfo_unwrap(cls);
1154 /* Get the signature of the class. */
1156 u = class_get_signature(c);
1161 /* Convert UTF-string to a Java-string. */
1163 s = javastring_new(u);
1169 /* JVM_GetClassAnnotations */
1171 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1173 classinfo *c = NULL; /* classinfo for 'cls' */
1174 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1176 TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
1179 exceptions_throw_nullpointerexception();
1183 c = LLNI_classinfo_unwrap(cls);
1185 /* get annotations: */
1186 annotations = class_get_annotations(c);
1188 return (jbyteArray)annotations;
1192 /* JVM_GetFieldAnnotations */
1194 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1196 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1197 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1199 TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
1201 if (field == NULL) {
1202 exceptions_throw_nullpointerexception();
1206 rf = (java_lang_reflect_Field*)field;
1208 LLNI_field_get_ref(rf, annotations, ba);
1210 return (jbyteArray)ba;
1214 /* JVM_GetMethodAnnotations */
1216 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1218 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1219 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1221 TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
1223 if (method == NULL) {
1224 exceptions_throw_nullpointerexception();
1228 rm = (java_lang_reflect_Method*)method;
1230 LLNI_field_get_ref(rm, annotations, ba);
1232 return (jbyteArray)ba;
1236 /* JVM_GetMethodDefaultAnnotationValue */
1238 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1240 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1241 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1243 TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
1245 if (method == NULL) {
1246 exceptions_throw_nullpointerexception();
1250 rm = (java_lang_reflect_Method*)method;
1252 LLNI_field_get_ref(rm, annotationDefault, ba);
1254 return (jbyteArray)ba;
1258 /* JVM_GetMethodParameterAnnotations */
1260 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1262 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1263 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1265 TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
1267 if (method == NULL) {
1268 exceptions_throw_nullpointerexception();
1272 rm = (java_lang_reflect_Method*)method;
1274 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1276 return (jbyteArray)ba;
1280 /* JVM_GetClassDeclaredFields */
1282 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1284 TRACEJVMCALLS("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly);
1286 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1290 /* JVM_GetClassDeclaredMethods */
1292 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1294 TRACEJVMCALLS("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly);
1296 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1300 /* JVM_GetClassDeclaredConstructors */
1302 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1304 TRACEJVMCALLS("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly);
1306 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1310 /* JVM_GetClassAccessFlags */
1312 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1316 TRACEJVMCALLS("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls);
1318 c = LLNI_classinfo_unwrap(cls);
1320 /* Primitive type classes have the correct access flags. */
1322 return c->flags & ACC_CLASS_REFLECT_MASK;
1326 /* JVM_GetClassConstantPool */
1328 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1330 #if defined(ENABLE_ANNOTATIONS)
1331 sun_reflect_ConstantPool *constantPool = NULL;
1332 /* constant pool object for the class refered by 'cls' */
1333 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1334 /* constantPoolOop field of the constant pool object */
1336 TRACEJVMCALLS("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls);
1339 (sun_reflect_ConstantPool*)native_new_and_init(
1340 class_sun_reflect_ConstantPool);
1342 if (constantPool == NULL) {
1347 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1349 return (jobject)constantPool;
1351 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1357 /* JVM_ConstantPoolGetSize */
1359 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1361 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1363 TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
1365 c = LLNI_classinfo_unwrap(jcpool);
1371 /* JVM_ConstantPoolGetClassAt */
1373 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1375 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1376 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1377 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1379 TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
1381 c = LLNI_classinfo_unwrap(jcpool);
1383 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1386 exceptions_throw_illegalargumentexception();
1390 result = resolve_classref_eager(ref);
1392 return (jclass) LLNI_classinfo_wrap(result);
1396 /* JVM_ConstantPoolGetClassAtIfLoaded */
1398 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1400 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1401 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1402 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1404 TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
1406 c = LLNI_classinfo_unwrap(jcpool);
1408 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1411 exceptions_throw_illegalargumentexception();
1415 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1419 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1423 return (jclass) LLNI_classinfo_wrap(result);
1427 /* JVM_ConstantPoolGetMethodAt */
1429 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1431 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1432 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1434 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
1436 cls = LLNI_classinfo_unwrap(jcpool);
1437 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1440 exceptions_throw_illegalargumentexception();
1444 /* XXX: is that right? or do I have to use resolve_method_*? */
1445 return (jobject)reflect_method_new(ref->p.method);
1449 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1451 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1453 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1454 classinfo *c = NULL; /* resolved declaring class of the method */
1455 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1457 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1459 cls = LLNI_classinfo_unwrap(jcpool);
1460 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1463 exceptions_throw_illegalargumentexception();
1467 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1471 if (c == NULL || !(c->state & CLASS_LOADED)) {
1475 return (jobject)reflect_method_new(ref->p.method);
1479 /* JVM_ConstantPoolGetFieldAt */
1481 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1483 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1484 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1486 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
1488 cls = LLNI_classinfo_unwrap(jcpool);
1489 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1492 exceptions_throw_illegalargumentexception();
1496 return (jobject)reflect_field_new(ref->p.field);
1500 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1502 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1504 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1505 classinfo *c; /* resolved declaring class for the field */
1506 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1508 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1510 cls = LLNI_classinfo_unwrap(jcpool);
1511 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1514 exceptions_throw_illegalargumentexception();
1518 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1522 if (c == NULL || !(c->state & CLASS_LOADED)) {
1526 return (jobject)reflect_field_new(ref->p.field);
1530 /* JVM_ConstantPoolGetMemberRefInfoAt */
1532 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1534 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1536 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1542 /* JVM_ConstantPoolGetIntAt */
1544 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1546 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1547 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1549 TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
1551 cls = LLNI_classinfo_unwrap(jcpool);
1552 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1555 exceptions_throw_illegalargumentexception();
1563 /* JVM_ConstantPoolGetLongAt */
1565 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1567 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1568 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1570 TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
1572 cls = LLNI_classinfo_unwrap(jcpool);
1573 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1576 exceptions_throw_illegalargumentexception();
1584 /* JVM_ConstantPoolGetFloatAt */
1586 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1588 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1589 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1591 TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
1593 cls = LLNI_classinfo_unwrap(jcpool);
1594 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1597 exceptions_throw_illegalargumentexception();
1605 /* JVM_ConstantPoolGetDoubleAt */
1607 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1609 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1610 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1612 TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
1614 cls = LLNI_classinfo_unwrap(jcpool);
1615 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1618 exceptions_throw_illegalargumentexception();
1626 /* JVM_ConstantPoolGetStringAt */
1628 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1630 utf *ref; /* utf object for the string in constant pool at index 'index' */
1631 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1633 TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
1635 cls = LLNI_classinfo_unwrap(jcpool);
1636 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1639 exceptions_throw_illegalargumentexception();
1643 /* XXX: I hope literalstring_new is the right Function. */
1644 return (jstring)literalstring_new(ref);
1648 /* JVM_ConstantPoolGetUTF8At */
1650 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1652 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1653 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1655 TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
1657 cls = LLNI_classinfo_unwrap(jcpool);
1658 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1661 exceptions_throw_illegalargumentexception();
1665 /* XXX: I hope literalstring_new is the right Function. */
1666 return (jstring)literalstring_new(ref);
1670 /* JVM_DesiredAssertionStatus */
1672 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1674 #if defined(ENABLE_ASSERTION)
1675 assertion_name_t *item;
1680 TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
1682 c = LLNI_classinfo_unwrap(cls);
1684 if (c->classloader == NULL) {
1685 status = (jboolean)assertion_system_enabled;
1688 status = (jboolean)assertion_user_enabled;
1691 if (list_assertion_names != NULL) {
1692 item = (assertion_name_t *)list_first(list_assertion_names);
1693 while (item != NULL) {
1694 name = utf_new_char(item->name);
1695 if (name == c->packagename) {
1696 status = (jboolean)item->enabled;
1698 else if (name == c->name) {
1699 status = (jboolean)item->enabled;
1702 item = (assertion_name_t *)list_next(list_assertion_names, item);
1708 return (jboolean)false;
1713 /* JVM_AssertionStatusDirectives */
1715 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1718 java_lang_AssertionStatusDirectives *o;
1719 java_handle_objectarray_t *classes;
1720 java_handle_objectarray_t *packages;
1721 java_booleanarray_t *classEnabled;
1722 java_booleanarray_t *packageEnabled;
1723 #if defined(ENABLE_ASSERTION)
1724 assertion_name_t *item;
1729 TRACEJVMCALLS("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused);
1731 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1736 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1741 #if defined(ENABLE_ASSERTION)
1742 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1744 classes = builtin_anewarray(0, class_java_lang_Object);
1746 if (classes == NULL)
1749 #if defined(ENABLE_ASSERTION)
1750 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1752 packages = builtin_anewarray(0, class_java_lang_Object);
1754 if (packages == NULL)
1757 #if defined(ENABLE_ASSERTION)
1758 classEnabled = builtin_newarray_boolean(assertion_class_count);
1760 classEnabled = builtin_newarray_boolean(0);
1762 if (classEnabled == NULL)
1765 #if defined(ENABLE_ASSERTION)
1766 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1768 packageEnabled = builtin_newarray_boolean(0);
1770 if (packageEnabled == NULL)
1773 #if defined(ENABLE_ASSERTION)
1774 /* initialize arrays */
1776 if (list_assertion_names != NULL) {
1780 item = (assertion_name_t *)list_first(list_assertion_names);
1781 while (item != NULL) {
1782 js = javastring_new_from_ascii(item->name);
1787 if (item->package == false) {
1788 classes->data[i] = js;
1789 classEnabled->data[i] = (jboolean) item->enabled;
1793 packages->data[j] = js;
1794 packageEnabled->data[j] = (jboolean) item->enabled;
1798 item = (assertion_name_t *)list_next(list_assertion_names, item);
1803 /* set instance fields */
1805 o->classes = classes;
1806 o->packages = packages;
1807 o->classEnabled = classEnabled;
1808 o->packageEnabled = packageEnabled;
1814 /* JVM_GetClassNameUTF */
1816 const char* JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1818 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1822 /* JVM_GetClassCPTypes */
1824 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1826 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1830 /* JVM_GetClassCPEntriesCount */
1832 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1834 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1838 /* JVM_GetClassFieldsCount */
1840 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1842 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1846 /* JVM_GetClassMethodsCount */
1848 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1850 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1854 /* JVM_GetMethodIxExceptionIndexes */
1856 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1858 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1862 /* JVM_GetMethodIxExceptionsCount */
1864 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1866 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1870 /* JVM_GetMethodIxByteCode */
1872 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1874 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1878 /* JVM_GetMethodIxByteCodeLength */
1880 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1882 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1886 /* JVM_GetMethodIxExceptionTableEntry */
1888 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1890 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1894 /* JVM_GetMethodIxExceptionTableLength */
1896 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1898 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1902 /* JVM_GetMethodIxModifiers */
1904 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1906 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1910 /* JVM_GetFieldIxModifiers */
1912 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1914 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1918 /* JVM_GetMethodIxLocalsCount */
1920 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1922 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1926 /* JVM_GetMethodIxArgsSize */
1928 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1930 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1934 /* JVM_GetMethodIxMaxStack */
1936 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1938 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1942 /* JVM_IsConstructorIx */
1944 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1946 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1950 /* JVM_GetMethodIxNameUTF */
1952 const char* JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1954 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1958 /* JVM_GetMethodIxSignatureUTF */
1960 const char* JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1962 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1966 /* JVM_GetCPFieldNameUTF */
1968 const char* JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1970 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1974 /* JVM_GetCPMethodNameUTF */
1976 const char* JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1978 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1982 /* JVM_GetCPMethodSignatureUTF */
1984 const char* JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1986 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1990 /* JVM_GetCPFieldSignatureUTF */
1992 const char* JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1994 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1998 /* JVM_GetCPClassNameUTF */
2000 const char* JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2002 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2006 /* JVM_GetCPFieldClassNameUTF */
2008 const char* JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2010 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2014 /* JVM_GetCPMethodClassNameUTF */
2016 const char* JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2018 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2022 /* JVM_GetCPFieldModifiers */
2024 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2026 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2030 /* JVM_GetCPMethodModifiers */
2032 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2034 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2038 /* JVM_ReleaseUTF */
2040 void JVM_ReleaseUTF(const char *utf)
2042 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2046 /* JVM_IsSameClassPackage */
2048 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2050 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2056 jint JVM_Open(const char *fname, jint flags, jint mode)
2060 TRACEJVMCALLS("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode);
2062 result = system_open(fname, flags, mode);
2070 /* XXX don't know what to do here */
2071 /* return JVM_EEXIST; */
2082 jint JVM_Close(jint fd)
2084 TRACEJVMCALLS("JVM_Close(fd=%d)", fd);
2086 return system_close(fd);
2092 jint JVM_Read(jint fd, char *buf, jint nbytes)
2094 TRACEJVMCALLS("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes);
2096 return system_read(fd, buf, nbytes);
2102 jint JVM_Write(jint fd, char *buf, jint nbytes)
2104 TRACEJVMCALLS("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes);
2106 return system_write(fd, buf, nbytes);
2112 jint JVM_Available(jint fd, jlong *pbytes)
2114 #if defined(FIONREAD)
2118 TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
2122 result = ioctl(fd, FIONREAD, &bytes);
2131 # error FIONREAD not defined
2138 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2140 TRACEJVMCALLS("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence);
2142 return (jlong) lseek(fd, (off_t) offset, whence);
2148 jint JVM_SetLength(jint fd, jlong length)
2150 TRACEJVMCALLS("JVM_SetLength(fd=%d, length=%ld)", length);
2152 return ftruncate(fd, length);
2158 jint JVM_Sync(jint fd)
2160 TRACEJVMCALLS("JVM_Sync(fd=%d)", fd);
2166 /* JVM_StartThread */
2168 void JVM_StartThread(JNIEnv* env, jobject jthread)
2170 TRACEJVMCALLS("JVM_StartThread(env=%p, jthread=%p)", env, jthread);
2172 _Jv_java_lang_Thread_start((java_lang_Thread *) jthread, 0);
2176 /* JVM_StopThread */
2178 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2180 log_println("JVM_StopThread: IMPLEMENT ME!");
2184 /* JVM_IsThreadAlive */
2186 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2192 TRACEJVMCALLS("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread);
2194 /* XXX this is just a quick hack */
2196 for (t = threads_list_first(); t != NULL; t = threads_list_next(t)) {
2197 LLNI_equals(t->object, jthread, equal);
2203 /* The threadobject is null when a thread is created in Java. The
2204 priority is set later during startup. */
2209 result = threads_thread_is_alive(t);
2215 /* JVM_SuspendThread */
2217 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2219 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2223 /* JVM_ResumeThread */
2225 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2227 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2231 /* JVM_SetThreadPriority */
2233 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2235 TRACEJVMCALLS("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio);
2237 _Jv_java_lang_Thread_setPriority((java_lang_Thread *) jthread, prio);
2243 void JVM_Yield(JNIEnv *env, jclass threadClass)
2245 TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
2253 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2255 TRACEJVMCALLS("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis);
2257 _Jv_java_lang_Thread_sleep(millis);
2261 /* JVM_CurrentThread */
2263 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2265 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2267 return (jobject) _Jv_java_lang_Thread_currentThread();
2271 /* JVM_CountStackFrames */
2273 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2275 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2281 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2283 log_println("JVM_Interrupt: IMPLEMENT ME!");
2287 /* JVM_IsInterrupted */
2289 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2291 TRACEJVMCALLS("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted);
2293 /* XXX do something with clear_interrupted */
2295 return _Jv_java_lang_Thread_isInterrupted((java_lang_Thread *) jthread);
2301 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2306 TRACEJVMCALLS("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj);
2308 h = (java_handle_t *) obj;
2311 exceptions_throw_nullpointerexception();
2315 result = lock_is_held_by_current_thread(h);
2321 /* JVM_DumpAllStacks */
2323 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2325 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2329 /* JVM_CurrentLoadedClass */
2331 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2333 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2337 /* JVM_CurrentClassLoader */
2339 jobject JVM_CurrentClassLoader(JNIEnv *env)
2341 /* XXX if a method in a class in a trusted loader is in a
2342 doPrivileged, return NULL */
2344 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2348 /* JVM_GetClassContext */
2350 jobjectArray JVM_GetClassContext(JNIEnv *env)
2352 TRACEJVMCALLS("JVM_GetClassContext(env=%p)", env);
2354 return (jobjectArray) stacktrace_getClassContext();
2358 /* JVM_ClassDepth */
2360 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2362 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2366 /* JVM_ClassLoaderDepth */
2368 jint JVM_ClassLoaderDepth(JNIEnv *env)
2370 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2374 /* JVM_GetSystemPackage */
2376 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2382 TRACEJVMCALLS("JVM_GetSystemPackage(env=%p, name=%p)", env, name);
2384 /* s = package_find(name); */
2385 u = javastring_toutf(name, false);
2386 result = package_find(u);
2388 s = javastring_new(result);
2396 /* JVM_GetSystemPackages */
2398 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2400 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2404 /* JVM_AllocateNewObject */
2406 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2408 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2412 /* JVM_AllocateNewArray */
2414 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2416 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2420 /* JVM_LatestUserDefinedLoader */
2422 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2426 TRACEJVMCALLS("JVM_LatestUserDefinedLoader(env=%p)", env);
2428 cl = stacktrace_first_nonnull_classloader();
2430 return (jobject) cl;
2434 /* JVM_LoadClass0 */
2436 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2438 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2442 /* JVM_GetArrayLength */
2444 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2448 TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
2450 a = (java_handle_t *) arr;
2452 return array_length_get(a);
2456 /* JVM_GetArrayElement */
2458 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2463 TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
2465 a = (java_handle_t *) arr;
2467 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2468 /* exceptions_throw_illegalargumentexception(); */
2472 o = array_element_get(a, index);
2478 /* JVM_GetPrimitiveArrayElement */
2480 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2482 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2486 /* JVM_SetArrayElement */
2488 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2491 java_handle_t *value;
2493 TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
2495 a = (java_handle_t *) arr;
2496 value = (java_handle_t *) val;
2498 array_element_set(a, index, value);
2502 /* JVM_SetPrimitiveArrayElement */
2504 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2506 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2512 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2517 java_handle_objectarray_t *oa;
2519 TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
2521 if (eltClass == NULL) {
2522 exceptions_throw_nullpointerexception();
2526 /* NegativeArraySizeException is checked in builtin_newarray. */
2528 c = LLNI_classinfo_unwrap(eltClass);
2530 /* create primitive or object array */
2532 if (class_is_primitive(c)) {
2533 pc = primitive_arrayclass_get_by_name(c->name);
2534 a = builtin_newarray(length, pc);
2539 oa = builtin_anewarray(length, c);
2541 return (jobject) oa;
2546 /* JVM_NewMultiArray */
2548 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2551 java_handle_intarray_t *ia;
2557 java_handle_objectarray_t *a;
2559 TRACEJVMCALLS("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim);
2561 if (eltClass == NULL) {
2562 exceptions_throw_nullpointerexception();
2566 /* NegativeArraySizeException is checked in builtin_newarray. */
2568 c = LLNI_classinfo_unwrap(eltClass);
2570 /* XXX This is just a quick hack to get it working. */
2572 ia = (java_handle_intarray_t *) dim;
2574 length = array_length_get(ia);
2576 dims = MNEW(long, length);
2578 for (i = 0; i < length; i++) {
2579 value = LLNI_array_direct(ia, i);
2580 dims[i] = (long) value;
2583 /* Create an array-class if necessary. */
2585 if (class_is_primitive(c))
2586 ac = primitive_arrayclass_get_by_name(c->name);
2588 ac = class_array_of(c, true);
2593 a = builtin_multianewarray(length, ac, dims);
2599 /* JVM_InitializeSocketLibrary */
2601 jint JVM_InitializeSocketLibrary()
2603 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2609 jint JVM_Socket(jint domain, jint type, jint protocol)
2611 TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
2613 return socket(domain, type, protocol);
2617 /* JVM_SocketClose */
2619 jint JVM_SocketClose(jint fd)
2621 TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
2627 /* JVM_SocketShutdown */
2629 jint JVM_SocketShutdown(jint fd, jint howto)
2631 TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
2633 return shutdown(fd, howto);
2639 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2641 log_println("JVM_Recv: IMPLEMENT ME!");
2647 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2649 log_println("JVM_Send: IMPLEMENT ME!");
2655 jint JVM_Timeout(int fd, long timeout)
2657 log_println("JVM_Timeout: IMPLEMENT ME!");
2663 jint JVM_Listen(jint fd, jint count)
2665 TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
2667 return listen(fd, count);
2673 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2675 TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
2677 return connect(fd, him, len);
2683 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2685 log_println("JVM_Bind: IMPLEMENT ME!");
2691 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2693 TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
2695 return accept(fd, him, (socklen_t *) len);
2701 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2703 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2707 /* JVM_GetSockName */
2709 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2711 TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
2713 return getsockname(fd, him, (socklen_t *) len);
2719 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2721 log_println("JVM_SendTo: IMPLEMENT ME!");
2725 /* JVM_SocketAvailable */
2727 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2729 #if defined(FIONREAD)
2733 TRACEJVMCALLS("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes);
2737 result = ioctl(fd, FIONREAD, &bytes);
2746 # error FIONREAD not defined
2751 /* JVM_GetSockOpt */
2753 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2755 #if defined(HAVE_GETSOCKOPT)
2756 TRACEJVMCALLS("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen);
2758 return getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2760 # error getsockopt not available
2765 /* JVM_SetSockOpt */
2767 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2769 #if defined(HAVE_SETSOCKOPT)
2770 TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
2772 return setsockopt(fd, level, optname, optval, optlen);
2774 # error setsockopt not available
2779 /* JVM_GetHostName */
2781 int JVM_GetHostName(char* name, int namelen)
2783 TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
2785 return gethostname(name, namelen);
2789 /* JVM_GetHostByAddr */
2791 struct hostent* JVM_GetHostByAddr(const char* name, int len, int type)
2793 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2797 /* JVM_GetHostByName */
2799 struct hostent* JVM_GetHostByName(char* name)
2801 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2805 /* JVM_GetProtoByName */
2807 struct protoent* JVM_GetProtoByName(char* name)
2809 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2813 /* JVM_LoadLibrary */
2815 void *JVM_LoadLibrary(const char *name)
2819 TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
2821 u = utf_new_char(name);
2823 return native_library_open(u);
2827 /* JVM_UnloadLibrary */
2829 void JVM_UnloadLibrary(void* handle)
2831 TRACEJVMCALLS("JVM_UnloadLibrary(handle=%p)", handle);
2833 native_library_close(handle);
2837 /* JVM_FindLibraryEntry */
2839 void *JVM_FindLibraryEntry(void *handle, const char *name)
2843 TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
2845 symbol = lt_dlsym(handle, name);
2853 jboolean JVM_IsNaN(jdouble a)
2855 log_println("JVM_IsNaN: IMPLEMENT ME!");
2859 /* JVM_IsSupportedJNIVersion */
2861 jboolean JVM_IsSupportedJNIVersion(jint version)
2863 TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
2865 return jni_version_check(version);
2869 /* JVM_InternString */
2871 jstring JVM_InternString(JNIEnv *env, jstring str)
2873 TRACEJVMCALLS("JVM_InternString(env=%p, str=%p)", env, str);
2875 return (jstring) javastring_intern((java_handle_t *) str);
2879 /* JVM_RawMonitorCreate */
2881 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2885 TRACEJVMCALLS("JVM_RawMonitorCreate()");
2887 o = NEW(java_object_t);
2889 lock_init_object_lock(o);
2895 /* JVM_RawMonitorDestroy */
2897 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
2899 TRACEJVMCALLSlog_println("JVM_RawMonitorDestroy(mon=%p)", mon);
2901 FREE(mon, java_object_t);
2905 /* JVM_RawMonitorEnter */
2907 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
2909 TRACEJVMCALLS("JVM_RawMonitorEnter(mon=%p)", mon);
2911 (void) lock_monitor_enter((java_object_t *) mon);
2917 /* JVM_RawMonitorExit */
2919 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
2921 TRACEJVMCALLS("JVM_RawMonitorExit(mon=%p)", mon);
2923 (void) lock_monitor_exit((java_object_t *) mon);
2927 /* JVM_SetPrimitiveFieldValues */
2929 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2931 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
2935 /* JVM_GetPrimitiveFieldValues */
2937 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2939 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
2943 /* JVM_AccessVMBooleanFlag */
2945 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
2947 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
2951 /* JVM_AccessVMIntFlag */
2953 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
2955 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
2959 /* JVM_VMBreakPoint */
2961 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
2963 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
2967 /* JVM_GetClassFields */
2969 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
2971 log_println("JVM_GetClassFields: IMPLEMENT ME!");
2975 /* JVM_GetClassMethods */
2977 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
2979 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
2983 /* JVM_GetClassConstructors */
2985 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
2987 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
2991 /* JVM_GetClassField */
2993 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
2995 log_println("JVM_GetClassField: IMPLEMENT ME!");
2999 /* JVM_GetClassMethod */
3001 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3003 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3007 /* JVM_GetClassConstructor */
3009 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3011 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3015 /* JVM_NewInstance */
3017 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3019 log_println("JVM_NewInstance: IMPLEMENT ME!");
3025 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3027 log_println("JVM_GetField: IMPLEMENT ME!");
3031 /* JVM_GetPrimitiveField */
3033 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3035 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3041 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3043 log_println("JVM_SetField: IMPLEMENT ME!");
3047 /* JVM_SetPrimitiveField */
3049 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3051 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3055 /* JVM_InvokeMethod */
3057 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3059 TRACEJVMCALLS("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0);
3061 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
3065 /* JVM_NewInstanceFromConstructor */
3067 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
3069 TRACEJVMCALLS("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, c, args0);
3071 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
3075 /* JVM_SupportsCX8 */
3077 jboolean JVM_SupportsCX8()
3079 TRACEJVMCALLS("JVM_SupportsCX8()");
3089 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3091 log_println("JVM_CX8Field: IMPLEMENT ME!");
3095 /* JVM_GetAllThreads */
3097 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3099 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3103 /* JVM_DumpThreads */
3105 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3107 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3111 /* JVM_GetManagement */
3113 void *JVM_GetManagement(jint version)
3115 TRACEJVMCALLS("JVM_GetManagement(version=%d)", version);
3117 /* TODO We current don't support the management interface. */
3123 /* JVM_InitAgentProperties */
3125 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3127 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3131 /* JVM_GetEnclosingMethodInfo */
3133 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3137 java_handle_objectarray_t *oa;
3139 TRACEJVMCALLS("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass);
3141 c = LLNI_classinfo_unwrap(ofClass);
3143 if ((c == NULL) || class_is_primitive(c))
3146 m = class_get_enclosingmethod(c);
3151 oa = builtin_anewarray(3, class_java_lang_Object);
3156 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->class));
3157 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3158 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3160 return (jobjectArray) oa;
3164 /* JVM_GetThreadStateValues */
3166 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3168 java_handle_intarray_t *ia;
3170 TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3171 env, javaThreadState);
3173 /* If new thread states are added in future JDK and VM versions,
3174 this should check if the JDK version is compatible with thread
3175 states supported by the VM. Return NULL if not compatible.
3177 This function must map the VM java_lang_Thread::ThreadStatus
3178 to the Java thread state that the JDK supports. */
3180 switch (javaThreadState) {
3181 case THREAD_STATE_NEW:
3182 ia = builtin_newarray_int(1);
3187 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3190 case THREAD_STATE_RUNNABLE:
3191 ia = builtin_newarray_int(1);
3196 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3199 case THREAD_STATE_BLOCKED:
3200 ia = builtin_newarray_int(1);
3205 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3208 case THREAD_STATE_WAITING:
3209 ia = builtin_newarray_int(2);
3214 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3215 /* XXX Implement parked stuff. */
3216 /* array_intarray_element_set(ia, 1, PARKED); */
3219 case THREAD_STATE_TIMED_WAITING:
3220 ia = builtin_newarray_int(3);
3225 /* XXX Not sure about that one. */
3226 /* array_intarray_element_set(ia, 0, SLEEPING); */
3227 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3228 /* XXX Implement parked stuff. */
3229 /* array_intarray_element_set(ia, 2, PARKED); */
3232 case THREAD_STATE_TERMINATED:
3233 ia = builtin_newarray_int(1);
3238 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3242 /* Unknown state - probably incompatible JDK version */
3246 return (jintArray) ia;
3250 /* JVM_GetThreadStateNames */
3252 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3254 java_handle_intarray_t *ia;
3255 java_handle_objectarray_t *oa;
3258 TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3259 env, javaThreadState, values);
3261 ia = (java_handle_intarray_t *) values;
3263 /* If new thread states are added in future JDK and VM versions,
3264 this should check if the JDK version is compatible with thread
3265 states supported by the VM. Return NULL if not compatible.
3267 This function must map the VM java_lang_Thread::ThreadStatus
3268 to the Java thread state that the JDK supports. */
3270 if (values == NULL) {
3271 exceptions_throw_nullpointerexception();
3275 switch (javaThreadState) {
3276 case THREAD_STATE_NEW:
3277 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3279 oa = builtin_anewarray(1, class_java_lang_String);
3284 s = javastring_new(utf_new_char("NEW"));
3289 array_objectarray_element_set(oa, 0, s);
3292 case THREAD_STATE_RUNNABLE:
3293 oa = builtin_anewarray(1, class_java_lang_String);
3298 s = javastring_new(utf_new_char("RUNNABLE"));
3303 array_objectarray_element_set(oa, 0, s);
3306 case THREAD_STATE_BLOCKED:
3307 oa = builtin_anewarray(1, class_java_lang_String);
3312 s = javastring_new(utf_new_char("BLOCKED"));
3317 array_objectarray_element_set(oa, 0, s);
3320 case THREAD_STATE_WAITING:
3321 oa = builtin_anewarray(2, class_java_lang_String);
3326 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3327 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3332 array_objectarray_element_set(oa, 0, s);
3333 /* array_objectarray_element_set(oa, 1, s); */
3336 case THREAD_STATE_TIMED_WAITING:
3337 oa = builtin_anewarray(3, class_java_lang_String);
3342 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3343 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3344 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3349 /* array_objectarray_element_set(oa, 0, s); */
3350 array_objectarray_element_set(oa, 0, s);
3351 /* array_objectarray_element_set(oa, 2, s); */
3354 case THREAD_STATE_TERMINATED:
3355 oa = builtin_anewarray(1, class_java_lang_String);
3360 s = javastring_new(utf_new_char("TERMINATED"));
3365 array_objectarray_element_set(oa, 0, s);
3369 /* Unknown state - probably incompatible JDK version */
3373 return (jobjectArray) oa;
3377 /* JVM_GetVersionInfo */
3379 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3381 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3385 /* OS: JVM_RegisterSignal */
3387 void *JVM_RegisterSignal(jint sig, void *handler)
3389 functionptr newHandler;
3391 TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
3393 if (handler == (void *) 2)
3394 newHandler = (functionptr) signal_thread_handler;
3396 newHandler = (functionptr) (uintptr_t) handler;
3403 /* These signals are already used by the VM. */
3407 /* This signal is used by the VM to dump thread stacks unless
3408 ReduceSignalUsage is set, in which case the user is allowed
3409 to set his own _native_ handler for this signal; thus, in
3410 either case, we do not allow JVM_RegisterSignal to change
3420 signal_register_signal(sig, newHandler, 0);
3422 /* XXX Should return old handler. */
3428 /* OS: JVM_RaiseSignal */
3430 jboolean JVM_RaiseSignal(jint sig)
3432 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3437 /* OS: JVM_FindSignal */
3439 jint JVM_FindSignal(const char *name)
3441 TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
3443 #if defined(__LINUX__)
3444 if (strcmp(name, "HUP") == 0)
3447 if (strcmp(name, "INT") == 0)
3450 if (strcmp(name, "TERM") == 0)
3453 # error not implemented for this OS
3461 * These are local overrides for various environment variables in Emacs.
3462 * Please do not remove this and leave it at the end of the file, where
3463 * Emacs will automagically detect them.
3464 * ---------------------------------------------------------------------
3467 * indent-tabs-mode: t