1 /* src/native/vm/openjdk/jvm.cpp - HotSpot VM interface functions
3 Copyright (C) 2007, 2008, 2009
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5 Copyright (C) 2009 Theobroma Systems Ltd.
7 This file is part of CACAO.
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License as
11 published by the Free Software Foundation; either version 2, or (at
12 your option) any later version.
14 This program is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 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/types.h>
43 // Include our JNI header before the JVM headers, because the JVM
44 // headers include jni.h and we want to override the typedefs in
46 #include "native/jni.hpp"
48 // We include jvm_md.h before jvm.h as the latter includes the former.
49 #include INCLUDE_JVM_MD_H
50 #include INCLUDE_JVM_H
52 #include "fdlibm/fdlibm.h"
54 #include "mm/memory.hpp"
56 #include "native/llni.h"
57 #include "native/native.hpp"
59 #include "native/vm/reflection.hpp"
61 #include "native/vm/openjdk/hpi.hpp"
62 #include "native/vm/openjdk/management.hpp"
64 #include "threads/lock.hpp"
65 #include "threads/thread.hpp"
66 #include "threads/threadlist.hpp"
68 #include "toolbox/logging.hpp"
69 #include "toolbox/list.hpp"
71 #include "vm/array.hpp"
73 #if defined(ENABLE_ASSERTION)
74 #include "vm/assertion.hpp"
77 #include "vm/jit/builtin.hpp"
78 #include "vm/classcache.hpp"
79 #include "vm/exceptions.hpp"
80 #include "vm/global.h"
81 #include "vm/globals.hpp"
82 #include "vm/initialize.hpp"
83 #include "vm/javaobjects.hpp"
84 #include "vm/options.h"
86 #include "vm/package.hpp"
87 #include "vm/primitive.hpp"
88 #include "vm/properties.hpp"
89 #include "vm/resolve.hpp"
90 #include "vm/signallocal.hpp"
91 #include "vm/string.hpp"
94 #include "vm/jit/stacktrace.hpp"
97 /* debugging macros ***********************************************************/
101 # define TRACEJVMCALLS(x) \
103 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
108 # define TRACEJVMCALLSENTER(x) \
110 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
116 # define TRACEJVMCALLSEXIT(x) \
118 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
124 # define TRACEJVMCALLSVERBOSE(x) \
126 if (opt_TraceJVMCallsVerbose) { \
131 # define PRINTJVMWARNINGS(x) \
133 if (opt_PrintWarnings) { \
140 # define TRACEJVMCALLS(x)
141 # define TRACEJVMCALLSENTER(x)
142 # define TRACEJVMCALLSEXIT(x)
143 # define TRACEJVMCALLSVERBOSE(x)
144 # define PRINTJVMWARNINGS(x)
149 // Interface functions are exported as C functions.
152 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
154 if ((intptr_t) count <= 0)
157 return vsnprintf(str, count, fmt, args);
161 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
167 len = jio_vsnprintf(str, count, fmt, ap);
174 int jio_fprintf(FILE* f, const char *fmt, ...)
176 log_println("jio_fprintf: IMPLEMENT ME!");
182 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
184 log_println("jio_vfprintf: IMPLEMENT ME!");
190 int jio_printf(const char *fmt, ...)
192 log_println("jio_printf: IMPLEMENT ME!");
198 /* JVM_GetInterfaceVersion */
200 jint JVM_GetInterfaceVersion()
202 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
204 #define JVM_INTERFACE_VERSION 4
206 return JVM_INTERFACE_VERSION;
210 /* JVM_CurrentTimeMillis */
212 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
214 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
216 return (jlong) builtin_currenttimemillis();
222 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
224 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
226 return (jlong) builtin_nanotime();
232 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
237 s = (java_handle_t *) src;
238 d = (java_handle_t *) dst;
240 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));
242 builtin_arraycopy(s, src_pos, d, dst_pos, length);
246 /* JVM_InitProperties */
248 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
253 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
255 h = (java_handle_t *) properties;
257 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
258 sun.nio.MaxDirectMemorySize property. Do this after setting
259 user properties to prevent people from setting the value with a
260 -D option, as requested. */
262 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
263 VM::get_current()->get_properties().put("sun.nio.MaxDirectMemorySize", buf);
265 // Fill the java.util.Properties object.
266 VM::get_current()->get_properties().fill(h);
274 void JVM_Exit(jint code)
276 log_println("JVM_Exit: IMPLEMENT ME!");
282 void JVM_Halt(jint code)
284 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
291 /* JVM_OnExit(void (*func)) */
293 void JVM_OnExit(void (*func)(void))
295 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
303 TRACEJVMCALLS(("JVM_GC()"));
309 /* JVM_MaxObjectInspectionAge */
311 jlong JVM_MaxObjectInspectionAge(void)
313 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
319 /* JVM_TraceInstructions */
321 void JVM_TraceInstructions(jboolean on)
323 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
327 /* JVM_TraceMethodCalls */
329 void JVM_TraceMethodCalls(jboolean on)
331 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
335 /* JVM_TotalMemory */
337 jlong JVM_TotalMemory(void)
339 TRACEJVMCALLS(("JVM_TotalMemory()"));
341 return gc_get_heap_size();
347 jlong JVM_FreeMemory(void)
349 TRACEJVMCALLS(("JVM_FreeMemory()"));
351 return gc_get_free_bytes();
357 jlong JVM_MaxMemory(void)
359 TRACEJVMCALLS(("JVM_MaxMemory()"));
361 return gc_get_max_heap_size();
365 /* JVM_ActiveProcessorCount */
367 jint JVM_ActiveProcessorCount(void)
369 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
371 return os::processors_online();
375 /* JVM_FillInStackTrace */
377 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
379 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
381 java_handle_bytearray_t* ba = stacktrace_get_current();
386 java_lang_Throwable jlt(receiver, ba);
390 /* JVM_PrintStackTrace */
392 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
394 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
398 /* JVM_GetStackTraceDepth */
400 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
402 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
404 java_lang_Throwable jlt(throwable);
407 exceptions_throw_nullpointerexception();
411 ByteArray ba(jlt.get_backtrace());
416 // We need a critical section here as the stacktrace structure is
417 // mapped onto a Java byte-array.
421 stacktrace_t* st = (stacktrace_t *) ba.get_raw_data_ptr();
423 int32_t depth = st->length;
431 /* JVM_GetStackTraceElement */
433 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
435 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
437 java_lang_Throwable jlt(throwable);
438 ByteArray ba(jlt.get_backtrace());
440 // XXX We need a critical section here as the stacktrace structure is
441 // mapped onto a Java byte-array.
442 stacktrace_t* st = (stacktrace_t *) ba.get_raw_data_ptr();
444 return stacktrace_get_StackTraceElement(st, index);
450 jint JVM_IHashCode(JNIEnv* env, jobject handle)
452 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
454 java_lang_Object o(handle);
456 return o.get_hashcode();
460 /* JVM_MonitorWait */
462 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
464 #if defined(ENABLE_THREADS)
468 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
470 /* exceptions_throw_illegalargumentexception("argument out of range"); */
471 exceptions_throw_illegalargumentexception();
475 #if defined(ENABLE_THREADS)
476 o = (java_handle_t *) handle;
478 lock_wait_for_object(o, ms, 0);
483 /* JVM_MonitorNotify */
485 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
487 #if defined(ENABLE_THREADS)
491 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
493 #if defined(ENABLE_THREADS)
494 o = (java_handle_t *) handle;
496 lock_notify_object(o);
501 /* JVM_MonitorNotifyAll */
503 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
505 #if defined(ENABLE_THREADS)
509 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
511 #if defined(ENABLE_THREADS)
512 o = (java_handle_t *) handle;
514 lock_notify_all_object(o);
521 jobject JVM_Clone(JNIEnv* env, jobject handle)
523 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
525 return (jobject) builtin_clone(env, (java_handle_t *) handle);
529 /* JVM_InitializeCompiler */
531 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
533 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
537 /* JVM_IsSilentCompiler */
539 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
541 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
547 /* JVM_CompileClass */
549 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
551 log_println("JVM_CompileClass: IMPLEMENT ME!");
557 /* JVM_CompileClasses */
559 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
561 log_println("JVM_CompileClasses: IMPLEMENT ME!");
567 /* JVM_CompilerCommand */
569 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
571 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
577 /* JVM_EnableCompiler */
579 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
581 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
582 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
586 /* JVM_DisableCompiler */
588 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
590 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
591 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
595 /* JVM_GetLastErrorString */
597 jint JVM_GetLastErrorString(char* buf, int len)
599 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
601 HPI& hpi = VM::get_current()->get_hpi();
602 return hpi.get_system().GetLastErrorString(buf, len);
608 char *JVM_NativePath(char* path)
610 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
612 HPI& hpi = VM::get_current()->get_hpi();
613 return hpi.get_file().NativePath(path);
617 /* JVM_GetCallerClass */
619 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
623 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
625 c = stacktrace_get_caller_class(depth);
631 /* JVM_FindPrimitiveClass */
633 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
638 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
641 c = Primitive::get_class_by_name(u);
643 return (jclass) LLNI_classinfo_wrap(c);
647 /* JVM_ResolveClass */
649 void JVM_ResolveClass(JNIEnv* env, jclass cls)
651 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
652 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
656 /* JVM_FindClassFromClassLoader */
658 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
664 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
666 /* As of now, OpenJDK does not call this function with throwError
669 assert(throwError == false);
671 u = utf_new_char(name);
672 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
674 c = load_class_from_classloader(u, cl);
680 if (!(c->state & CLASS_INITIALIZED))
681 if (!initialize_class(c))
684 return (jclass) LLNI_classinfo_wrap(c);
688 /* JVM_FindClassFromClass */
690 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
692 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
698 /* JVM_DefineClass */
700 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
702 log_println("JVM_DefineClass: IMPLEMENT ME!");
708 /* JVM_DefineClassWithSource */
710 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
716 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
719 u = utf_new_char(name);
723 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
725 /* XXX do something with source */
727 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
729 return (jclass) LLNI_classinfo_wrap(c);
733 /* JVM_FindLoadedClass */
735 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
741 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
743 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
745 u = javastring_toutf((java_handle_t *) name, true);
746 c = classcache_lookup(cl, u);
748 return (jclass) LLNI_classinfo_wrap(c);
752 /* JVM_GetClassName */
754 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
758 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
760 c = LLNI_classinfo_unwrap(cls);
762 return (jstring) class_get_classname(c);
766 /* JVM_GetClassInterfaces */
768 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
771 java_handle_objectarray_t *oa;
773 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
775 c = LLNI_classinfo_unwrap(cls);
777 oa = class_get_interfaces(c);
783 /* JVM_GetClassLoader */
785 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
790 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
792 c = LLNI_classinfo_unwrap(cls);
793 cl = class_get_classloader(c);
795 TRACEJVMCALLSEXIT(("->%p", cl));
801 /* JVM_IsInterface */
803 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
807 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
809 c = LLNI_classinfo_unwrap(cls);
811 return class_is_interface(c);
815 /* JVM_GetClassSigners */
817 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
819 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
825 /* JVM_SetClassSigners */
827 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
829 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
831 classinfo* c = LLNI_classinfo_unwrap(cls);
833 ObjectArray oa(signers);
835 /* This call is ignored for primitive types and arrays. Signers
836 are only set once, ClassLoader.java, and thus shouldn't be
837 called with an array. Only the bootstrap loader creates
840 if (class_is_primitive(c) || class_is_array(c))
844 LLNI_classinfo_field_set(c, signers, (java_objectarray_t*) oa.get_handle());
848 /* JVM_GetProtectionDomain */
850 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
854 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
856 c = LLNI_classinfo_unwrap(cls);
859 exceptions_throw_nullpointerexception();
863 /* Primitive types do not have a protection domain. */
865 if (class_is_primitive(c))
868 return (jobject) c->protectiondomain;
872 /* JVM_SetProtectionDomain */
874 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
876 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
880 /* JVM_DoPrivileged */
882 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
887 java_handle_t *result;
890 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
892 h = (java_handle_t *) action;
893 LLNI_class_get(h, c);
895 if (action == NULL) {
896 exceptions_throw_nullpointerexception();
900 /* lookup run() method (throw no exceptions) */
902 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
905 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
906 exceptions_throw_internalerror("No run method");
910 /* XXX It seems something with a privileged stack needs to be done
913 result = vm_call_method(m, h);
915 e = exceptions_get_exception();
918 if ( builtin_instanceof(e, class_java_lang_Exception) &&
919 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
920 exceptions_clear_exception();
921 exceptions_throw_privilegedactionexception(e);
927 return (jobject) result;
931 /* JVM_GetInheritedAccessControlContext */
933 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
935 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
941 /* JVM_GetStackAccessControlContext */
943 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
945 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
947 /* XXX All stuff I tested so far works without that function. At
948 some point we have to implement it, but I disable the output
949 for now to make IcedTea happy. */
955 /* JVM_IsArrayClass */
957 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
961 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
963 c = LLNI_classinfo_unwrap(cls);
965 return class_is_array(c);
969 /* JVM_IsPrimitiveClass */
971 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
975 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
977 c = LLNI_classinfo_unwrap(cls);
979 return class_is_primitive(c);
983 /* JVM_GetComponentType */
985 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
987 classinfo *component;
990 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
992 c = LLNI_classinfo_unwrap(cls);
994 component = class_get_componenttype(c);
996 return (jclass) LLNI_classinfo_wrap(component);
1000 /* JVM_GetClassModifiers */
1002 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1007 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1009 c = LLNI_classinfo_unwrap(cls);
1011 flags = class_get_modifiers(c, false);
1017 /* JVM_GetDeclaredClasses */
1019 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1022 java_handle_objectarray_t *oa;
1024 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1026 c = LLNI_classinfo_unwrap(ofClass);
1028 oa = class_get_declaredclasses(c, false);
1034 /* JVM_GetDeclaringClass */
1036 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1041 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1043 c = LLNI_classinfo_unwrap(ofClass);
1045 dc = class_get_declaringclass(c);
1047 return (jclass) LLNI_classinfo_wrap(dc);
1051 /* JVM_GetClassSignature */
1053 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1059 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1061 c = LLNI_classinfo_unwrap(cls);
1063 /* Get the signature of the class. */
1065 u = class_get_signature(c);
1070 /* Convert UTF-string to a Java-string. */
1072 s = javastring_new(u);
1078 /* JVM_GetClassAnnotations */
1080 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1082 TRACEJVMCALLS(("JVM_GetClassAnnotations(env=%p, cls=%p)", env, cls));
1085 exceptions_throw_nullpointerexception();
1089 classinfo* c = LLNI_classinfo_unwrap(cls);
1091 /* get annotations: */
1092 java_handle_bytearray_t* annotations = class_get_annotations(c);
1094 return (jbyteArray) annotations;
1098 /* JVM_GetFieldAnnotations */
1100 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1102 TRACEJVMCALLS(("JVM_GetFieldAnnotations(env=%p, field=%p)", env, field));
1104 java_lang_reflect_Field jlrf(field);
1106 if (jlrf.is_null()) {
1107 exceptions_throw_nullpointerexception();
1111 return (jbyteArray) jlrf.get_annotations();
1115 /* JVM_GetMethodAnnotations */
1117 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1119 TRACEJVMCALLS(("JVM_GetMethodAnnotations(env=%p, method=%p)", env, method));
1121 java_lang_reflect_Method jlrm(method);
1123 if (jlrm.is_null()) {
1124 exceptions_throw_nullpointerexception();
1128 return (jbyteArray) jlrm.get_annotations();
1132 /* JVM_GetMethodDefaultAnnotationValue */
1134 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1136 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue(env=%p, method=%p)", env, method));
1138 java_lang_reflect_Method jlrm(method);
1140 if (jlrm.is_null()) {
1141 exceptions_throw_nullpointerexception();
1145 return (jbyteArray) jlrm.get_annotationDefault();
1149 /* JVM_GetMethodParameterAnnotations */
1151 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1153 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations(env=%p, method=%p)", env, method));
1155 java_lang_reflect_Method jlrm(method);
1157 if (jlrm.is_null()) {
1158 exceptions_throw_nullpointerexception();
1162 return (jbyteArray) jlrm.get_parameterAnnotations();
1166 /* JVM_GetClassDeclaredFields */
1168 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1171 java_handle_objectarray_t *oa;
1173 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1175 c = LLNI_classinfo_unwrap(ofClass);
1177 oa = class_get_declaredfields(c, publicOnly);
1183 /* JVM_GetClassDeclaredMethods */
1185 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1187 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1189 classinfo* c = LLNI_classinfo_unwrap(ofClass);
1191 java_handle_objectarray_t* oa = class_get_declaredmethods(c, publicOnly);
1197 /* JVM_GetClassDeclaredConstructors */
1199 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1202 java_handle_objectarray_t *oa;
1204 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1206 c = LLNI_classinfo_unwrap(ofClass);
1208 oa = class_get_declaredconstructors(c, publicOnly);
1214 /* JVM_GetClassAccessFlags */
1216 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1220 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1222 c = LLNI_classinfo_unwrap(cls);
1224 /* Primitive type classes have the correct access flags. */
1226 return c->flags & ACC_CLASS_REFLECT_MASK;
1230 /* JVM_GetClassConstantPool */
1232 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1234 #if defined(ENABLE_ANNOTATIONS)
1235 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1237 java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
1238 sun_reflect_ConstantPool cp(h, cls);
1244 return (jobject) cp.get_handle();
1246 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1252 /* JVM_ConstantPoolGetSize */
1254 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1256 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1258 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1260 c = LLNI_classinfo_unwrap(jcpool);
1266 /* JVM_ConstantPoolGetClassAt */
1268 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1270 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1271 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1272 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1274 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1276 c = LLNI_classinfo_unwrap(jcpool);
1278 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1281 exceptions_throw_illegalargumentexception();
1285 result = resolve_classref_eager(ref);
1287 return (jclass) LLNI_classinfo_wrap(result);
1291 /* JVM_ConstantPoolGetClassAtIfLoaded */
1293 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1295 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1296 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1297 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1299 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1301 c = LLNI_classinfo_unwrap(jcpool);
1303 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1306 exceptions_throw_illegalargumentexception();
1310 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1314 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1318 return (jclass) LLNI_classinfo_wrap(result);
1322 /* JVM_ConstantPoolGetMethodAt */
1324 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1326 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1327 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1329 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1331 cls = LLNI_classinfo_unwrap(jcpool);
1332 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1335 exceptions_throw_illegalargumentexception();
1339 // Create a new java.lang.reflect.Method Java object.
1340 /* XXX: is that right? or do I have to use resolve_method_*? */
1341 java_lang_reflect_Method jlrm(ref->p.method);
1343 return (jobject) jlrm.get_handle();
1347 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1349 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1351 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1352 classinfo *c = NULL; /* resolved declaring class of the method */
1353 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1355 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1357 cls = LLNI_classinfo_unwrap(jcpool);
1358 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1361 exceptions_throw_illegalargumentexception();
1365 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1369 if (c == NULL || !(c->state & CLASS_LOADED)) {
1373 // Create a new java.lang.reflect.Method Java object.
1374 java_lang_reflect_Method jlrm(ref->p.method);
1376 return (jobject) jlrm.get_handle();
1380 /* JVM_ConstantPoolGetFieldAt */
1382 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1384 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1385 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1387 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1389 cls = LLNI_classinfo_unwrap(jcpool);
1390 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1393 exceptions_throw_illegalargumentexception();
1397 // Create a new java.lang.reflect.Field Java object.
1398 java_lang_reflect_Field jlrf(ref->p.field);
1400 return (jobject) jlrf.get_handle();
1404 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1406 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1408 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1409 classinfo *c; /* resolved declaring class for the field */
1410 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1412 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1414 cls = LLNI_classinfo_unwrap(jcpool);
1415 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1418 exceptions_throw_illegalargumentexception();
1422 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1426 if (c == NULL || !(c->state & CLASS_LOADED)) {
1430 // Create a new java.lang.reflect.Field Java object.
1431 java_lang_reflect_Field jlrf(ref->p.field);
1433 return (jobject) jlrf.get_handle();
1437 /* JVM_ConstantPoolGetMemberRefInfoAt */
1439 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1441 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1443 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1449 /* JVM_ConstantPoolGetIntAt */
1451 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1453 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1454 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1456 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1458 cls = LLNI_classinfo_unwrap(jcpool);
1459 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1462 exceptions_throw_illegalargumentexception();
1470 /* JVM_ConstantPoolGetLongAt */
1472 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1474 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1475 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1477 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1479 cls = LLNI_classinfo_unwrap(jcpool);
1480 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1483 exceptions_throw_illegalargumentexception();
1491 /* JVM_ConstantPoolGetFloatAt */
1493 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1495 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1496 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1498 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1500 cls = LLNI_classinfo_unwrap(jcpool);
1501 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1504 exceptions_throw_illegalargumentexception();
1512 /* JVM_ConstantPoolGetDoubleAt */
1514 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1516 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1517 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1519 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1521 cls = LLNI_classinfo_unwrap(jcpool);
1522 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1525 exceptions_throw_illegalargumentexception();
1533 /* JVM_ConstantPoolGetStringAt */
1535 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1537 utf *ref; /* utf object for the string in constant pool at index 'index' */
1538 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1540 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1542 cls = LLNI_classinfo_unwrap(jcpool);
1543 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1546 exceptions_throw_illegalargumentexception();
1550 /* XXX: I hope literalstring_new is the right Function. */
1551 return (jstring)literalstring_new(ref);
1555 /* JVM_ConstantPoolGetUTF8At */
1557 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1559 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1560 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1562 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1564 cls = LLNI_classinfo_unwrap(jcpool);
1565 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1568 exceptions_throw_illegalargumentexception();
1572 /* XXX: I hope literalstring_new is the right Function. */
1573 return (jstring)literalstring_new(ref);
1577 /* JVM_DesiredAssertionStatus */
1579 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1581 #if defined(ENABLE_ASSERTION)
1586 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1588 c = LLNI_classinfo_unwrap(cls);
1590 if (c->classloader == NULL) {
1591 status = (jboolean)assertion_system_enabled;
1594 status = (jboolean)assertion_user_enabled;
1597 if (list_assertion_names != NULL) {
1598 for (List<assertion_name_t*>::iterator it = list_assertion_names->begin();
1599 it != list_assertion_names->end(); it++) {
1600 assertion_name_t* item = *it;
1602 name = utf_new_char(item->name);
1603 if (name == c->packagename) {
1604 status = (jboolean)item->enabled;
1606 else if (name == c->name) {
1607 status = (jboolean)item->enabled;
1614 return (jboolean)false;
1619 /* JVM_AssertionStatusDirectives */
1621 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1623 #if defined(ENABLE_ASSERTION)
1628 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1630 #if defined(ENABLE_ASSERTION)
1631 ObjectArray classes(assertion_class_count, class_java_lang_Object);
1633 ObjectArray classes(0, class_java_lang_Object);
1635 if (classes.is_null())
1638 #if defined(ENABLE_ASSERTION)
1639 ObjectArray packages(assertion_package_count, class_java_lang_Object);
1641 ObjectArray packages(0, class_java_lang_Object);
1643 if (packages.is_null())
1646 #if defined(ENABLE_ASSERTION)
1647 BooleanArray classEnabled(assertion_class_count);
1649 BooleanArray classEnabled(0);
1651 if (classEnabled.is_null())
1654 #if defined(ENABLE_ASSERTION)
1655 BooleanArray packageEnabled(assertion_package_count);
1657 BooleanArray packageEnabled(0);
1659 if (packageEnabled.is_null())
1662 #if defined(ENABLE_ASSERTION)
1663 /* initialize arrays */
1665 if (list_assertion_names != NULL) {
1669 for (List<assertion_name_t*>::iterator it = list_assertion_names->begin(); it != list_assertion_names->end(); it++) {
1670 assertion_name_t* item = *it;
1672 js = javastring_new_from_ascii(item->name);
1677 if (item->package == false) {
1678 classes.set_element(i, js);
1679 classEnabled.set_element(i, (jboolean) item->enabled);
1683 packages.set_element(j, js);
1684 packageEnabled.set_element(j, (jboolean) item->enabled);
1691 /* set instance fields */
1693 java_lang_AssertionStatusDirectives jlasd(
1694 classes.get_handle(),
1695 classEnabled.get_handle(),
1696 packages.get_handle(),
1697 packageEnabled.get_handle());
1699 return (jobject) jlasd.get_handle();
1703 /* JVM_GetClassNameUTF */
1705 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1707 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1713 /* JVM_GetClassCPTypes */
1715 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1717 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1721 /* JVM_GetClassCPEntriesCount */
1723 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1725 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1731 /* JVM_GetClassFieldsCount */
1733 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1735 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1741 /* JVM_GetClassMethodsCount */
1743 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1745 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1751 /* JVM_GetMethodIxExceptionIndexes */
1753 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1755 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1759 /* JVM_GetMethodIxExceptionsCount */
1761 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1763 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1769 /* JVM_GetMethodIxByteCode */
1771 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1773 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1777 /* JVM_GetMethodIxByteCodeLength */
1779 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1781 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1787 /* JVM_GetMethodIxExceptionTableEntry */
1789 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1791 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1795 /* JVM_GetMethodIxExceptionTableLength */
1797 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1799 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1805 /* JVM_GetMethodIxModifiers */
1807 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1809 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1815 /* JVM_GetFieldIxModifiers */
1817 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1819 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1825 /* JVM_GetMethodIxLocalsCount */
1827 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1829 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1835 /* JVM_GetMethodIxArgsSize */
1837 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1839 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1845 /* JVM_GetMethodIxMaxStack */
1847 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1849 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1855 /* JVM_IsConstructorIx */
1857 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1859 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1865 /* JVM_GetMethodIxNameUTF */
1867 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1869 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1875 /* JVM_GetMethodIxSignatureUTF */
1877 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1879 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1885 /* JVM_GetCPFieldNameUTF */
1887 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1889 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1895 /* JVM_GetCPMethodNameUTF */
1897 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1899 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1905 /* JVM_GetCPMethodSignatureUTF */
1907 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1909 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1915 /* JVM_GetCPFieldSignatureUTF */
1917 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1919 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1925 /* JVM_GetCPClassNameUTF */
1927 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1929 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
1935 /* JVM_GetCPFieldClassNameUTF */
1937 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1939 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
1945 /* JVM_GetCPMethodClassNameUTF */
1947 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1949 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
1955 /* JVM_GetCPFieldModifiers */
1957 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1959 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
1965 /* JVM_GetCPMethodModifiers */
1967 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1969 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
1975 /* JVM_ReleaseUTF */
1977 void JVM_ReleaseUTF(const char *utf)
1979 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
1983 /* JVM_IsSameClassPackage */
1985 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
1987 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
1995 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
1998 * JVM I/O error codes
2000 #define JVM_EEXIST -100
2002 jint JVM_Open(const char* fname, jint flags, jint mode)
2006 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2008 HPI& hpi = VM::get_current()->get_hpi();
2009 result = hpi.get_file().Open(fname, flags, mode);
2027 jint JVM_Close(jint fd)
2029 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2031 HPI& hpi = VM::get_current()->get_hpi();
2032 return hpi.get_file().Close(fd);
2038 jint JVM_Read(jint fd, char* buf, jint nbytes)
2040 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2042 HPI& hpi = VM::get_current()->get_hpi();
2043 return (jint) hpi.get_file().Read(fd, buf, nbytes);
2049 jint JVM_Write(jint fd, char* buf, jint nbytes)
2051 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2053 HPI& hpi = VM::get_current()->get_hpi();
2054 return (jint) hpi.get_file().Write(fd, buf, nbytes);
2060 jint JVM_Available(jint fd, jlong* pbytes)
2062 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2064 HPI& hpi = VM::get_current()->get_hpi();
2065 return hpi.get_file().Available(fd, pbytes);
2071 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2073 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2075 HPI& hpi = VM::get_current()->get_hpi();
2076 return hpi.get_file().Seek(fd, (off_t) offset, whence);
2082 jint JVM_SetLength(jint fd, jlong length)
2084 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2086 HPI& hpi = VM::get_current()->get_hpi();
2087 return hpi.get_file().SetLength(fd, length);
2093 jint JVM_Sync(jint fd)
2095 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2097 HPI& hpi = VM::get_current()->get_hpi();
2098 return hpi.get_file().Sync(fd);
2102 /* JVM_StartThread */
2104 void JVM_StartThread(JNIEnv* env, jobject jthread)
2106 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2108 threads_thread_start((java_handle_t *) jthread);
2112 /* JVM_StopThread */
2114 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2116 log_println("JVM_StopThread: Deprecated. Not implemented.");
2120 /* JVM_IsThreadAlive */
2122 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2128 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2130 h = (java_handle_t *) jthread;
2131 t = thread_get_thread(h);
2133 /* The threadobject is null when a thread is created in Java. */
2138 result = threads_thread_is_alive(t);
2144 /* JVM_SuspendThread */
2146 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2151 TRACEJVMCALLS(("JVM_SuspendThread(env=%p, jthread=%p)", env, jthread));
2153 if (opt_PrintWarnings)
2154 log_println("JVM_SuspendThread: Deprecated, do not use!");
2156 h = (java_handle_t *) jthread;
2157 t = thread_get_thread(h);
2159 /* The threadobject is null when a thread is created in Java. */
2164 threads_suspend_thread(t, SUSPEND_REASON_JAVA);
2168 /* JVM_ResumeThread */
2170 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2175 TRACEJVMCALLS(("JVM_ResumeThread(env=%p, jthread=%p)", env, jthread));
2177 if (opt_PrintWarnings)
2178 log_println("JVM_ResumeThread: Deprecated, do not use!");
2180 h = (java_handle_t *) jthread;
2181 t = thread_get_thread(h);
2183 /* The threadobject is null when a thread is created in Java. */
2188 threads_resume_thread(t, SUSPEND_REASON_JAVA);
2192 /* JVM_SetThreadPriority */
2194 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2199 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2201 h = (java_handle_t *) jthread;
2202 t = thread_get_thread(h);
2204 /* The threadobject is null when a thread is created in Java. The
2205 priority is set later during startup. */
2210 threads_set_thread_priority(t->tid, prio);
2216 void JVM_Yield(JNIEnv *env, jclass threadClass)
2218 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2226 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2228 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2230 threads_sleep(millis, 0);
2234 /* JVM_CurrentThread */
2236 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2240 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2242 o = thread_get_current_object();
2248 /* JVM_CountStackFrames */
2250 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2252 log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2260 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2265 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2267 h = (java_handle_t *) jthread;
2268 t = thread_get_thread(h);
2270 /* The threadobject is null when a thread is created in Java. */
2275 threads_thread_interrupt(t);
2279 /* JVM_IsInterrupted */
2281 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2285 jboolean interrupted;
2287 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2289 h = (java_handle_t *) jthread;
2290 t = thread_get_thread(h);
2292 /* The threadobject is null when a thread is created in Java. */
2297 interrupted = thread_is_interrupted(t);
2299 if (interrupted && clear_interrupted)
2300 thread_set_interrupted(t, false);
2308 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2313 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2315 h = (java_handle_t *) obj;
2318 exceptions_throw_nullpointerexception();
2322 result = lock_is_held_by_current_thread(h);
2328 /* JVM_DumpAllStacks */
2330 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2332 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2336 /* JVM_CurrentLoadedClass */
2338 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2340 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2346 /* JVM_CurrentClassLoader */
2348 jobject JVM_CurrentClassLoader(JNIEnv *env)
2350 TRACEJVMCALLS(("JVM_CurrentClassLoader(env=%p)", env));
2351 PRINTJVMWARNINGS(("JVM_CurrentClassLoader is deprecated, do not use it."));
2353 return stacktrace_first_nonsystem_classloader();
2357 /* JVM_GetClassContext */
2359 jobjectArray JVM_GetClassContext(JNIEnv *env)
2361 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2363 return stacktrace_getClassContext();
2367 /* JVM_ClassDepth */
2369 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2371 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2377 /* JVM_ClassLoaderDepth */
2379 jint JVM_ClassLoaderDepth(JNIEnv *env)
2381 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2387 /* JVM_GetSystemPackage */
2389 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2395 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2397 /* s = Package::find(name); */
2398 u = javastring_toutf((java_handle_t *) name, false);
2400 result = Package::find(u);
2403 s = javastring_new(result);
2411 /* JVM_GetSystemPackages */
2413 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2415 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2421 /* JVM_AllocateNewObject */
2423 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2425 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2431 /* JVM_AllocateNewArray */
2433 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2435 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2441 /* JVM_LatestUserDefinedLoader */
2443 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2445 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2447 return stacktrace_first_nonnull_classloader();
2451 /* JVM_LoadClass0 */
2453 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2455 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2461 /* JVM_GetArrayLength */
2463 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2465 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2468 exceptions_throw_nullpointerexception();
2474 // Check for exception in constructor.
2479 return a.get_length();
2483 /* JVM_GetArrayElement */
2485 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2487 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2491 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2492 /* exceptions_throw_illegalargumentexception(); */
2496 return a.get_boxed_element(index);
2500 /* JVM_GetPrimitiveArrayElement */
2502 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2506 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2514 /* JVM_SetArrayElement */
2516 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2518 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2522 a.set_boxed_element(index, val);
2526 /* JVM_SetPrimitiveArrayElement */
2528 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2530 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2536 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2538 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2540 if (eltClass == NULL) {
2541 exceptions_throw_nullpointerexception();
2545 /* NegativeArraySizeException is checked by array constructor. */
2547 classinfo* c = LLNI_classinfo_unwrap(eltClass);
2549 /* Create primitive or object array. */
2551 if (class_is_primitive(c)) {
2552 classinfo* pc = Primitive::get_arrayclass_by_name(c->name);
2554 /* void arrays are not allowed. */
2557 exceptions_throw_illegalargumentexception();
2561 Array a(length, pc);
2563 return (jobject) a.get_handle();
2566 ObjectArray oa(length, c);
2568 return (jobject) oa.get_handle();
2573 /* JVM_NewMultiArray */
2575 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2583 java_handle_objectarray_t *a;
2585 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2587 if (eltClass == NULL) {
2588 exceptions_throw_nullpointerexception();
2592 /* NegativeArraySizeException is checked in builtin_newarray. */
2594 c = LLNI_classinfo_unwrap(eltClass);
2598 /* We check here for exceptions thrown in array_length_get,
2599 otherwise these exceptions get overwritten by the following
2600 IllegalArgumentException. */
2605 length = ia.get_length();
2607 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2608 exceptions_throw_illegalargumentexception();
2612 /* XXX This is just a quick hack to get it working. */
2614 dims = MNEW(long, length);
2616 for (i = 0; i < length; i++) {
2617 value = ia.get_element(i);
2618 dims[i] = (long) value;
2621 /* Create an array-class if necessary. */
2623 if (class_is_primitive(c)) {
2624 ac = Primitive::get_arrayclass_by_name(c->name);
2626 // Arrays of void are not allowed.
2628 exceptions_throw_illegalargumentexception();
2633 ac = class_multiarray_of((length - 1), ac, true);
2636 ac = class_multiarray_of(length, c, true);
2641 /* Allocate a new array on the heap. */
2643 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2649 /* JVM_InitializeSocketLibrary */
2651 jint JVM_InitializeSocketLibrary()
2653 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2655 HPI& hpi = VM::get_current()->get_hpi();
2656 return hpi.initialize_socket_library();
2662 jint JVM_Socket(jint domain, jint type, jint protocol)
2664 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2666 return os::socket(domain, type, protocol);
2670 /* JVM_SocketClose */
2672 jint JVM_SocketClose(jint fd)
2674 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2676 return os::close(fd);
2680 /* JVM_SocketShutdown */
2682 jint JVM_SocketShutdown(jint fd, jint howto)
2684 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2686 return os::shutdown(fd, howto);
2692 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2694 log_println("JVM_Recv: IMPLEMENT ME!");
2702 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2704 TRACEJVMCALLSENTER(("JVM_Send(fd=%d, buf=%p, nBytes=%d, flags=%d", fd, buf, nBytes, flags));
2706 int result = os::send(fd, buf, nBytes, flags);
2708 TRACEJVMCALLSEXIT(("->%d", result));
2716 jint JVM_Timeout(int fd, long timeout)
2718 log_println("JVM_Timeout: IMPLEMENT ME!");
2726 jint JVM_Listen(jint fd, jint count)
2728 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2730 return os::listen(fd, count);
2736 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2738 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2740 return os::connect(fd, him, len);
2746 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2748 log_println("JVM_Bind: IMPLEMENT ME!");
2756 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2758 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2760 return os::accept(fd, him, (socklen_t *) len);
2766 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2768 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2774 /* JVM_GetSockName */
2776 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2778 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2780 return os::getsockname(fd, him, (socklen_t *) len);
2786 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2788 log_println("JVM_SendTo: IMPLEMENT ME!");
2794 /* JVM_SocketAvailable */
2796 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2798 #if defined(FIONREAD)
2802 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2806 result = ioctl(fd, FIONREAD, &bytes);
2815 # error FIONREAD not defined
2820 /* JVM_GetSockOpt */
2822 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2824 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2826 return os::getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2830 /* JVM_SetSockOpt */
2832 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2834 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2836 return os::setsockopt(fd, level, optname, optval, optlen);
2840 /* JVM_GetHostName */
2842 int JVM_GetHostName(char *name, int namelen)
2846 TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2848 result = os::gethostname(name, namelen);
2850 TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
2856 /* JVM_GetHostByAddr */
2858 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2860 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2866 /* JVM_GetHostByName */
2868 struct hostent *JVM_GetHostByName(char* name)
2870 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2876 /* JVM_GetProtoByName */
2878 struct protoent *JVM_GetProtoByName(char* name)
2880 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2886 /* JVM_LoadLibrary */
2888 void* JVM_LoadLibrary(const char* name)
2890 TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
2892 utf* u = utf_new_char(name);
2894 NativeLibrary nl(u);
2895 void* handle = nl.open();
2897 TRACEJVMCALLSEXIT(("->%p", handle));
2903 /* JVM_UnloadLibrary */
2905 void JVM_UnloadLibrary(void* handle)
2907 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2909 NativeLibrary nl(handle);
2914 /* JVM_FindLibraryEntry */
2916 void *JVM_FindLibraryEntry(void* handle, const char* name)
2920 TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
2922 HPI& hpi = VM::get_current()->get_hpi();
2923 symbol = hpi.get_library().FindLibraryEntry(handle, name);
2925 TRACEJVMCALLSEXIT(("->%p", symbol));
2933 jboolean JVM_IsNaN(jdouble d)
2937 TRACEJVMCALLSENTER(("JVM_IsNaN(d=%f)", d));
2941 TRACEJVMCALLSEXIT(("->%d", result));
2947 /* JVM_IsSupportedJNIVersion */
2949 jboolean JVM_IsSupportedJNIVersion(jint version)
2951 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
2953 return jni_version_check(version);
2957 /* JVM_InternString */
2959 jstring JVM_InternString(JNIEnv *env, jstring str)
2961 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
2963 return (jstring) javastring_intern((java_handle_t *) str);
2967 /* JVM_RawMonitorCreate */
2969 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2971 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
2973 Mutex* m = new Mutex();
2979 /* JVM_RawMonitorDestroy */
2981 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void* mon)
2983 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
2985 delete ((Mutex*) mon);
2989 /* JVM_RawMonitorEnter */
2991 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void* mon)
2993 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
2995 ((Mutex*) mon)->lock();
3001 /* JVM_RawMonitorExit */
3003 JNIEXPORT void JNICALL JVM_RawMonitorExit(void* mon)
3005 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3007 ((Mutex*) mon)->unlock();
3011 /* JVM_SetPrimitiveFieldValues */
3013 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3015 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3019 /* JVM_GetPrimitiveFieldValues */
3021 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3023 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3027 /* JVM_AccessVMBooleanFlag */
3029 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3031 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3037 /* JVM_AccessVMIntFlag */
3039 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3041 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3047 /* JVM_VMBreakPoint */
3049 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3051 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3055 /* JVM_GetClassFields */
3057 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3059 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3065 /* JVM_GetClassMethods */
3067 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3069 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3075 /* JVM_GetClassConstructors */
3077 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3079 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3085 /* JVM_GetClassField */
3087 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3089 log_println("JVM_GetClassField: IMPLEMENT ME!");
3095 /* JVM_GetClassMethod */
3097 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3099 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3105 /* JVM_GetClassConstructor */
3107 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3109 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3115 /* JVM_NewInstance */
3117 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3119 log_println("JVM_NewInstance: IMPLEMENT ME!");
3127 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3129 log_println("JVM_GetField: IMPLEMENT ME!");
3135 /* JVM_GetPrimitiveField */
3137 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3141 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3151 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3153 log_println("JVM_SetField: IMPLEMENT ME!");
3157 /* JVM_SetPrimitiveField */
3159 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3161 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3165 /* JVM_InvokeMethod */
3167 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3169 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3171 java_lang_reflect_Method jlrm(method);
3173 java_handle_t* result = jlrm.invoke((java_handle_t*) obj, (java_handle_objectarray_t*) args0);
3175 return (jobject) result;
3179 /* JVM_NewInstanceFromConstructor */
3181 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3183 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3185 java_lang_reflect_Constructor jlrc(con);
3186 java_handle_t* o = jlrc.new_instance((java_handle_objectarray_t*) args0);
3192 /* JVM_SupportsCX8 */
3194 jboolean JVM_SupportsCX8()
3196 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3206 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3208 log_println("JVM_CX8Field: IMPLEMENT ME!");
3214 /* JVM_GetAllThreads */
3216 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3218 // Get a list of all active threads.
3219 List<threadobject*> active_threads;
3220 ThreadList::get_active_java_threads(active_threads);
3222 // Allocate array to hold the java.lang.Thread objects.
3223 int32_t length = active_threads.size();
3224 ObjectArray oa(length, class_java_lang_Thread);
3229 // Iterate over all threads (which were active just a second ago).
3231 for (List<threadobject*>::iterator it = active_threads.begin(); it != active_threads.end(); it++) {
3232 threadobject* t = *it;
3234 java_handle_t* h = thread_get_object(t);
3237 oa.set_element(index, h);
3242 return oa.get_handle();
3246 /* JVM_DumpThreads */
3248 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3252 TRACEJVMCALLS(("JVM_DumpThreads((env=%p, threadClass=%p, threads=%p)", env, threadClass, threads));
3254 if (threads == NULL) {
3255 exceptions_throw_nullpointerexception();
3259 ObjectArray oa(threads);
3261 // Get length of the threads array.
3262 int32_t length = oa.get_length();
3265 exceptions_throw_illegalargumentexception();
3269 // Allocate array to hold stacktraces.
3270 classinfo* arrayclass = class_array_of(class_java_lang_StackTraceElement, true);
3271 ObjectArray oaresult(length, arrayclass);
3273 if (oaresult.is_null()) {
3277 // Iterate over all passed thread objects.
3278 for (i = 0; i < length; i++) {
3279 java_handle_t* thread = oa.get_element(i);
3281 // Get thread for the given thread object.
3282 threadobject* t = thread_get_thread(thread);
3284 // The threadobject is null when a thread is created in Java.
3288 // Get stacktrace for given thread.
3289 stacktrace_t* st = stacktrace_get_of_thread(t);
3291 // Convert stacktrace into array of StackTraceElements.
3292 java_handle_objectarray_t* oaste = stacktrace_get_StackTraceElements(st);
3297 oaresult.set_element(i, oaste);
3300 return oaresult.get_handle();
3304 /* JVM_GetManagement */
3306 void *JVM_GetManagement(jint version)
3308 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3310 return Management::get_jmm_interface(version);
3314 /* JVM_InitAgentProperties */
3316 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3318 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3324 /* JVM_GetEnclosingMethodInfo */
3326 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3328 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3330 classinfo* c = LLNI_classinfo_unwrap(ofClass);
3332 if ((c == NULL) || class_is_primitive(c))
3335 methodinfo* m = class_get_enclosingmethod_raw(c);
3340 ObjectArray oa(3, class_java_lang_Object);
3345 oa.set_element(0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
3346 oa.set_element(1, javastring_new(m->name));
3347 oa.set_element(2, javastring_new(m->descriptor));
3349 return oa.get_handle();
3353 /* JVM_GetThreadStateValues */
3355 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3357 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3358 env, javaThreadState));
3360 /* If new thread states are added in future JDK and VM versions,
3361 this should check if the JDK version is compatible with thread
3362 states supported by the VM. Return NULL if not compatible.
3364 This function must map the VM java_lang_Thread::ThreadStatus
3365 to the Java thread state that the JDK supports. */
3367 switch (javaThreadState) {
3368 case THREAD_STATE_NEW:
3375 ia.set_element(0, THREAD_STATE_NEW);
3376 return ia.get_handle();
3379 case THREAD_STATE_RUNNABLE:
3386 ia.set_element(0, THREAD_STATE_RUNNABLE);
3387 return ia.get_handle();
3390 case THREAD_STATE_BLOCKED:
3397 ia.set_element(0, THREAD_STATE_BLOCKED);
3398 return ia.get_handle();
3401 case THREAD_STATE_WAITING:
3408 ia.set_element(0, THREAD_STATE_WAITING);
3409 ia.set_element(1, THREAD_STATE_PARKED);
3410 return ia.get_handle();
3413 case THREAD_STATE_TIMED_WAITING:
3420 /* XXX Not sure about that one. */
3421 /* ia.set_element(0, SLEEPING); */
3422 ia.set_element(0, THREAD_STATE_TIMED_WAITING);
3423 ia.set_element(1, THREAD_STATE_TIMED_PARKED);
3424 return ia.get_handle();
3427 case THREAD_STATE_TERMINATED:
3434 ia.set_element(0, THREAD_STATE_TERMINATED);
3435 return ia.get_handle();
3439 /* Unknown state - probably incompatible JDK version */
3445 /* JVM_GetThreadStateNames */
3447 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3451 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3452 env, javaThreadState, values));
3454 IntArray ia(values);
3456 /* If new thread states are added in future JDK and VM versions,
3457 this should check if the JDK version is compatible with thread
3458 states supported by the VM. Return NULL if not compatible.
3460 This function must map the VM java_lang_Thread::ThreadStatus
3461 to the Java thread state that the JDK supports. */
3463 if (values == NULL) {
3464 exceptions_throw_nullpointerexception();
3468 switch (javaThreadState) {
3469 case THREAD_STATE_NEW:
3471 assert(ia.get_length() == 1 && ia.get_element(0) == THREAD_STATE_NEW);
3473 ObjectArray oa(1, class_java_lang_String);
3478 s = javastring_new(utf_new_char("NEW"));
3483 oa.set_element(0, s);
3484 return oa.get_handle();
3487 case THREAD_STATE_RUNNABLE:
3489 ObjectArray oa(1, class_java_lang_String);
3494 s = javastring_new(utf_new_char("RUNNABLE"));
3499 oa.set_element(0, s);
3500 return oa.get_handle();
3503 case THREAD_STATE_BLOCKED:
3505 ObjectArray oa(1, class_java_lang_String);
3510 s = javastring_new(utf_new_char("BLOCKED"));
3515 oa.set_element(0, s);
3516 return oa.get_handle();
3519 case THREAD_STATE_WAITING:
3521 ObjectArray oa(2, class_java_lang_String);
3526 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3531 oa.set_element(0, s);
3533 s = javastring_new(utf_new_char("WAITING.PARKED"));
3538 oa.set_element(1, s);
3539 return oa.get_handle();
3542 case THREAD_STATE_TIMED_WAITING:
3544 ObjectArray oa(2, class_java_lang_String);
3549 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3550 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3555 oa.set_element(0, s);
3557 s = javastring_new(utf_new_char("TIMED_WAITING.PARKED"));
3562 oa.set_element(1, s);
3563 return oa.get_handle();
3566 case THREAD_STATE_TERMINATED:
3568 ObjectArray oa(1, class_java_lang_String);
3573 s = javastring_new(utf_new_char("TERMINATED"));
3578 oa.set_element(0, s);
3579 return oa.get_handle();
3583 /* Unknown state - probably incompatible JDK version */
3589 /* JVM_GetVersionInfo */
3591 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3593 TRACEJVMCALLS(("JVM_GetVersionInfo(env=%p, info=%p, info_size=%zd)", env, info, info_size));
3595 memset(info, 0, info_size);
3597 info->jvm_version = ((VERSION_MAJOR & 0xff) << 24) | ((VERSION_MINOR & 0xff) << 16) | (VERSION_MICRO & 0xff);
3598 info->update_version = 0;
3599 info->special_update_version = 0;
3600 info->is_attach_supported = 0;
3601 info->is_kernel_jvm = 0;
3605 /* OS: JVM_RegisterSignal */
3607 void *JVM_RegisterSignal(jint sig, void *handler)
3609 functionptr newHandler;
3611 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3613 if (handler == (void *) 2)
3614 newHandler = (functionptr) signal_thread_handler;
3616 newHandler = (functionptr) (uintptr_t) handler;
3623 /* These signals are already used by the VM. */
3627 /* This signal is used by the VM to dump thread stacks unless
3628 ReduceSignalUsage is set, in which case the user is allowed
3629 to set his own _native_ handler for this signal; thus, in
3630 either case, we do not allow JVM_RegisterSignal to change
3640 signal_register_signal(sig, newHandler, SA_RESTART | SA_SIGINFO);
3642 /* XXX Should return old handler. */
3648 /* OS: JVM_RaiseSignal */
3650 jboolean JVM_RaiseSignal(jint sig)
3652 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3658 /* OS: JVM_FindSignal */
3660 jint JVM_FindSignal(const char *name)
3662 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3664 #if defined(__LINUX__)
3665 if (strcmp(name, "HUP") == 0)
3668 if (strcmp(name, "INT") == 0)
3671 if (strcmp(name, "TERM") == 0)
3673 #elif defined(__SOLARIS__)
3676 if (os::str2sig(name, &signum) == -1)
3681 # error Not implemented for this OS.
3691 * These are local overrides for various environment variables in Emacs.
3692 * Please do not remove this and leave it at the end of the file, where
3693 * Emacs will automagically detect them.
3694 * ---------------------------------------------------------------------
3697 * indent-tabs-mode: t
3701 * vim:noexpandtab:sw=4:ts=4: