1 /* src/native/vm/sun/jvm.c - HotSpot JVM interface functions
3 Copyright (C) 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
36 #if defined(HAVE_SYS_IOCTL_H)
37 #define BSD_COMP /* Get FIONREAD on Solaris2 */
38 #include <sys/ioctl.h>
41 #include <sys/socket.h>
43 #include <sys/types.h>
47 #include "mm/memory.h"
49 #include "native/jni.h"
50 #include "native/llni.h"
51 #include "native/native.h"
53 #include "native/include/java_lang_AssertionStatusDirectives.h"
54 #include "native/include/java_lang_String.h" /* required by j.l.CL */
55 #include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
56 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
57 #include "native/include/java_lang_StackTraceElement.h"
58 #include "native/include/java_lang_Throwable.h"
59 #include "native/include/java_security_ProtectionDomain.h"
61 #if defined(ENABLE_ANNOTATIONS)
62 #include "native/include/sun_reflect_ConstantPool.h"
65 #include "native/vm/java_lang_Class.h"
66 #include "native/vm/java_lang_reflect_Constructor.h"
67 #include "native/vm/java_lang_reflect_Method.h"
68 #include "native/vm/reflect.h"
70 #include "threads/lock-common.h"
71 #include "threads/threadlist.h"
72 #include "threads/threads-common.h"
74 #include "toolbox/logging.h"
75 #include "toolbox/list.h"
79 #if defined(ENABLE_ASSERTION)
80 #include "vm/assertion.h"
83 #include "vm/builtin.h"
84 #include "vm/exceptions.h"
85 #include "vm/global.h"
86 #include "vm/initialize.h"
87 #include "vm/package.h"
88 #include "vm/primitive.h"
89 #include "vm/properties.h"
90 #include "vm/resolve.h"
91 #include "vm/signallocal.h"
92 #include "vm/stringlocal.h"
95 #include "vm/jit/stacktrace.h"
97 #include "vmcore/classcache.h"
98 #include "vmcore/options.h"
99 #include "vmcore/system.h"
102 /* debugging macros ***********************************************************/
106 # define TRACEJVMCALLS(x) \
108 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
113 # define TRACEJVMCALLSVERBOSE(x) \
115 if (opt_TraceJVMCallsVerbose) { \
120 # define PRINTJVMWARNINGS(x)
122 /* if (opt_PrintJVMWarnings) { \ */
123 /* log_println x; \ */
129 # define TRACEJVMCALLS(x)
130 # define TRACEJVMCALLSVERBOSE(x)
131 # define PRINTJVMWARNINGS(x)
137 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
138 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
139 /* and build number (xx) */
140 unsigned int update_version : 8; /* Update release version (uu) */
141 unsigned int special_update_version : 8; /* Special update release version (c) */
142 unsigned int reserved1 : 16;
143 unsigned int reserved2;
145 /* The following bits represents JVM supports that JDK has dependency on.
146 * JDK can use these bits to determine which JVM version
147 * and support it has to maintain runtime compatibility.
149 * When a new bit is added in a minor or update release, make sure
150 * the new bit is also added in the main/baseline.
152 unsigned int is_attachable : 1;
160 * A structure used to a capture exception table entry in a Java method.
167 } JVM_ExceptionTableEntryType;
170 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
172 if ((intptr_t) count <= 0)
175 return vsnprintf(str, count, fmt, args);
179 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
185 len = jio_vsnprintf(str, count, fmt, ap);
192 int jio_fprintf(FILE* f, const char *fmt, ...)
194 log_println("jio_fprintf: IMPLEMENT ME!");
200 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
202 log_println("jio_vfprintf: IMPLEMENT ME!");
208 int jio_printf(const char *fmt, ...)
210 log_println("jio_printf: IMPLEMENT ME!");
216 /* JVM_GetInterfaceVersion */
218 jint JVM_GetInterfaceVersion()
220 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
222 #define JVM_INTERFACE_VERSION 4
224 return JVM_INTERFACE_VERSION;
228 /* JVM_CurrentTimeMillis */
230 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
232 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
234 return (jlong) builtin_currenttimemillis();
240 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
242 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
244 return (jlong) builtin_nanotime();
250 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
255 s = (java_handle_t *) src;
256 d = (java_handle_t *) dst;
258 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));
260 builtin_arraycopy(s, src_pos, d, dst_pos, length);
264 /* JVM_InitProperties */
266 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
270 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
272 h = (java_handle_t *) properties;
274 properties_system_add_all(h);
282 void JVM_Exit(jint code)
284 log_println("JVM_Exit: IMPLEMENT ME!");
290 void JVM_Halt(jint code)
292 TRACEJVMCALLS(("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!");
327 /* JVM_TraceInstructions */
329 void JVM_TraceInstructions(jboolean on)
331 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
335 /* JVM_TraceMethodCalls */
337 void JVM_TraceMethodCalls(jboolean on)
339 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
343 /* JVM_TotalMemory */
345 jlong JVM_TotalMemory(void)
347 TRACEJVMCALLS(("JVM_TotalMemory()"));
349 return gc_get_heap_size();
355 jlong JVM_FreeMemory(void)
357 TRACEJVMCALLS(("JVM_FreeMemory()"));
359 return gc_get_free_bytes();
365 jlong JVM_MaxMemory(void)
367 TRACEJVMCALLS(("JVM_MaxMemory()"));
369 return gc_get_max_heap_size();
373 /* JVM_ActiveProcessorCount */
375 jint JVM_ActiveProcessorCount(void)
377 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
379 return system_processors_online();
383 /* JVM_FillInStackTrace */
385 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
387 java_lang_Throwable *o;
388 java_handle_bytearray_t *ba;
390 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
392 o = (java_lang_Throwable *) receiver;
394 ba = stacktrace_get_current();
399 LLNI_field_set_ref(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 *to;
417 java_handle_bytearray_t *ba;
421 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
423 if (throwable == NULL) {
424 exceptions_throw_nullpointerexception();
428 to = (java_lang_Throwable *) throwable;
430 LLNI_field_get_ref(to, backtrace, o);
432 ba = (java_handle_bytearray_t *) o;
437 /* We need a critical section here as the stacktrace structure is
438 mapped onto a Java byte-array. */
442 st = (stacktrace_t *) LLNI_array_data(ba);
452 /* JVM_GetStackTraceElement */
454 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
456 java_lang_Throwable *to;
458 java_handle_bytearray_t *ba;
460 stacktrace_entry_t *ste;
464 java_lang_StackTraceElement *steo;
465 java_lang_String *declaringclass;
466 java_lang_String *filename;
469 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
471 to = (java_lang_Throwable *) throwable;
473 LLNI_field_get_ref(to, backtrace, o);
475 ba = (java_handle_bytearray_t *) o;
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 steo = (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 steo->declaringClass = declaringclass;
540 steo->methodName = (java_lang_String *) javastring_new(m->name);
541 steo->fileName = filename;
542 steo->lineNumber = linenumber;
544 return (jobject) steo;
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!");
645 /* JVM_CompileClass */
647 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
649 log_println("JVM_CompileClass: IMPLEMENT ME!");
655 /* JVM_CompileClasses */
657 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
659 log_println("JVM_CompileClasses: IMPLEMENT ME!");
665 /* JVM_CompilerCommand */
667 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
669 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
675 /* JVM_EnableCompiler */
677 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
679 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
680 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
684 /* JVM_DisableCompiler */
686 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
688 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
689 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
693 /* JVM_GetLastErrorString */
695 jint JVM_GetLastErrorString(char *buf, int len)
721 char *JVM_NativePath(char *path)
723 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
725 /* XXX is this correct? */
731 /* JVM_GetCallerClass */
733 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
735 java_handle_objectarray_t *oa;
737 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
739 oa = stacktrace_getClassContext();
744 if (oa->header.size < depth)
747 return (jclass) oa->data[depth - 1];
752 /* JVM_FindPrimitiveClass */
754 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
759 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
762 c = primitive_class_get_by_name(u);
764 return (jclass) LLNI_classinfo_wrap(c);
768 /* JVM_ResolveClass */
770 void JVM_ResolveClass(JNIEnv* env, jclass cls)
772 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
773 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
777 /* JVM_FindClassFromClassLoader */
779 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
785 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
787 u = utf_new_char(name);
788 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
790 c = load_class_from_classloader(u, cl);
796 if (!(c->state & CLASS_INITIALIZED))
797 if (!initialize_class(c))
800 return (jclass) LLNI_classinfo_wrap(c);
804 /* JVM_FindClassFromClass */
806 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
808 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
814 /* JVM_DefineClass */
816 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
818 log_println("JVM_DefineClass: IMPLEMENT ME!");
824 /* JVM_DefineClassWithSource */
826 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
832 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
835 u = utf_new_char(name);
839 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
841 /* XXX do something with source */
843 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
845 return (jclass) LLNI_classinfo_wrap(c);
849 /* JVM_FindLoadedClass */
851 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
857 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
859 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
861 u = javastring_toutf((java_handle_t *) name, true);
862 c = classcache_lookup(cl, u);
864 return (jclass) LLNI_classinfo_wrap(c);
868 /* JVM_GetClassName */
870 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
872 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
874 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
878 /* JVM_GetClassInterfaces */
880 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
883 java_handle_objectarray_t *oa;
885 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
887 c = LLNI_classinfo_unwrap(cls);
889 oa = class_get_interfaces(c);
891 return (jobjectArray) oa;
895 /* JVM_GetClassLoader */
897 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
902 TRACEJVMCALLS(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
904 c = LLNI_classinfo_unwrap(cls);
905 cl = class_get_classloader(c);
911 /* JVM_IsInterface */
913 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
917 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
919 c = LLNI_classinfo_unwrap(cls);
921 return class_is_interface(c);
925 /* JVM_GetClassSigners */
927 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
929 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
935 /* JVM_SetClassSigners */
937 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
940 java_handle_objectarray_t *hoa;
942 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
944 c = LLNI_classinfo_unwrap(cls);
946 hoa = (java_handle_objectarray_t *) signers;
948 /* This call is ignored for primitive types and arrays. Signers
949 are only set once, ClassLoader.java, and thus shouldn't be
950 called with an array. Only the bootstrap loader creates
953 if (class_is_primitive(c) || class_is_array(c))
956 LLNI_classinfo_field_set(c, signers, hoa);
960 /* JVM_GetProtectionDomain */
962 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
966 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
968 c = LLNI_classinfo_unwrap(cls);
971 exceptions_throw_nullpointerexception();
975 /* Primitive types do not have a protection domain. */
977 if (class_is_primitive(c))
980 return (jobject) c->protectiondomain;
984 /* JVM_SetProtectionDomain */
986 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
988 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
992 /* JVM_DoPrivileged */
994 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
999 java_handle_t *result;
1002 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
1004 o = (java_handle_t *) action;
1005 c = o->vftbl->class;
1007 if (action == NULL) {
1008 exceptions_throw_nullpointerexception();
1012 /* lookup run() method (throw no exceptions) */
1014 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1017 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1018 exceptions_throw_internalerror("No run method");
1022 /* XXX It seems something with a privileged stack needs to be done
1025 result = vm_call_method(m, o);
1027 e = exceptions_get_and_clear_exception();
1030 exceptions_throw_privilegedactionexception(e);
1034 return (jobject) result;
1038 /* JVM_GetInheritedAccessControlContext */
1040 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1042 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1048 /* JVM_GetStackAccessControlContext */
1050 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1052 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
1054 /* XXX All stuff I tested so far works without that function. At
1055 some point we have to implement it, but I disable the output
1056 for now to make IcedTea happy. */
1062 /* JVM_IsArrayClass */
1064 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1068 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1070 c = LLNI_classinfo_unwrap(cls);
1072 return class_is_array(c);
1076 /* JVM_IsPrimitiveClass */
1078 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1082 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1084 c = LLNI_classinfo_unwrap(cls);
1086 return class_is_primitive(c);
1090 /* JVM_GetComponentType */
1092 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1094 classinfo *component;
1097 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1099 c = LLNI_classinfo_unwrap(cls);
1101 component = class_get_componenttype(c);
1103 return (jclass) LLNI_classinfo_wrap(component);
1107 /* JVM_GetClassModifiers */
1109 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1114 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1116 c = LLNI_classinfo_unwrap(cls);
1118 flags = class_get_modifiers(c, false);
1124 /* JVM_GetDeclaredClasses */
1126 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1129 java_handle_objectarray_t *oa;
1131 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1133 c = LLNI_classinfo_unwrap(ofClass);
1135 oa = class_get_declaredclasses(c, false);
1137 return (jobjectArray) oa;
1141 /* JVM_GetDeclaringClass */
1143 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1148 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1150 c = LLNI_classinfo_unwrap(ofClass);
1152 dc = class_get_declaringclass(c);
1154 return (jclass) LLNI_classinfo_wrap(dc);
1158 /* JVM_GetClassSignature */
1160 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1166 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1168 c = LLNI_classinfo_unwrap(cls);
1170 /* Get the signature of the class. */
1172 u = class_get_signature(c);
1177 /* Convert UTF-string to a Java-string. */
1179 s = javastring_new(u);
1185 /* JVM_GetClassAnnotations */
1187 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1189 classinfo *c = NULL; /* classinfo for 'cls' */
1190 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1192 TRACEJVMCALLS(("JVM_GetClassAnnotations: cls=%p", cls));
1195 exceptions_throw_nullpointerexception();
1199 c = LLNI_classinfo_unwrap(cls);
1201 /* get annotations: */
1202 annotations = class_get_annotations(c);
1204 return (jbyteArray)annotations;
1208 /* JVM_GetFieldAnnotations */
1210 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1212 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1213 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1215 TRACEJVMCALLS(("JVM_GetFieldAnnotations: field=%p", field));
1217 if (field == NULL) {
1218 exceptions_throw_nullpointerexception();
1222 rf = (java_lang_reflect_Field*)field;
1224 LLNI_field_get_ref(rf, annotations, ba);
1226 return (jbyteArray)ba;
1230 /* JVM_GetMethodAnnotations */
1232 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1234 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1235 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1237 TRACEJVMCALLS(("JVM_GetMethodAnnotations: method=%p", method));
1239 if (method == NULL) {
1240 exceptions_throw_nullpointerexception();
1244 rm = (java_lang_reflect_Method*)method;
1246 LLNI_field_get_ref(rm, annotations, ba);
1248 return (jbyteArray)ba;
1252 /* JVM_GetMethodDefaultAnnotationValue */
1254 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1256 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1257 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1259 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue: method=%p", method));
1261 if (method == NULL) {
1262 exceptions_throw_nullpointerexception();
1266 rm = (java_lang_reflect_Method*)method;
1268 LLNI_field_get_ref(rm, annotationDefault, ba);
1270 return (jbyteArray)ba;
1274 /* JVM_GetMethodParameterAnnotations */
1276 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1278 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1279 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1281 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations: method=%p", method));
1283 if (method == NULL) {
1284 exceptions_throw_nullpointerexception();
1288 rm = (java_lang_reflect_Method*)method;
1290 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1292 return (jbyteArray)ba;
1296 /* JVM_GetClassDeclaredFields */
1298 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1300 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1302 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1306 /* JVM_GetClassDeclaredMethods */
1308 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1310 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1312 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1316 /* JVM_GetClassDeclaredConstructors */
1318 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1320 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1322 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1326 /* JVM_GetClassAccessFlags */
1328 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1332 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1334 c = LLNI_classinfo_unwrap(cls);
1336 /* Primitive type classes have the correct access flags. */
1338 return c->flags & ACC_CLASS_REFLECT_MASK;
1342 /* JVM_GetClassConstantPool */
1344 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1346 #if defined(ENABLE_ANNOTATIONS)
1347 sun_reflect_ConstantPool *constantPool = NULL;
1348 /* constant pool object for the class refered by 'cls' */
1349 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1350 /* constantPoolOop field of the constant pool object */
1352 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1355 (sun_reflect_ConstantPool*)native_new_and_init(
1356 class_sun_reflect_ConstantPool);
1358 if (constantPool == NULL) {
1363 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1365 return (jobject)constantPool;
1367 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1373 /* JVM_ConstantPoolGetSize */
1375 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1377 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1379 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1381 c = LLNI_classinfo_unwrap(jcpool);
1387 /* JVM_ConstantPoolGetClassAt */
1389 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1391 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1392 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1393 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1395 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1397 c = LLNI_classinfo_unwrap(jcpool);
1399 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1402 exceptions_throw_illegalargumentexception();
1406 result = resolve_classref_eager(ref);
1408 return (jclass) LLNI_classinfo_wrap(result);
1412 /* JVM_ConstantPoolGetClassAtIfLoaded */
1414 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1416 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1417 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1418 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1420 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1422 c = LLNI_classinfo_unwrap(jcpool);
1424 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1427 exceptions_throw_illegalargumentexception();
1431 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1435 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1439 return (jclass) LLNI_classinfo_wrap(result);
1443 /* JVM_ConstantPoolGetMethodAt */
1445 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1447 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1448 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1450 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1452 cls = LLNI_classinfo_unwrap(jcpool);
1453 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1456 exceptions_throw_illegalargumentexception();
1460 /* XXX: is that right? or do I have to use resolve_method_*? */
1461 return (jobject)reflect_method_new(ref->p.method);
1465 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1467 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1469 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1470 classinfo *c = NULL; /* resolved declaring class of the method */
1471 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1473 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1475 cls = LLNI_classinfo_unwrap(jcpool);
1476 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1479 exceptions_throw_illegalargumentexception();
1483 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1487 if (c == NULL || !(c->state & CLASS_LOADED)) {
1491 return (jobject)reflect_method_new(ref->p.method);
1495 /* JVM_ConstantPoolGetFieldAt */
1497 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1499 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1500 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1502 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1504 cls = LLNI_classinfo_unwrap(jcpool);
1505 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1508 exceptions_throw_illegalargumentexception();
1512 return (jobject)reflect_field_new(ref->p.field);
1516 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1518 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1520 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1521 classinfo *c; /* resolved declaring class for the field */
1522 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1524 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1526 cls = LLNI_classinfo_unwrap(jcpool);
1527 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1530 exceptions_throw_illegalargumentexception();
1534 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1538 if (c == NULL || !(c->state & CLASS_LOADED)) {
1542 return (jobject)reflect_field_new(ref->p.field);
1546 /* JVM_ConstantPoolGetMemberRefInfoAt */
1548 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1550 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1552 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1558 /* JVM_ConstantPoolGetIntAt */
1560 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1562 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1563 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1565 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1567 cls = LLNI_classinfo_unwrap(jcpool);
1568 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1571 exceptions_throw_illegalargumentexception();
1579 /* JVM_ConstantPoolGetLongAt */
1581 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1583 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1584 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1586 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1588 cls = LLNI_classinfo_unwrap(jcpool);
1589 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1592 exceptions_throw_illegalargumentexception();
1600 /* JVM_ConstantPoolGetFloatAt */
1602 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1604 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1605 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1607 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1609 cls = LLNI_classinfo_unwrap(jcpool);
1610 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1613 exceptions_throw_illegalargumentexception();
1621 /* JVM_ConstantPoolGetDoubleAt */
1623 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1625 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1626 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1628 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1630 cls = LLNI_classinfo_unwrap(jcpool);
1631 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1634 exceptions_throw_illegalargumentexception();
1642 /* JVM_ConstantPoolGetStringAt */
1644 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1646 utf *ref; /* utf object for the string in constant pool at index 'index' */
1647 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1649 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1651 cls = LLNI_classinfo_unwrap(jcpool);
1652 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1655 exceptions_throw_illegalargumentexception();
1659 /* XXX: I hope literalstring_new is the right Function. */
1660 return (jstring)literalstring_new(ref);
1664 /* JVM_ConstantPoolGetUTF8At */
1666 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1668 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1669 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1671 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1673 cls = LLNI_classinfo_unwrap(jcpool);
1674 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1677 exceptions_throw_illegalargumentexception();
1681 /* XXX: I hope literalstring_new is the right Function. */
1682 return (jstring)literalstring_new(ref);
1686 /* JVM_DesiredAssertionStatus */
1688 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1690 #if defined(ENABLE_ASSERTION)
1691 assertion_name_t *item;
1696 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1698 c = LLNI_classinfo_unwrap(cls);
1700 if (c->classloader == NULL) {
1701 status = (jboolean)assertion_system_enabled;
1704 status = (jboolean)assertion_user_enabled;
1707 if (list_assertion_names != NULL) {
1708 item = (assertion_name_t *)list_first(list_assertion_names);
1709 while (item != NULL) {
1710 name = utf_new_char(item->name);
1711 if (name == c->packagename) {
1712 status = (jboolean)item->enabled;
1714 else if (name == c->name) {
1715 status = (jboolean)item->enabled;
1718 item = (assertion_name_t *)list_next(list_assertion_names, item);
1724 return (jboolean)false;
1729 /* JVM_AssertionStatusDirectives */
1731 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1734 java_lang_AssertionStatusDirectives *o;
1735 java_handle_objectarray_t *classes;
1736 java_handle_objectarray_t *packages;
1737 java_booleanarray_t *classEnabled;
1738 java_booleanarray_t *packageEnabled;
1739 #if defined(ENABLE_ASSERTION)
1740 assertion_name_t *item;
1745 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1747 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1752 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1757 #if defined(ENABLE_ASSERTION)
1758 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1760 classes = builtin_anewarray(0, class_java_lang_Object);
1762 if (classes == NULL)
1765 #if defined(ENABLE_ASSERTION)
1766 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1768 packages = builtin_anewarray(0, class_java_lang_Object);
1770 if (packages == NULL)
1773 #if defined(ENABLE_ASSERTION)
1774 classEnabled = builtin_newarray_boolean(assertion_class_count);
1776 classEnabled = builtin_newarray_boolean(0);
1778 if (classEnabled == NULL)
1781 #if defined(ENABLE_ASSERTION)
1782 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1784 packageEnabled = builtin_newarray_boolean(0);
1786 if (packageEnabled == NULL)
1789 #if defined(ENABLE_ASSERTION)
1790 /* initialize arrays */
1792 if (list_assertion_names != NULL) {
1796 item = (assertion_name_t *)list_first(list_assertion_names);
1797 while (item != NULL) {
1798 js = javastring_new_from_ascii(item->name);
1803 if (item->package == false) {
1804 classes->data[i] = js;
1805 classEnabled->data[i] = (jboolean) item->enabled;
1809 packages->data[j] = js;
1810 packageEnabled->data[j] = (jboolean) item->enabled;
1814 item = (assertion_name_t *)list_next(list_assertion_names, item);
1819 /* set instance fields */
1821 o->classes = classes;
1822 o->packages = packages;
1823 o->classEnabled = classEnabled;
1824 o->packageEnabled = packageEnabled;
1830 /* JVM_GetClassNameUTF */
1832 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1834 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1840 /* JVM_GetClassCPTypes */
1842 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1844 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1848 /* JVM_GetClassCPEntriesCount */
1850 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1852 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1858 /* JVM_GetClassFieldsCount */
1860 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1862 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1868 /* JVM_GetClassMethodsCount */
1870 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1872 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1878 /* JVM_GetMethodIxExceptionIndexes */
1880 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1882 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1886 /* JVM_GetMethodIxExceptionsCount */
1888 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1890 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1896 /* JVM_GetMethodIxByteCode */
1898 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1900 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1904 /* JVM_GetMethodIxByteCodeLength */
1906 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1908 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1914 /* JVM_GetMethodIxExceptionTableEntry */
1916 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1918 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1922 /* JVM_GetMethodIxExceptionTableLength */
1924 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1926 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1932 /* JVM_GetMethodIxModifiers */
1934 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1936 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1942 /* JVM_GetFieldIxModifiers */
1944 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1946 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1952 /* JVM_GetMethodIxLocalsCount */
1954 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1956 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1962 /* JVM_GetMethodIxArgsSize */
1964 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1966 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1972 /* JVM_GetMethodIxMaxStack */
1974 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1976 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1982 /* JVM_IsConstructorIx */
1984 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1986 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1992 /* JVM_GetMethodIxNameUTF */
1994 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1996 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
2002 /* JVM_GetMethodIxSignatureUTF */
2004 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
2006 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
2012 /* JVM_GetCPFieldNameUTF */
2014 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2016 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
2022 /* JVM_GetCPMethodNameUTF */
2024 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2026 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
2032 /* JVM_GetCPMethodSignatureUTF */
2034 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2036 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
2042 /* JVM_GetCPFieldSignatureUTF */
2044 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2046 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2052 /* JVM_GetCPClassNameUTF */
2054 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2056 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2062 /* JVM_GetCPFieldClassNameUTF */
2064 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2066 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2072 /* JVM_GetCPMethodClassNameUTF */
2074 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2076 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2082 /* JVM_GetCPFieldModifiers */
2084 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2086 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2092 /* JVM_GetCPMethodModifiers */
2094 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2096 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2102 /* JVM_ReleaseUTF */
2104 void JVM_ReleaseUTF(const char *utf)
2106 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2110 /* JVM_IsSameClassPackage */
2112 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2114 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2122 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2125 * JVM I/O error codes
2127 #define JVM_EEXIST -100
2129 jint JVM_Open(const char *fname, jint flags, jint mode)
2133 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2135 result = system_open(fname, flags, mode);
2153 jint JVM_Close(jint fd)
2155 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2157 return system_close(fd);
2163 jint JVM_Read(jint fd, char *buf, jint nbytes)
2165 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2167 return system_read(fd, buf, nbytes);
2173 jint JVM_Write(jint fd, char *buf, jint nbytes)
2175 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2177 return system_write(fd, buf, nbytes);
2183 jint JVM_Available(jint fd, jlong *pbytes)
2185 #if defined(FIONREAD)
2189 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2193 result = ioctl(fd, FIONREAD, &bytes);
2202 # error FIONREAD not defined
2209 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2211 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2213 return (jlong) system_lseek(fd, (off_t) offset, whence);
2219 jint JVM_SetLength(jint fd, jlong length)
2221 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2223 return system_ftruncate(fd, length);
2229 jint JVM_Sync(jint fd)
2231 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2233 return system_fsync(fd);
2237 /* JVM_StartThread */
2239 void JVM_StartThread(JNIEnv* env, jobject jthread)
2241 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2243 threads_thread_start((java_handle_t *) jthread);
2247 /* JVM_StopThread */
2249 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2251 log_println("JVM_StopThread: IMPLEMENT ME!");
2255 /* JVM_IsThreadAlive */
2257 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2264 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2266 h = (java_handle_t *) jthread;
2268 /* XXX this is just a quick hack */
2270 for (t = threadlist_first(); t != NULL; t = threadlist_next(t)) {
2271 LLNI_equals(t->object, h, equal);
2277 /* The threadobject is null when a thread is created in Java. The
2278 priority is set later during startup. */
2283 result = threads_thread_is_alive(t);
2289 /* JVM_SuspendThread */
2291 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2293 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2297 /* JVM_ResumeThread */
2299 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2301 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2305 /* JVM_SetThreadPriority */
2307 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2312 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2314 h = (java_handle_t *) jthread;
2316 /* XXX this is just a quick hack */
2318 for (t = threadlist_first(); t != NULL; t = threadlist_next(t)) {
2323 /* The threadobject is null when a thread is created in Java. The
2324 priority is set later during startup. */
2329 threads_set_thread_priority(t->tid, prio);
2335 void JVM_Yield(JNIEnv *env, jclass threadClass)
2337 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2345 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2347 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2349 threads_sleep(millis, 0);
2353 /* JVM_CurrentThread */
2355 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2359 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2361 o = threads_get_current_object();
2367 /* JVM_CountStackFrames */
2369 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2371 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2379 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2381 log_println("JVM_Interrupt: IMPLEMENT ME!");
2385 /* JVM_IsInterrupted */
2387 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2392 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2394 h = (java_handle_t *) jthread;
2396 /* XXX do something with clear_interrupted */
2398 /* XXX this is just a quick hack */
2400 for (t = threadlist_first(); t != NULL; t = threadlist_next(t)) {
2405 return threads_thread_has_been_interrupted(t);
2411 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2416 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2418 h = (java_handle_t *) obj;
2421 exceptions_throw_nullpointerexception();
2425 result = lock_is_held_by_current_thread(h);
2431 /* JVM_DumpAllStacks */
2433 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2435 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2439 /* JVM_CurrentLoadedClass */
2441 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2443 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2449 /* JVM_CurrentClassLoader */
2451 jobject JVM_CurrentClassLoader(JNIEnv *env)
2453 /* XXX if a method in a class in a trusted loader is in a
2454 doPrivileged, return NULL */
2456 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2462 /* JVM_GetClassContext */
2464 jobjectArray JVM_GetClassContext(JNIEnv *env)
2466 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2468 return (jobjectArray) stacktrace_getClassContext();
2472 /* JVM_ClassDepth */
2474 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2476 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2482 /* JVM_ClassLoaderDepth */
2484 jint JVM_ClassLoaderDepth(JNIEnv *env)
2486 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2492 /* JVM_GetSystemPackage */
2494 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2500 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2502 /* s = package_find(name); */
2503 u = javastring_toutf((java_handle_t *) name, false);
2505 result = package_find(u);
2508 s = javastring_new(result);
2516 /* JVM_GetSystemPackages */
2518 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2520 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2526 /* JVM_AllocateNewObject */
2528 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2530 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2536 /* JVM_AllocateNewArray */
2538 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2540 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2546 /* JVM_LatestUserDefinedLoader */
2548 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2552 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2554 cl = stacktrace_first_nonnull_classloader();
2556 return (jobject) cl;
2560 /* JVM_LoadClass0 */
2562 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2564 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2570 /* JVM_GetArrayLength */
2572 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2576 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2578 a = (java_handle_t *) arr;
2580 return array_length_get(a);
2584 /* JVM_GetArrayElement */
2586 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2591 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2593 a = (java_handle_t *) arr;
2595 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2596 /* exceptions_throw_illegalargumentexception(); */
2600 o = array_element_get(a, index);
2606 /* JVM_GetPrimitiveArrayElement */
2608 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2612 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2620 /* JVM_SetArrayElement */
2622 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2625 java_handle_t *value;
2627 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2629 a = (java_handle_t *) arr;
2630 value = (java_handle_t *) val;
2632 array_element_set(a, index, value);
2636 /* JVM_SetPrimitiveArrayElement */
2638 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2640 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2646 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2651 java_handle_objectarray_t *oa;
2653 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2655 if (eltClass == NULL) {
2656 exceptions_throw_nullpointerexception();
2660 /* NegativeArraySizeException is checked in builtin_newarray. */
2662 c = LLNI_classinfo_unwrap(eltClass);
2664 /* create primitive or object array */
2666 if (class_is_primitive(c)) {
2667 pc = primitive_arrayclass_get_by_name(c->name);
2668 a = builtin_newarray(length, pc);
2673 oa = builtin_anewarray(length, c);
2675 return (jobject) oa;
2680 /* JVM_NewMultiArray */
2682 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2685 java_handle_intarray_t *ia;
2691 java_handle_objectarray_t *a;
2693 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2695 if (eltClass == NULL) {
2696 exceptions_throw_nullpointerexception();
2700 /* NegativeArraySizeException is checked in builtin_newarray. */
2702 c = LLNI_classinfo_unwrap(eltClass);
2704 /* XXX This is just a quick hack to get it working. */
2706 ia = (java_handle_intarray_t *) dim;
2708 length = array_length_get((java_handle_t *) ia);
2710 dims = MNEW(long, length);
2712 for (i = 0; i < length; i++) {
2713 value = LLNI_array_direct(ia, i);
2714 dims[i] = (long) value;
2717 /* Create an array-class if necessary. */
2719 if (class_is_primitive(c))
2720 ac = primitive_arrayclass_get_by_name(c->name);
2722 ac = class_array_of(c, true);
2727 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2733 /* JVM_InitializeSocketLibrary */
2735 jint JVM_InitializeSocketLibrary()
2737 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2745 jint JVM_Socket(jint domain, jint type, jint protocol)
2747 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2749 return system_socket(domain, type, protocol);
2753 /* JVM_SocketClose */
2755 jint JVM_SocketClose(jint fd)
2757 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2759 return system_close(fd);
2763 /* JVM_SocketShutdown */
2765 jint JVM_SocketShutdown(jint fd, jint howto)
2767 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2769 return system_shutdown(fd, howto);
2775 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2777 log_println("JVM_Recv: IMPLEMENT ME!");
2785 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2787 log_println("JVM_Send: IMPLEMENT ME!");
2795 jint JVM_Timeout(int fd, long timeout)
2797 log_println("JVM_Timeout: IMPLEMENT ME!");
2805 jint JVM_Listen(jint fd, jint count)
2807 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2809 return system_listen(fd, count);
2815 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2817 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2819 return system_connect(fd, him, len);
2825 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2827 log_println("JVM_Bind: IMPLEMENT ME!");
2835 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2837 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2839 return system_accept(fd, him, (socklen_t *) len);
2845 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2847 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2853 /* JVM_GetSockName */
2855 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2857 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2859 return system_getsockname(fd, him, (socklen_t *) len);
2865 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2867 log_println("JVM_SendTo: IMPLEMENT ME!");
2873 /* JVM_SocketAvailable */
2875 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2877 #if defined(FIONREAD)
2881 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2885 result = ioctl(fd, FIONREAD, &bytes);
2894 # error FIONREAD not defined
2899 /* JVM_GetSockOpt */
2901 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2903 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2905 return system_getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2909 /* JVM_SetSockOpt */
2911 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2913 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2915 return system_setsockopt(fd, level, optname, optval, optlen);
2919 /* JVM_GetHostName */
2921 int JVM_GetHostName(char *name, int namelen)
2923 TRACEJVMCALLS(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2925 return system_gethostname(name, namelen);
2929 /* JVM_GetHostByAddr */
2931 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2933 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2939 /* JVM_GetHostByName */
2941 struct hostent *JVM_GetHostByName(char* name)
2943 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2949 /* JVM_GetProtoByName */
2951 struct protoent *JVM_GetProtoByName(char* name)
2953 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2959 /* JVM_LoadLibrary */
2961 void *JVM_LoadLibrary(const char *name)
2965 TRACEJVMCALLS(("JVM_LoadLibrary(name=%s)", name));
2967 u = utf_new_char(name);
2969 return native_library_open(u);
2973 /* JVM_UnloadLibrary */
2975 void JVM_UnloadLibrary(void* handle)
2977 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2979 native_library_close(handle);
2983 /* JVM_FindLibraryEntry */
2985 void *JVM_FindLibraryEntry(void *handle, const char *name)
2989 TRACEJVMCALLS(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
2991 symbol = lt_dlsym(handle, name);
2999 jboolean JVM_IsNaN(jdouble a)
3001 log_println("JVM_IsNaN: IMPLEMENT ME!");
3007 /* JVM_IsSupportedJNIVersion */
3009 jboolean JVM_IsSupportedJNIVersion(jint version)
3011 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
3013 return jni_version_check(version);
3017 /* JVM_InternString */
3019 jstring JVM_InternString(JNIEnv *env, jstring str)
3021 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
3023 return (jstring) javastring_intern((java_handle_t *) str);
3027 /* JVM_RawMonitorCreate */
3029 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3033 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3035 o = NEW(java_object_t);
3037 lock_init_object_lock(o);
3043 /* JVM_RawMonitorDestroy */
3045 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3047 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3049 FREE(mon, java_object_t);
3053 /* JVM_RawMonitorEnter */
3055 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3057 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3059 (void) lock_monitor_enter((java_object_t *) mon);
3065 /* JVM_RawMonitorExit */
3067 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3069 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3071 (void) lock_monitor_exit((java_object_t *) mon);
3075 /* JVM_SetPrimitiveFieldValues */
3077 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3079 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3083 /* JVM_GetPrimitiveFieldValues */
3085 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3087 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3091 /* JVM_AccessVMBooleanFlag */
3093 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3095 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3101 /* JVM_AccessVMIntFlag */
3103 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3105 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3111 /* JVM_VMBreakPoint */
3113 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3115 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3119 /* JVM_GetClassFields */
3121 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3123 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3129 /* JVM_GetClassMethods */
3131 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3133 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3139 /* JVM_GetClassConstructors */
3141 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3143 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3149 /* JVM_GetClassField */
3151 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3153 log_println("JVM_GetClassField: IMPLEMENT ME!");
3159 /* JVM_GetClassMethod */
3161 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3163 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3169 /* JVM_GetClassConstructor */
3171 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3173 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3179 /* JVM_NewInstance */
3181 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3183 log_println("JVM_NewInstance: IMPLEMENT ME!");
3191 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3193 log_println("JVM_GetField: IMPLEMENT ME!");
3199 /* JVM_GetPrimitiveField */
3201 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3205 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3215 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3217 log_println("JVM_SetField: IMPLEMENT ME!");
3221 /* JVM_SetPrimitiveField */
3223 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3225 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3229 /* JVM_InvokeMethod */
3231 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3233 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3235 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
3239 /* JVM_NewInstanceFromConstructor */
3241 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
3243 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, c, args0));
3245 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
3249 /* JVM_SupportsCX8 */
3251 jboolean JVM_SupportsCX8()
3253 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3263 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3265 log_println("JVM_CX8Field: IMPLEMENT ME!");
3271 /* JVM_GetAllThreads */
3273 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3275 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3281 /* JVM_DumpThreads */
3283 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3285 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3291 /* JVM_GetManagement */
3293 void *JVM_GetManagement(jint version)
3295 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3297 /* TODO We current don't support the management interface. */
3303 /* JVM_InitAgentProperties */
3305 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3307 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3313 /* JVM_GetEnclosingMethodInfo */
3315 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3319 java_handle_objectarray_t *oa;
3321 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3323 c = LLNI_classinfo_unwrap(ofClass);
3325 if ((c == NULL) || class_is_primitive(c))
3328 m = class_get_enclosingmethod(c);
3333 oa = builtin_anewarray(3, class_java_lang_Object);
3338 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->class));
3339 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3340 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3342 return (jobjectArray) oa;
3346 /* JVM_GetThreadStateValues */
3348 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3350 java_handle_intarray_t *ia;
3352 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3353 env, javaThreadState));
3355 /* If new thread states are added in future JDK and VM versions,
3356 this should check if the JDK version is compatible with thread
3357 states supported by the VM. Return NULL if not compatible.
3359 This function must map the VM java_lang_Thread::ThreadStatus
3360 to the Java thread state that the JDK supports. */
3362 switch (javaThreadState) {
3363 case THREAD_STATE_NEW:
3364 ia = builtin_newarray_int(1);
3369 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3372 case THREAD_STATE_RUNNABLE:
3373 ia = builtin_newarray_int(1);
3378 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3381 case THREAD_STATE_BLOCKED:
3382 ia = builtin_newarray_int(1);
3387 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3390 case THREAD_STATE_WAITING:
3391 ia = builtin_newarray_int(2);
3396 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3397 /* XXX Implement parked stuff. */
3398 /* array_intarray_element_set(ia, 1, PARKED); */
3401 case THREAD_STATE_TIMED_WAITING:
3402 ia = builtin_newarray_int(3);
3407 /* XXX Not sure about that one. */
3408 /* array_intarray_element_set(ia, 0, SLEEPING); */
3409 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3410 /* XXX Implement parked stuff. */
3411 /* array_intarray_element_set(ia, 2, PARKED); */
3414 case THREAD_STATE_TERMINATED:
3415 ia = builtin_newarray_int(1);
3420 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3424 /* Unknown state - probably incompatible JDK version */
3428 return (jintArray) ia;
3432 /* JVM_GetThreadStateNames */
3434 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3436 java_handle_intarray_t *ia;
3437 java_handle_objectarray_t *oa;
3440 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3441 env, javaThreadState, values));
3443 ia = (java_handle_intarray_t *) values;
3445 /* If new thread states are added in future JDK and VM versions,
3446 this should check if the JDK version is compatible with thread
3447 states supported by the VM. Return NULL if not compatible.
3449 This function must map the VM java_lang_Thread::ThreadStatus
3450 to the Java thread state that the JDK supports. */
3452 if (values == NULL) {
3453 exceptions_throw_nullpointerexception();
3457 switch (javaThreadState) {
3458 case THREAD_STATE_NEW:
3459 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3461 oa = builtin_anewarray(1, class_java_lang_String);
3466 s = javastring_new(utf_new_char("NEW"));
3471 array_objectarray_element_set(oa, 0, s);
3474 case THREAD_STATE_RUNNABLE:
3475 oa = builtin_anewarray(1, class_java_lang_String);
3480 s = javastring_new(utf_new_char("RUNNABLE"));
3485 array_objectarray_element_set(oa, 0, s);
3488 case THREAD_STATE_BLOCKED:
3489 oa = builtin_anewarray(1, class_java_lang_String);
3494 s = javastring_new(utf_new_char("BLOCKED"));
3499 array_objectarray_element_set(oa, 0, s);
3502 case THREAD_STATE_WAITING:
3503 oa = builtin_anewarray(2, class_java_lang_String);
3508 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3509 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3514 array_objectarray_element_set(oa, 0, s);
3515 /* array_objectarray_element_set(oa, 1, s); */
3518 case THREAD_STATE_TIMED_WAITING:
3519 oa = builtin_anewarray(3, class_java_lang_String);
3524 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3525 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3526 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3531 /* array_objectarray_element_set(oa, 0, s); */
3532 array_objectarray_element_set(oa, 0, s);
3533 /* array_objectarray_element_set(oa, 2, s); */
3536 case THREAD_STATE_TERMINATED:
3537 oa = builtin_anewarray(1, class_java_lang_String);
3542 s = javastring_new(utf_new_char("TERMINATED"));
3547 array_objectarray_element_set(oa, 0, s);
3551 /* Unknown state - probably incompatible JDK version */
3555 return (jobjectArray) oa;
3559 /* JVM_GetVersionInfo */
3561 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3563 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3567 /* OS: JVM_RegisterSignal */
3569 void *JVM_RegisterSignal(jint sig, void *handler)
3571 functionptr newHandler;
3573 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3575 if (handler == (void *) 2)
3576 newHandler = (functionptr) signal_thread_handler;
3578 newHandler = (functionptr) (uintptr_t) handler;
3585 /* These signals are already used by the VM. */
3589 /* This signal is used by the VM to dump thread stacks unless
3590 ReduceSignalUsage is set, in which case the user is allowed
3591 to set his own _native_ handler for this signal; thus, in
3592 either case, we do not allow JVM_RegisterSignal to change
3602 signal_register_signal(sig, newHandler, 0);
3604 /* XXX Should return old handler. */
3610 /* OS: JVM_RaiseSignal */
3612 jboolean JVM_RaiseSignal(jint sig)
3614 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3620 /* OS: JVM_FindSignal */
3622 jint JVM_FindSignal(const char *name)
3624 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3626 #if defined(__LINUX__)
3627 if (strcmp(name, "HUP") == 0)
3630 if (strcmp(name, "INT") == 0)
3633 if (strcmp(name, "TERM") == 0)
3636 # error not implemented for this OS
3644 * These are local overrides for various environment variables in Emacs.
3645 * Please do not remove this and leave it at the end of the file, where
3646 * Emacs will automagically detect them.
3647 * ---------------------------------------------------------------------
3650 * indent-tabs-mode: t