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_Runtime.h"
67 #include "native/vm/java_lang_Thread.h"
68 #include "native/vm/java_lang_reflect_Constructor.h"
69 #include "native/vm/java_lang_reflect_Method.h"
70 #include "native/vm/reflect.h"
72 #include "threads/lock-common.h"
73 #include "threads/threads-common.h"
75 #include "toolbox/logging.h"
76 #include "toolbox/list.h"
80 #if defined(ENABLE_ASSERTION)
81 #include "vm/assertion.h"
84 #include "vm/builtin.h"
85 #include "vm/exceptions.h"
86 #include "vm/global.h"
87 #include "vm/initialize.h"
88 #include "vm/package.h"
89 #include "vm/primitive.h"
90 #include "vm/properties.h"
91 #include "vm/resolve.h"
92 #include "vm/signallocal.h"
93 #include "vm/stringlocal.h"
96 #include "vm/jit/stacktrace.h"
98 #include "vmcore/classcache.h"
99 #include "vmcore/options.h"
100 #include "vmcore/system.h"
103 /* debugging macros ***********************************************************/
107 # define TRACEJVMCALLS(...) \
109 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
110 log_println(__VA_ARGS__); \
114 # define TRACEJVMCALLSVERBOSE(x) \
116 if (opt_TraceJVMCallsVerbose) { \
121 # define PRINTJVMWARNINGS(...)
123 /* if (opt_PrintJVMWarnings) { \ */
124 /* log_println(__VA_ARGS__); \ */
130 # define TRACEJVMCALLS(...)
131 # define TRACEJVMCALLSVERBOSE(x)
132 # define PRINTJVMWARNINGS(...)
138 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
139 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
140 /* and build number (xx) */
141 unsigned int update_version : 8; /* Update release version (uu) */
142 unsigned int special_update_version : 8; /* Special update release version (c) */
143 unsigned int reserved1 : 16;
144 unsigned int reserved2;
146 /* The following bits represents JVM supports that JDK has dependency on.
147 * JDK can use these bits to determine which JVM version
148 * and support it has to maintain runtime compatibility.
150 * When a new bit is added in a minor or update release, make sure
151 * the new bit is also added in the main/baseline.
153 unsigned int is_attachable : 1;
161 * A structure used to a capture exception table entry in a Java method.
168 } JVM_ExceptionTableEntryType;
171 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
173 if ((intptr_t) count <= 0)
176 return vsnprintf(str, count, fmt, args);
180 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
186 len = jio_vsnprintf(str, count, fmt, ap);
193 int jio_fprintf(FILE* f, const char *fmt, ...)
195 log_println("jio_fprintf: IMPLEMENT ME!");
201 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
203 log_println("jio_vfprintf: IMPLEMENT ME!");
209 int jio_printf(const char *fmt, ...)
211 log_println("jio_printf: IMPLEMENT ME!");
217 /* JVM_GetInterfaceVersion */
219 jint JVM_GetInterfaceVersion()
221 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
223 #define JVM_INTERFACE_VERSION 4
225 return JVM_INTERFACE_VERSION;
229 /* JVM_CurrentTimeMillis */
231 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
233 TRACEJVMCALLS("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored);
235 return (jlong) builtin_currenttimemillis();
241 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
243 TRACEJVMCALLS("JVM_NanoTime(env=%p, ignored=%p)", env, ignored);
245 return (jlong) builtin_nanotime();
251 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
256 s = (java_handle_t *) src;
257 d = (java_handle_t *) dst;
259 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));
261 builtin_arraycopy(s, src_pos, d, dst_pos, length);
265 /* JVM_InitProperties */
267 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
271 TRACEJVMCALLS("JVM_InitProperties(env=%p, properties=%p)", env, properties);
273 h = (java_handle_t *) properties;
275 properties_system_add_all(h);
283 void JVM_Exit(jint code)
285 log_println("JVM_Exit: IMPLEMENT ME!");
291 void JVM_Halt(jint code)
293 TRACEJVMCALLS("JVM_Halt(code=%d)", code);
300 /* JVM_OnExit(void (*func)) */
302 void JVM_OnExit(void (*func)(void))
304 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
312 TRACEJVMCALLS("JVM_GC()");
318 /* JVM_MaxObjectInspectionAge */
320 jlong JVM_MaxObjectInspectionAge(void)
322 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
328 /* JVM_TraceInstructions */
330 void JVM_TraceInstructions(jboolean on)
332 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
336 /* JVM_TraceMethodCalls */
338 void JVM_TraceMethodCalls(jboolean on)
340 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
344 /* JVM_TotalMemory */
346 jlong JVM_TotalMemory(void)
348 TRACEJVMCALLS("JVM_TotalMemory()");
350 return gc_get_heap_size();
356 jlong JVM_FreeMemory(void)
358 TRACEJVMCALLS("JVM_FreeMemory()");
360 return gc_get_free_bytes();
366 jlong JVM_MaxMemory(void)
368 TRACEJVMCALLS("JVM_MaxMemory()");
370 return gc_get_max_heap_size();
374 /* JVM_ActiveProcessorCount */
376 jint JVM_ActiveProcessorCount(void)
378 TRACEJVMCALLS("JVM_ActiveProcessorCount()");
380 return system_processors_online();
384 /* JVM_FillInStackTrace */
386 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
388 java_lang_Throwable *o;
389 java_handle_bytearray_t *ba;
391 TRACEJVMCALLS("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver);
393 o = (java_lang_Throwable *) receiver;
395 ba = stacktrace_get();
400 LLNI_field_set_ref(o, backtrace, (java_lang_Object *) ba);
404 /* JVM_PrintStackTrace */
406 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
408 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
412 /* JVM_GetStackTraceDepth */
414 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
416 java_lang_Throwable *t;
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 t = (java_lang_Throwable *) throwable;
430 LLNI_field_get_ref(t, backtrace, ba);
435 /* We need a critical section here as the stacktrace structure is
436 mapped onto a Java byte-array. */
440 st = (stacktrace_t *) LLNI_array_data(ba);
450 /* JVM_GetStackTraceElement */
452 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
454 java_lang_Throwable *t;
455 java_handle_bytearray_t *ba;
457 stacktrace_entry_t *ste;
461 java_lang_StackTraceElement *o;
462 java_lang_String *declaringclass;
463 java_lang_String *filename;
466 TRACEJVMCALLS("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index);
468 t = (java_lang_Throwable *) throwable;
470 LLNI_field_get_ref(t, backtrace, ba);
472 /* FIXME critical section */
474 st = (stacktrace_t *) LLNI_array_data(ba);
476 if ((index < 0) || (index >= st->length)) {
477 /* XXX This should be an IndexOutOfBoundsException (check this
480 exceptions_throw_arrayindexoutofboundsexception();
484 /* Get the stacktrace entry. */
486 ste = &(st->entries[index]);
488 /* Get the codeinfo, methodinfo and classinfo. */
494 /* allocate a new StackTraceElement */
496 o = (java_lang_StackTraceElement *)
497 builtin_new(class_java_lang_StackTraceElement);
504 if (!(m->flags & ACC_NATIVE)) {
505 if (c->sourcefile != NULL)
506 filename = (java_lang_String *) javastring_new(c->sourcefile);
513 /* get line number */
515 if (m->flags & ACC_NATIVE) {
519 /* FIXME The linenumbertable_linenumber_for_pc could change
520 the methodinfo pointer when hitting an inlined method. */
522 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
523 linenumber = (linenumber == 0) ? -1 : linenumber;
526 /* get declaring class name */
528 declaringclass = _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(c));
530 /* fill the java.lang.StackTraceElement element */
532 /* FIXME critical section */
534 o->declaringClass = declaringclass;
535 o->methodName = (java_lang_String *) javastring_new(m->name);
536 o->fileName = filename;
537 o->lineNumber = linenumber;
545 jint JVM_IHashCode(JNIEnv* env, jobject handle)
547 TRACEJVMCALLS("JVM_IHashCode(env=%p, jobject=%p)", env, handle);
549 return (jint) ((ptrint) handle);
553 /* JVM_MonitorWait */
555 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
557 #if defined(ENABLE_THREADS)
561 TRACEJVMCALLS("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms);
563 /* exceptions_throw_illegalargumentexception("argument out of range"); */
564 exceptions_throw_illegalargumentexception();
568 #if defined(ENABLE_THREADS)
569 o = (java_handle_t *) handle;
571 lock_wait_for_object(o, ms, 0);
576 /* JVM_MonitorNotify */
578 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
580 #if defined(ENABLE_THREADS)
584 TRACEJVMCALLS("JVM_MonitorNotify(env=%p, handle=%p)", env, handle);
586 #if defined(ENABLE_THREADS)
587 o = (java_handle_t *) handle;
589 lock_notify_object(o);
594 /* JVM_MonitorNotifyAll */
596 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
598 #if defined(ENABLE_THREADS)
602 TRACEJVMCALLS("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle);
604 #if defined(ENABLE_THREADS)
605 o = (java_handle_t *) handle;
607 lock_notify_all_object(o);
614 jobject JVM_Clone(JNIEnv* env, jobject handle)
616 TRACEJVMCALLS("JVM_Clone(env=%p, handle=%p)", env, handle);
618 return (jobject) builtin_clone(env, (java_handle_t *) handle);
622 /* JVM_InitializeCompiler */
624 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
626 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
630 /* JVM_IsSilentCompiler */
632 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
634 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
640 /* JVM_CompileClass */
642 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
644 log_println("JVM_CompileClass: IMPLEMENT ME!");
650 /* JVM_CompileClasses */
652 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
654 log_println("JVM_CompileClasses: IMPLEMENT ME!");
660 /* JVM_CompilerCommand */
662 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
664 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
670 /* JVM_EnableCompiler */
672 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
674 TRACEJVMCALLS("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls);
675 PRINTJVMWARNINGS("JVM_EnableCompiler not supported");
679 /* JVM_DisableCompiler */
681 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
683 TRACEJVMCALLS("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls);
684 PRINTJVMWARNINGS("JVM_DisableCompiler not supported");
688 /* JVM_GetLastErrorString */
690 jint JVM_GetLastErrorString(char *buf, int len)
716 char *JVM_NativePath(char *path)
718 TRACEJVMCALLS("JVM_NativePath(path=%s)", path);
720 /* XXX is this correct? */
726 /* JVM_GetCallerClass */
728 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
730 java_handle_objectarray_t *oa;
732 TRACEJVMCALLS("JVM_GetCallerClass(env=%p, depth=%d)", env, depth);
734 oa = stacktrace_getClassContext();
739 if (oa->header.size < depth)
742 return (jclass) oa->data[depth - 1];
747 /* JVM_FindPrimitiveClass */
749 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
754 TRACEJVMCALLS("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s);
757 c = primitive_class_get_by_name(u);
759 return (jclass) LLNI_classinfo_wrap(c);
763 /* JVM_ResolveClass */
765 void JVM_ResolveClass(JNIEnv* env, jclass cls)
767 TRACEJVMCALLS("JVM_ResolveClass(env=%p, cls=%p)", env, cls);
768 PRINTJVMWARNINGS("JVM_ResolveClass not implemented");
772 /* JVM_FindClassFromClassLoader */
774 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
780 TRACEJVMCALLS("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError);
782 u = utf_new_char(name);
783 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
785 c = load_class_from_classloader(u, cl);
791 if (!(c->state & CLASS_INITIALIZED))
792 if (!initialize_class(c))
795 return (jclass) LLNI_classinfo_wrap(c);
799 /* JVM_FindClassFromClass */
801 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
803 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
809 /* JVM_DefineClass */
811 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
813 log_println("JVM_DefineClass: IMPLEMENT ME!");
819 /* JVM_DefineClassWithSource */
821 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
827 TRACEJVMCALLS("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source);
830 u = utf_new_char(name);
834 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
836 /* XXX do something with source */
838 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
840 return (jclass) LLNI_classinfo_wrap(c);
844 /* JVM_FindLoadedClass */
846 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
852 TRACEJVMCALLS("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name);
854 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
856 u = javastring_toutf((java_handle_t *) name, true);
857 c = classcache_lookup(cl, u);
859 return (jclass) LLNI_classinfo_wrap(c);
863 /* JVM_GetClassName */
865 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
867 TRACEJVMCALLS("JVM_GetClassName(env=%p, cls=%p)", env, cls);
869 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
873 /* JVM_GetClassInterfaces */
875 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
878 java_handle_objectarray_t *oa;
880 TRACEJVMCALLS("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls);
882 c = LLNI_classinfo_unwrap(cls);
884 oa = class_get_interfaces(c);
886 return (jobjectArray) oa;
890 /* JVM_GetClassLoader */
892 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
897 TRACEJVMCALLS("JVM_GetClassLoader(env=%p, cls=%p)", env, cls);
899 c = LLNI_classinfo_unwrap(cls);
900 cl = class_get_classloader(c);
906 /* JVM_IsInterface */
908 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
912 TRACEJVMCALLS("JVM_IsInterface(env=%p, cls=%p)", env, cls);
914 c = LLNI_classinfo_unwrap(cls);
916 return class_is_interface(c);
920 /* JVM_GetClassSigners */
922 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
924 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
930 /* JVM_SetClassSigners */
932 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
935 java_handle_objectarray_t *hoa;
937 TRACEJVMCALLS("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers);
939 c = LLNI_classinfo_unwrap(cls);
941 hoa = (java_handle_objectarray_t *) signers;
943 /* This call is ignored for primitive types and arrays. Signers
944 are only set once, ClassLoader.java, and thus shouldn't be
945 called with an array. Only the bootstrap loader creates
948 if (class_is_primitive(c) || class_is_array(c))
951 LLNI_classinfo_field_set(c, signers, hoa);
955 /* JVM_GetProtectionDomain */
957 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
961 TRACEJVMCALLS("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls);
963 c = LLNI_classinfo_unwrap(cls);
966 exceptions_throw_nullpointerexception();
970 /* Primitive types do not have a protection domain. */
972 if (class_is_primitive(c))
975 return (jobject) c->protectiondomain;
979 /* JVM_SetProtectionDomain */
981 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
983 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
987 /* JVM_DoPrivileged */
989 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
994 java_handle_t *result;
997 TRACEJVMCALLS("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException);
999 o = (java_handle_t *) action;
1000 c = o->vftbl->class;
1002 if (action == NULL) {
1003 exceptions_throw_nullpointerexception();
1007 /* lookup run() method (throw no exceptions) */
1009 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1012 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1013 exceptions_throw_internalerror("No run method");
1017 /* XXX It seems something with a privileged stack needs to be done
1020 result = vm_call_method(m, o);
1022 e = exceptions_get_and_clear_exception();
1025 exceptions_throw_privilegedactionexception(e);
1029 return (jobject) result;
1033 /* JVM_GetInheritedAccessControlContext */
1035 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1037 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1043 /* JVM_GetStackAccessControlContext */
1045 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1047 TRACEJVMCALLS("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls);
1049 /* XXX All stuff I tested so far works without that function. At
1050 some point we have to implement it, but I disable the output
1051 for now to make IcedTea happy. */
1057 /* JVM_IsArrayClass */
1059 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1063 TRACEJVMCALLS("JVM_IsArrayClass(env=%p, cls=%p)", env, cls);
1065 c = LLNI_classinfo_unwrap(cls);
1067 return class_is_array(c);
1071 /* JVM_IsPrimitiveClass */
1073 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1077 TRACEJVMCALLS("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls);
1079 c = LLNI_classinfo_unwrap(cls);
1081 return class_is_primitive(c);
1085 /* JVM_GetComponentType */
1087 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1089 classinfo *component;
1092 TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
1094 c = LLNI_classinfo_unwrap(cls);
1096 component = class_get_componenttype(c);
1098 return (jclass) LLNI_classinfo_wrap(component);
1102 /* JVM_GetClassModifiers */
1104 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1109 TRACEJVMCALLS("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls);
1111 c = LLNI_classinfo_unwrap(cls);
1113 flags = class_get_modifiers(c, false);
1119 /* JVM_GetDeclaredClasses */
1121 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1124 java_handle_objectarray_t *oa;
1126 TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
1128 c = LLNI_classinfo_unwrap(ofClass);
1130 oa = class_get_declaredclasses(c, false);
1132 return (jobjectArray) oa;
1136 /* JVM_GetDeclaringClass */
1138 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1143 TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
1145 c = LLNI_classinfo_unwrap(ofClass);
1147 dc = class_get_declaringclass(c);
1149 return (jclass) LLNI_classinfo_wrap(dc);
1153 /* JVM_GetClassSignature */
1155 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1161 TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
1163 c = LLNI_classinfo_unwrap(cls);
1165 /* Get the signature of the class. */
1167 u = class_get_signature(c);
1172 /* Convert UTF-string to a Java-string. */
1174 s = javastring_new(u);
1180 /* JVM_GetClassAnnotations */
1182 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1184 classinfo *c = NULL; /* classinfo for 'cls' */
1185 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1187 TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
1190 exceptions_throw_nullpointerexception();
1194 c = LLNI_classinfo_unwrap(cls);
1196 /* get annotations: */
1197 annotations = class_get_annotations(c);
1199 return (jbyteArray)annotations;
1203 /* JVM_GetFieldAnnotations */
1205 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1207 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1208 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1210 TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
1212 if (field == NULL) {
1213 exceptions_throw_nullpointerexception();
1217 rf = (java_lang_reflect_Field*)field;
1219 LLNI_field_get_ref(rf, annotations, ba);
1221 return (jbyteArray)ba;
1225 /* JVM_GetMethodAnnotations */
1227 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1229 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1230 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1232 TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
1234 if (method == NULL) {
1235 exceptions_throw_nullpointerexception();
1239 rm = (java_lang_reflect_Method*)method;
1241 LLNI_field_get_ref(rm, annotations, ba);
1243 return (jbyteArray)ba;
1247 /* JVM_GetMethodDefaultAnnotationValue */
1249 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1251 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1252 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1254 TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
1256 if (method == NULL) {
1257 exceptions_throw_nullpointerexception();
1261 rm = (java_lang_reflect_Method*)method;
1263 LLNI_field_get_ref(rm, annotationDefault, ba);
1265 return (jbyteArray)ba;
1269 /* JVM_GetMethodParameterAnnotations */
1271 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1273 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1274 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1276 TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
1278 if (method == NULL) {
1279 exceptions_throw_nullpointerexception();
1283 rm = (java_lang_reflect_Method*)method;
1285 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1287 return (jbyteArray)ba;
1291 /* JVM_GetClassDeclaredFields */
1293 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1295 TRACEJVMCALLS("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly);
1297 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1301 /* JVM_GetClassDeclaredMethods */
1303 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1305 TRACEJVMCALLS("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly);
1307 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1311 /* JVM_GetClassDeclaredConstructors */
1313 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1315 TRACEJVMCALLS("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly);
1317 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1321 /* JVM_GetClassAccessFlags */
1323 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1327 TRACEJVMCALLS("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls);
1329 c = LLNI_classinfo_unwrap(cls);
1331 /* Primitive type classes have the correct access flags. */
1333 return c->flags & ACC_CLASS_REFLECT_MASK;
1337 /* JVM_GetClassConstantPool */
1339 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1341 #if defined(ENABLE_ANNOTATIONS)
1342 sun_reflect_ConstantPool *constantPool = NULL;
1343 /* constant pool object for the class refered by 'cls' */
1344 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1345 /* constantPoolOop field of the constant pool object */
1347 TRACEJVMCALLS("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls);
1350 (sun_reflect_ConstantPool*)native_new_and_init(
1351 class_sun_reflect_ConstantPool);
1353 if (constantPool == NULL) {
1358 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1360 return (jobject)constantPool;
1362 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1368 /* JVM_ConstantPoolGetSize */
1370 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1372 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1374 TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
1376 c = LLNI_classinfo_unwrap(jcpool);
1382 /* JVM_ConstantPoolGetClassAt */
1384 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1386 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1387 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1388 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1390 TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
1392 c = LLNI_classinfo_unwrap(jcpool);
1394 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1397 exceptions_throw_illegalargumentexception();
1401 result = resolve_classref_eager(ref);
1403 return (jclass) LLNI_classinfo_wrap(result);
1407 /* JVM_ConstantPoolGetClassAtIfLoaded */
1409 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1411 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1412 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1413 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1415 TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
1417 c = LLNI_classinfo_unwrap(jcpool);
1419 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1422 exceptions_throw_illegalargumentexception();
1426 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1430 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1434 return (jclass) LLNI_classinfo_wrap(result);
1438 /* JVM_ConstantPoolGetMethodAt */
1440 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1442 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1443 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1445 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
1447 cls = LLNI_classinfo_unwrap(jcpool);
1448 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1451 exceptions_throw_illegalargumentexception();
1455 /* XXX: is that right? or do I have to use resolve_method_*? */
1456 return (jobject)reflect_method_new(ref->p.method);
1460 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1462 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1464 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1465 classinfo *c = NULL; /* resolved declaring class of the method */
1466 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1468 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1470 cls = LLNI_classinfo_unwrap(jcpool);
1471 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1474 exceptions_throw_illegalargumentexception();
1478 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1482 if (c == NULL || !(c->state & CLASS_LOADED)) {
1486 return (jobject)reflect_method_new(ref->p.method);
1490 /* JVM_ConstantPoolGetFieldAt */
1492 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1494 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1495 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1497 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
1499 cls = LLNI_classinfo_unwrap(jcpool);
1500 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1503 exceptions_throw_illegalargumentexception();
1507 return (jobject)reflect_field_new(ref->p.field);
1511 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1513 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1515 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1516 classinfo *c; /* resolved declaring class for the field */
1517 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1519 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1521 cls = LLNI_classinfo_unwrap(jcpool);
1522 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1525 exceptions_throw_illegalargumentexception();
1529 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1533 if (c == NULL || !(c->state & CLASS_LOADED)) {
1537 return (jobject)reflect_field_new(ref->p.field);
1541 /* JVM_ConstantPoolGetMemberRefInfoAt */
1543 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1545 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1547 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1553 /* JVM_ConstantPoolGetIntAt */
1555 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1557 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1558 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1560 TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
1562 cls = LLNI_classinfo_unwrap(jcpool);
1563 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1566 exceptions_throw_illegalargumentexception();
1574 /* JVM_ConstantPoolGetLongAt */
1576 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1578 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1579 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1581 TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
1583 cls = LLNI_classinfo_unwrap(jcpool);
1584 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1587 exceptions_throw_illegalargumentexception();
1595 /* JVM_ConstantPoolGetFloatAt */
1597 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1599 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1600 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1602 TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
1604 cls = LLNI_classinfo_unwrap(jcpool);
1605 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1608 exceptions_throw_illegalargumentexception();
1616 /* JVM_ConstantPoolGetDoubleAt */
1618 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1620 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1621 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1623 TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
1625 cls = LLNI_classinfo_unwrap(jcpool);
1626 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1629 exceptions_throw_illegalargumentexception();
1637 /* JVM_ConstantPoolGetStringAt */
1639 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1641 utf *ref; /* utf object for the string in constant pool at index 'index' */
1642 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1644 TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
1646 cls = LLNI_classinfo_unwrap(jcpool);
1647 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1650 exceptions_throw_illegalargumentexception();
1654 /* XXX: I hope literalstring_new is the right Function. */
1655 return (jstring)literalstring_new(ref);
1659 /* JVM_ConstantPoolGetUTF8At */
1661 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1663 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1664 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1666 TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
1668 cls = LLNI_classinfo_unwrap(jcpool);
1669 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1672 exceptions_throw_illegalargumentexception();
1676 /* XXX: I hope literalstring_new is the right Function. */
1677 return (jstring)literalstring_new(ref);
1681 /* JVM_DesiredAssertionStatus */
1683 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1685 #if defined(ENABLE_ASSERTION)
1686 assertion_name_t *item;
1691 TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
1693 c = LLNI_classinfo_unwrap(cls);
1695 if (c->classloader == NULL) {
1696 status = (jboolean)assertion_system_enabled;
1699 status = (jboolean)assertion_user_enabled;
1702 if (list_assertion_names != NULL) {
1703 item = (assertion_name_t *)list_first(list_assertion_names);
1704 while (item != NULL) {
1705 name = utf_new_char(item->name);
1706 if (name == c->packagename) {
1707 status = (jboolean)item->enabled;
1709 else if (name == c->name) {
1710 status = (jboolean)item->enabled;
1713 item = (assertion_name_t *)list_next(list_assertion_names, item);
1719 return (jboolean)false;
1724 /* JVM_AssertionStatusDirectives */
1726 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1729 java_lang_AssertionStatusDirectives *o;
1730 java_handle_objectarray_t *classes;
1731 java_handle_objectarray_t *packages;
1732 java_booleanarray_t *classEnabled;
1733 java_booleanarray_t *packageEnabled;
1734 #if defined(ENABLE_ASSERTION)
1735 assertion_name_t *item;
1740 TRACEJVMCALLS("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused);
1742 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1747 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1752 #if defined(ENABLE_ASSERTION)
1753 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1755 classes = builtin_anewarray(0, class_java_lang_Object);
1757 if (classes == NULL)
1760 #if defined(ENABLE_ASSERTION)
1761 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1763 packages = builtin_anewarray(0, class_java_lang_Object);
1765 if (packages == NULL)
1768 #if defined(ENABLE_ASSERTION)
1769 classEnabled = builtin_newarray_boolean(assertion_class_count);
1771 classEnabled = builtin_newarray_boolean(0);
1773 if (classEnabled == NULL)
1776 #if defined(ENABLE_ASSERTION)
1777 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1779 packageEnabled = builtin_newarray_boolean(0);
1781 if (packageEnabled == NULL)
1784 #if defined(ENABLE_ASSERTION)
1785 /* initialize arrays */
1787 if (list_assertion_names != NULL) {
1791 item = (assertion_name_t *)list_first(list_assertion_names);
1792 while (item != NULL) {
1793 js = javastring_new_from_ascii(item->name);
1798 if (item->package == false) {
1799 classes->data[i] = js;
1800 classEnabled->data[i] = (jboolean) item->enabled;
1804 packages->data[j] = js;
1805 packageEnabled->data[j] = (jboolean) item->enabled;
1809 item = (assertion_name_t *)list_next(list_assertion_names, item);
1814 /* set instance fields */
1816 o->classes = classes;
1817 o->packages = packages;
1818 o->classEnabled = classEnabled;
1819 o->packageEnabled = packageEnabled;
1825 /* JVM_GetClassNameUTF */
1827 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1829 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1835 /* JVM_GetClassCPTypes */
1837 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1839 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1843 /* JVM_GetClassCPEntriesCount */
1845 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1847 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1853 /* JVM_GetClassFieldsCount */
1855 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1857 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1863 /* JVM_GetClassMethodsCount */
1865 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1867 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1873 /* JVM_GetMethodIxExceptionIndexes */
1875 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1877 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1881 /* JVM_GetMethodIxExceptionsCount */
1883 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1885 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1891 /* JVM_GetMethodIxByteCode */
1893 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1895 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1899 /* JVM_GetMethodIxByteCodeLength */
1901 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1903 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1909 /* JVM_GetMethodIxExceptionTableEntry */
1911 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1913 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1917 /* JVM_GetMethodIxExceptionTableLength */
1919 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1921 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1927 /* JVM_GetMethodIxModifiers */
1929 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1931 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1937 /* JVM_GetFieldIxModifiers */
1939 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1941 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1947 /* JVM_GetMethodIxLocalsCount */
1949 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1951 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1957 /* JVM_GetMethodIxArgsSize */
1959 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1961 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1967 /* JVM_GetMethodIxMaxStack */
1969 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1971 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1977 /* JVM_IsConstructorIx */
1979 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1981 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1987 /* JVM_GetMethodIxNameUTF */
1989 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1991 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1997 /* JVM_GetMethodIxSignatureUTF */
1999 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
2001 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
2007 /* JVM_GetCPFieldNameUTF */
2009 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2011 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
2017 /* JVM_GetCPMethodNameUTF */
2019 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2021 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
2027 /* JVM_GetCPMethodSignatureUTF */
2029 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2031 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
2037 /* JVM_GetCPFieldSignatureUTF */
2039 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2041 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2047 /* JVM_GetCPClassNameUTF */
2049 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2051 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2057 /* JVM_GetCPFieldClassNameUTF */
2059 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2061 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2067 /* JVM_GetCPMethodClassNameUTF */
2069 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2071 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2077 /* JVM_GetCPFieldModifiers */
2079 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2081 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2087 /* JVM_GetCPMethodModifiers */
2089 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2091 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2097 /* JVM_ReleaseUTF */
2099 void JVM_ReleaseUTF(const char *utf)
2101 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2105 /* JVM_IsSameClassPackage */
2107 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2109 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2117 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2120 * JVM I/O error codes
2122 #define JVM_EEXIST -100
2124 jint JVM_Open(const char *fname, jint flags, jint mode)
2128 TRACEJVMCALLS("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode);
2130 result = system_open(fname, flags, mode);
2148 jint JVM_Close(jint fd)
2150 TRACEJVMCALLS("JVM_Close(fd=%d)", fd);
2152 return system_close(fd);
2158 jint JVM_Read(jint fd, char *buf, jint nbytes)
2160 TRACEJVMCALLS("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes);
2162 return system_read(fd, buf, nbytes);
2168 jint JVM_Write(jint fd, char *buf, jint nbytes)
2170 TRACEJVMCALLS("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes);
2172 return system_write(fd, buf, nbytes);
2178 jint JVM_Available(jint fd, jlong *pbytes)
2180 #if defined(FIONREAD)
2184 TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
2188 result = ioctl(fd, FIONREAD, &bytes);
2197 # error FIONREAD not defined
2204 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2206 TRACEJVMCALLS("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence);
2208 return (jlong) system_lseek(fd, (off_t) offset, whence);
2214 jint JVM_SetLength(jint fd, jlong length)
2216 TRACEJVMCALLS("JVM_SetLength(fd=%d, length=%ld)", length);
2218 return system_ftruncate(fd, length);
2224 jint JVM_Sync(jint fd)
2226 TRACEJVMCALLS("JVM_Sync(fd=%d)", fd);
2228 return system_fsync(fd);
2232 /* JVM_StartThread */
2234 void JVM_StartThread(JNIEnv* env, jobject jthread)
2236 TRACEJVMCALLS("JVM_StartThread(env=%p, jthread=%p)", env, jthread);
2238 _Jv_java_lang_Thread_start((java_lang_Thread *) jthread, 0);
2242 /* JVM_StopThread */
2244 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2246 log_println("JVM_StopThread: IMPLEMENT ME!");
2250 /* JVM_IsThreadAlive */
2252 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2258 TRACEJVMCALLS("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread);
2260 /* XXX this is just a quick hack */
2262 for (t = threads_list_first(); t != NULL; t = threads_list_next(t)) {
2263 LLNI_equals(t->object, jthread, equal);
2269 /* The threadobject is null when a thread is created in Java. The
2270 priority is set later during startup. */
2275 result = threads_thread_is_alive(t);
2281 /* JVM_SuspendThread */
2283 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2285 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2289 /* JVM_ResumeThread */
2291 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2293 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2297 /* JVM_SetThreadPriority */
2299 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2301 TRACEJVMCALLS("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio);
2303 _Jv_java_lang_Thread_setPriority((java_lang_Thread *) jthread, prio);
2309 void JVM_Yield(JNIEnv *env, jclass threadClass)
2311 TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
2319 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2321 TRACEJVMCALLS("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis);
2323 _Jv_java_lang_Thread_sleep(millis);
2327 /* JVM_CurrentThread */
2329 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2331 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2333 return (jobject) _Jv_java_lang_Thread_currentThread();
2337 /* JVM_CountStackFrames */
2339 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2341 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2349 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2351 log_println("JVM_Interrupt: IMPLEMENT ME!");
2355 /* JVM_IsInterrupted */
2357 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2359 TRACEJVMCALLS("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted);
2361 /* XXX do something with clear_interrupted */
2363 return _Jv_java_lang_Thread_isInterrupted((java_lang_Thread *) jthread);
2369 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2374 TRACEJVMCALLS("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj);
2376 h = (java_handle_t *) obj;
2379 exceptions_throw_nullpointerexception();
2383 result = lock_is_held_by_current_thread(h);
2389 /* JVM_DumpAllStacks */
2391 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2393 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2397 /* JVM_CurrentLoadedClass */
2399 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2401 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2407 /* JVM_CurrentClassLoader */
2409 jobject JVM_CurrentClassLoader(JNIEnv *env)
2411 /* XXX if a method in a class in a trusted loader is in a
2412 doPrivileged, return NULL */
2414 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2420 /* JVM_GetClassContext */
2422 jobjectArray JVM_GetClassContext(JNIEnv *env)
2424 TRACEJVMCALLS("JVM_GetClassContext(env=%p)", env);
2426 return (jobjectArray) stacktrace_getClassContext();
2430 /* JVM_ClassDepth */
2432 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2434 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2440 /* JVM_ClassLoaderDepth */
2442 jint JVM_ClassLoaderDepth(JNIEnv *env)
2444 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2450 /* JVM_GetSystemPackage */
2452 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2458 TRACEJVMCALLS("JVM_GetSystemPackage(env=%p, name=%p)", env, name);
2460 /* s = package_find(name); */
2461 u = javastring_toutf((java_handle_t *) name, false);
2463 result = package_find(u);
2466 s = javastring_new(result);
2474 /* JVM_GetSystemPackages */
2476 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2478 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2484 /* JVM_AllocateNewObject */
2486 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2488 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2494 /* JVM_AllocateNewArray */
2496 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2498 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2504 /* JVM_LatestUserDefinedLoader */
2506 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2510 TRACEJVMCALLS("JVM_LatestUserDefinedLoader(env=%p)", env);
2512 cl = stacktrace_first_nonnull_classloader();
2514 return (jobject) cl;
2518 /* JVM_LoadClass0 */
2520 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2522 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2528 /* JVM_GetArrayLength */
2530 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2534 TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
2536 a = (java_handle_t *) arr;
2538 return array_length_get(a);
2542 /* JVM_GetArrayElement */
2544 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2549 TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
2551 a = (java_handle_t *) arr;
2553 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2554 /* exceptions_throw_illegalargumentexception(); */
2558 o = array_element_get(a, index);
2564 /* JVM_GetPrimitiveArrayElement */
2566 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2570 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2578 /* JVM_SetArrayElement */
2580 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2583 java_handle_t *value;
2585 TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
2587 a = (java_handle_t *) arr;
2588 value = (java_handle_t *) val;
2590 array_element_set(a, index, value);
2594 /* JVM_SetPrimitiveArrayElement */
2596 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2598 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2604 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2609 java_handle_objectarray_t *oa;
2611 TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
2613 if (eltClass == NULL) {
2614 exceptions_throw_nullpointerexception();
2618 /* NegativeArraySizeException is checked in builtin_newarray. */
2620 c = LLNI_classinfo_unwrap(eltClass);
2622 /* create primitive or object array */
2624 if (class_is_primitive(c)) {
2625 pc = primitive_arrayclass_get_by_name(c->name);
2626 a = builtin_newarray(length, pc);
2631 oa = builtin_anewarray(length, c);
2633 return (jobject) oa;
2638 /* JVM_NewMultiArray */
2640 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2643 java_handle_intarray_t *ia;
2649 java_handle_objectarray_t *a;
2651 TRACEJVMCALLS("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim);
2653 if (eltClass == NULL) {
2654 exceptions_throw_nullpointerexception();
2658 /* NegativeArraySizeException is checked in builtin_newarray. */
2660 c = LLNI_classinfo_unwrap(eltClass);
2662 /* XXX This is just a quick hack to get it working. */
2664 ia = (java_handle_intarray_t *) dim;
2666 length = array_length_get((java_handle_t *) ia);
2668 dims = MNEW(long, length);
2670 for (i = 0; i < length; i++) {
2671 value = LLNI_array_direct(ia, i);
2672 dims[i] = (long) value;
2675 /* Create an array-class if necessary. */
2677 if (class_is_primitive(c))
2678 ac = primitive_arrayclass_get_by_name(c->name);
2680 ac = class_array_of(c, true);
2685 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2691 /* JVM_InitializeSocketLibrary */
2693 jint JVM_InitializeSocketLibrary()
2695 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2703 jint JVM_Socket(jint domain, jint type, jint protocol)
2705 TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
2707 return system_socket(domain, type, protocol);
2711 /* JVM_SocketClose */
2713 jint JVM_SocketClose(jint fd)
2715 TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
2717 return system_close(fd);
2721 /* JVM_SocketShutdown */
2723 jint JVM_SocketShutdown(jint fd, jint howto)
2725 TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
2727 return system_shutdown(fd, howto);
2733 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2735 log_println("JVM_Recv: IMPLEMENT ME!");
2743 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2745 log_println("JVM_Send: IMPLEMENT ME!");
2753 jint JVM_Timeout(int fd, long timeout)
2755 log_println("JVM_Timeout: IMPLEMENT ME!");
2763 jint JVM_Listen(jint fd, jint count)
2765 TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
2767 return system_listen(fd, count);
2773 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2775 TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
2777 return system_connect(fd, him, len);
2783 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2785 log_println("JVM_Bind: IMPLEMENT ME!");
2793 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2795 TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
2797 return system_accept(fd, him, (socklen_t *) len);
2803 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2805 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2811 /* JVM_GetSockName */
2813 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2815 TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
2817 return system_getsockname(fd, him, (socklen_t *) len);
2823 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2825 log_println("JVM_SendTo: IMPLEMENT ME!");
2831 /* JVM_SocketAvailable */
2833 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2835 #if defined(FIONREAD)
2839 TRACEJVMCALLS("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes);
2843 result = ioctl(fd, FIONREAD, &bytes);
2852 # error FIONREAD not defined
2857 /* JVM_GetSockOpt */
2859 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2861 TRACEJVMCALLS("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen);
2863 return system_getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2867 /* JVM_SetSockOpt */
2869 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2871 TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
2873 return system_setsockopt(fd, level, optname, optval, optlen);
2877 /* JVM_GetHostName */
2879 int JVM_GetHostName(char *name, int namelen)
2881 TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
2883 return system_gethostname(name, namelen);
2887 /* JVM_GetHostByAddr */
2889 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2891 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2897 /* JVM_GetHostByName */
2899 struct hostent *JVM_GetHostByName(char* name)
2901 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2907 /* JVM_GetProtoByName */
2909 struct protoent *JVM_GetProtoByName(char* name)
2911 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2917 /* JVM_LoadLibrary */
2919 void *JVM_LoadLibrary(const char *name)
2923 TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
2925 u = utf_new_char(name);
2927 return native_library_open(u);
2931 /* JVM_UnloadLibrary */
2933 void JVM_UnloadLibrary(void* handle)
2935 TRACEJVMCALLS("JVM_UnloadLibrary(handle=%p)", handle);
2937 native_library_close(handle);
2941 /* JVM_FindLibraryEntry */
2943 void *JVM_FindLibraryEntry(void *handle, const char *name)
2947 TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
2949 symbol = lt_dlsym(handle, name);
2957 jboolean JVM_IsNaN(jdouble a)
2959 log_println("JVM_IsNaN: IMPLEMENT ME!");
2965 /* JVM_IsSupportedJNIVersion */
2967 jboolean JVM_IsSupportedJNIVersion(jint version)
2969 TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
2971 return jni_version_check(version);
2975 /* JVM_InternString */
2977 jstring JVM_InternString(JNIEnv *env, jstring str)
2979 TRACEJVMCALLS("JVM_InternString(env=%p, str=%p)", env, str);
2981 return (jstring) javastring_intern((java_handle_t *) str);
2985 /* JVM_RawMonitorCreate */
2987 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2991 TRACEJVMCALLS("JVM_RawMonitorCreate()");
2993 o = NEW(java_object_t);
2995 lock_init_object_lock(o);
3001 /* JVM_RawMonitorDestroy */
3003 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3005 TRACEJVMCALLS("JVM_RawMonitorDestroy(mon=%p)", mon);
3007 FREE(mon, java_object_t);
3011 /* JVM_RawMonitorEnter */
3013 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3015 TRACEJVMCALLS("JVM_RawMonitorEnter(mon=%p)", mon);
3017 (void) lock_monitor_enter((java_object_t *) mon);
3023 /* JVM_RawMonitorExit */
3025 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3027 TRACEJVMCALLS("JVM_RawMonitorExit(mon=%p)", mon);
3029 (void) lock_monitor_exit((java_object_t *) mon);
3033 /* JVM_SetPrimitiveFieldValues */
3035 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3037 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3041 /* JVM_GetPrimitiveFieldValues */
3043 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3045 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3049 /* JVM_AccessVMBooleanFlag */
3051 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3053 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3059 /* JVM_AccessVMIntFlag */
3061 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3063 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3069 /* JVM_VMBreakPoint */
3071 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3073 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3077 /* JVM_GetClassFields */
3079 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3081 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3087 /* JVM_GetClassMethods */
3089 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3091 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3097 /* JVM_GetClassConstructors */
3099 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3101 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3107 /* JVM_GetClassField */
3109 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3111 log_println("JVM_GetClassField: IMPLEMENT ME!");
3117 /* JVM_GetClassMethod */
3119 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3121 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3127 /* JVM_GetClassConstructor */
3129 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3131 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3137 /* JVM_NewInstance */
3139 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3141 log_println("JVM_NewInstance: IMPLEMENT ME!");
3149 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3151 log_println("JVM_GetField: IMPLEMENT ME!");
3157 /* JVM_GetPrimitiveField */
3159 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3163 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3173 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3175 log_println("JVM_SetField: IMPLEMENT ME!");
3179 /* JVM_SetPrimitiveField */
3181 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3183 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3187 /* JVM_InvokeMethod */
3189 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3191 TRACEJVMCALLS("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0);
3193 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
3197 /* JVM_NewInstanceFromConstructor */
3199 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
3201 TRACEJVMCALLS("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, c, args0);
3203 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
3207 /* JVM_SupportsCX8 */
3209 jboolean JVM_SupportsCX8()
3211 TRACEJVMCALLS("JVM_SupportsCX8()");
3221 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3223 log_println("JVM_CX8Field: IMPLEMENT ME!");
3229 /* JVM_GetAllThreads */
3231 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3233 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3239 /* JVM_DumpThreads */
3241 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3243 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3249 /* JVM_GetManagement */
3251 void *JVM_GetManagement(jint version)
3253 TRACEJVMCALLS("JVM_GetManagement(version=%d)", version);
3255 /* TODO We current don't support the management interface. */
3261 /* JVM_InitAgentProperties */
3263 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3265 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3271 /* JVM_GetEnclosingMethodInfo */
3273 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3277 java_handle_objectarray_t *oa;
3279 TRACEJVMCALLS("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass);
3281 c = LLNI_classinfo_unwrap(ofClass);
3283 if ((c == NULL) || class_is_primitive(c))
3286 m = class_get_enclosingmethod(c);
3291 oa = builtin_anewarray(3, class_java_lang_Object);
3296 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->class));
3297 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3298 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3300 return (jobjectArray) oa;
3304 /* JVM_GetThreadStateValues */
3306 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3308 java_handle_intarray_t *ia;
3310 TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3311 env, javaThreadState);
3313 /* If new thread states are added in future JDK and VM versions,
3314 this should check if the JDK version is compatible with thread
3315 states supported by the VM. Return NULL if not compatible.
3317 This function must map the VM java_lang_Thread::ThreadStatus
3318 to the Java thread state that the JDK supports. */
3320 switch (javaThreadState) {
3321 case THREAD_STATE_NEW:
3322 ia = builtin_newarray_int(1);
3327 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3330 case THREAD_STATE_RUNNABLE:
3331 ia = builtin_newarray_int(1);
3336 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3339 case THREAD_STATE_BLOCKED:
3340 ia = builtin_newarray_int(1);
3345 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3348 case THREAD_STATE_WAITING:
3349 ia = builtin_newarray_int(2);
3354 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3355 /* XXX Implement parked stuff. */
3356 /* array_intarray_element_set(ia, 1, PARKED); */
3359 case THREAD_STATE_TIMED_WAITING:
3360 ia = builtin_newarray_int(3);
3365 /* XXX Not sure about that one. */
3366 /* array_intarray_element_set(ia, 0, SLEEPING); */
3367 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3368 /* XXX Implement parked stuff. */
3369 /* array_intarray_element_set(ia, 2, PARKED); */
3372 case THREAD_STATE_TERMINATED:
3373 ia = builtin_newarray_int(1);
3378 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3382 /* Unknown state - probably incompatible JDK version */
3386 return (jintArray) ia;
3390 /* JVM_GetThreadStateNames */
3392 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3394 java_handle_intarray_t *ia;
3395 java_handle_objectarray_t *oa;
3398 TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3399 env, javaThreadState, values);
3401 ia = (java_handle_intarray_t *) values;
3403 /* If new thread states are added in future JDK and VM versions,
3404 this should check if the JDK version is compatible with thread
3405 states supported by the VM. Return NULL if not compatible.
3407 This function must map the VM java_lang_Thread::ThreadStatus
3408 to the Java thread state that the JDK supports. */
3410 if (values == NULL) {
3411 exceptions_throw_nullpointerexception();
3415 switch (javaThreadState) {
3416 case THREAD_STATE_NEW:
3417 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3419 oa = builtin_anewarray(1, class_java_lang_String);
3424 s = javastring_new(utf_new_char("NEW"));
3429 array_objectarray_element_set(oa, 0, s);
3432 case THREAD_STATE_RUNNABLE:
3433 oa = builtin_anewarray(1, class_java_lang_String);
3438 s = javastring_new(utf_new_char("RUNNABLE"));
3443 array_objectarray_element_set(oa, 0, s);
3446 case THREAD_STATE_BLOCKED:
3447 oa = builtin_anewarray(1, class_java_lang_String);
3452 s = javastring_new(utf_new_char("BLOCKED"));
3457 array_objectarray_element_set(oa, 0, s);
3460 case THREAD_STATE_WAITING:
3461 oa = builtin_anewarray(2, class_java_lang_String);
3466 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3467 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3472 array_objectarray_element_set(oa, 0, s);
3473 /* array_objectarray_element_set(oa, 1, s); */
3476 case THREAD_STATE_TIMED_WAITING:
3477 oa = builtin_anewarray(3, class_java_lang_String);
3482 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3483 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3484 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3489 /* array_objectarray_element_set(oa, 0, s); */
3490 array_objectarray_element_set(oa, 0, s);
3491 /* array_objectarray_element_set(oa, 2, s); */
3494 case THREAD_STATE_TERMINATED:
3495 oa = builtin_anewarray(1, class_java_lang_String);
3500 s = javastring_new(utf_new_char("TERMINATED"));
3505 array_objectarray_element_set(oa, 0, s);
3509 /* Unknown state - probably incompatible JDK version */
3513 return (jobjectArray) oa;
3517 /* JVM_GetVersionInfo */
3519 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3521 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3525 /* OS: JVM_RegisterSignal */
3527 void *JVM_RegisterSignal(jint sig, void *handler)
3529 functionptr newHandler;
3531 TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
3533 if (handler == (void *) 2)
3534 newHandler = (functionptr) signal_thread_handler;
3536 newHandler = (functionptr) (uintptr_t) handler;
3543 /* These signals are already used by the VM. */
3547 /* This signal is used by the VM to dump thread stacks unless
3548 ReduceSignalUsage is set, in which case the user is allowed
3549 to set his own _native_ handler for this signal; thus, in
3550 either case, we do not allow JVM_RegisterSignal to change
3560 signal_register_signal(sig, newHandler, 0);
3562 /* XXX Should return old handler. */
3568 /* OS: JVM_RaiseSignal */
3570 jboolean JVM_RaiseSignal(jint sig)
3572 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3578 /* OS: JVM_FindSignal */
3580 jint JVM_FindSignal(const char *name)
3582 TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
3584 #if defined(__LINUX__)
3585 if (strcmp(name, "HUP") == 0)
3588 if (strcmp(name, "INT") == 0)
3591 if (strcmp(name, "TERM") == 0)
3594 # error not implemented for this OS
3602 * These are local overrides for various environment variables in Emacs.
3603 * Please do not remove this and leave it at the end of the file, where
3604 * Emacs will automagically detect them.
3605 * ---------------------------------------------------------------------
3608 * indent-tabs-mode: t