1 /* src/native/vm/openjdk/jvm.cpp - HotSpot VM 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
35 #if defined(HAVE_SYS_IOCTL_H)
36 #define BSD_COMP /* Get FIONREAD on Solaris2 */
37 #include <sys/ioctl.h>
40 #include <sys/socket.h>
42 #include <sys/types.h>
44 // Include our JNI header before the JVM headers, because the JVM
45 // headers include jni.h and we want to override the typedefs in
47 #include "native/jni.hpp"
49 // We include jvm_md.h before jvm.h as the latter includes the former.
50 #include INCLUDE_JVM_MD_H
51 #include INCLUDE_JVM_H
53 #include "mm/memory.hpp"
55 #include "native/llni.h"
56 #include "native/native.hpp"
58 #include "native/vm/reflection.hpp"
60 #include "native/vm/openjdk/hpi.hpp"
61 #include "native/vm/openjdk/management.hpp"
63 #include "threads/lock.hpp"
64 #include "threads/thread.hpp"
66 #include "toolbox/logging.hpp"
67 #include "toolbox/list.hpp"
69 #include "vm/array.hpp"
71 #if defined(ENABLE_ASSERTION)
72 #include "vm/assertion.hpp"
75 #include "vm/jit/builtin.hpp"
76 #include "vm/classcache.hpp"
77 #include "vm/exceptions.hpp"
78 #include "vm/global.h"
79 #include "vm/globals.hpp"
80 #include "vm/initialize.hpp"
81 #include "vm/javaobjects.hpp"
82 #include "vm/options.h"
84 #include "vm/package.hpp"
85 #include "vm/primitive.hpp"
86 #include "vm/properties.hpp"
87 #include "vm/resolve.hpp"
88 #include "vm/signallocal.hpp"
89 #include "vm/string.hpp"
92 #include "vm/jit/stacktrace.hpp"
95 /* debugging macros ***********************************************************/
99 # define TRACEJVMCALLS(x) \
101 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
106 # define TRACEJVMCALLSENTER(x) \
108 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
114 # define TRACEJVMCALLSEXIT(x) \
116 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
122 # define TRACEJVMCALLSVERBOSE(x) \
124 if (opt_TraceJVMCallsVerbose) { \
129 # define PRINTJVMWARNINGS(x)
131 /* if (opt_PrintJVMWarnings) { \ */
132 /* log_println x; \ */
138 # define TRACEJVMCALLS(x)
139 # define TRACEJVMCALLSENTER(x)
140 # define TRACEJVMCALLSEXIT(x)
141 # define TRACEJVMCALLSVERBOSE(x)
142 # define PRINTJVMWARNINGS(x)
147 // Interface functions are exported as C functions.
150 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
152 if ((intptr_t) count <= 0)
155 return vsnprintf(str, count, fmt, args);
159 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
165 len = jio_vsnprintf(str, count, fmt, ap);
172 int jio_fprintf(FILE* f, const char *fmt, ...)
174 log_println("jio_fprintf: IMPLEMENT ME!");
180 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
182 log_println("jio_vfprintf: IMPLEMENT ME!");
188 int jio_printf(const char *fmt, ...)
190 log_println("jio_printf: IMPLEMENT ME!");
196 /* JVM_GetInterfaceVersion */
198 jint JVM_GetInterfaceVersion()
200 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
202 #define JVM_INTERFACE_VERSION 4
204 return JVM_INTERFACE_VERSION;
208 /* JVM_CurrentTimeMillis */
210 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
212 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
214 return (jlong) builtin_currenttimemillis();
220 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
222 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
224 return (jlong) builtin_nanotime();
230 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
235 s = (java_handle_t *) src;
236 d = (java_handle_t *) dst;
238 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));
240 builtin_arraycopy(s, src_pos, d, dst_pos, length);
244 /* JVM_InitProperties */
246 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
251 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
253 h = (java_handle_t *) properties;
255 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
256 sun.nio.MaxDirectMemorySize property. Do this after setting
257 user properties to prevent people from setting the value with a
258 -D option, as requested. */
260 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
261 VM::get_current()->get_properties().put("sun.nio.MaxDirectMemorySize", buf);
263 // Fill the java.util.Properties object.
264 VM::get_current()->get_properties().fill(h);
272 void JVM_Exit(jint code)
274 log_println("JVM_Exit: IMPLEMENT ME!");
280 void JVM_Halt(jint code)
282 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
289 /* JVM_OnExit(void (*func)) */
291 void JVM_OnExit(void (*func)(void))
293 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
301 TRACEJVMCALLS(("JVM_GC()"));
307 /* JVM_MaxObjectInspectionAge */
309 jlong JVM_MaxObjectInspectionAge(void)
311 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
317 /* JVM_TraceInstructions */
319 void JVM_TraceInstructions(jboolean on)
321 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
325 /* JVM_TraceMethodCalls */
327 void JVM_TraceMethodCalls(jboolean on)
329 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
333 /* JVM_TotalMemory */
335 jlong JVM_TotalMemory(void)
337 TRACEJVMCALLS(("JVM_TotalMemory()"));
339 return gc_get_heap_size();
345 jlong JVM_FreeMemory(void)
347 TRACEJVMCALLS(("JVM_FreeMemory()"));
349 return gc_get_free_bytes();
355 jlong JVM_MaxMemory(void)
357 TRACEJVMCALLS(("JVM_MaxMemory()"));
359 return gc_get_max_heap_size();
363 /* JVM_ActiveProcessorCount */
365 jint JVM_ActiveProcessorCount(void)
367 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
369 return os::processors_online();
373 /* JVM_FillInStackTrace */
375 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
377 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
379 java_handle_bytearray_t* ba = stacktrace_get_current();
384 java_lang_Throwable jlt(receiver, ba);
388 /* JVM_PrintStackTrace */
390 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
392 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
396 /* JVM_GetStackTraceDepth */
398 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
400 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
402 java_lang_Throwable jlt(throwable);
405 exceptions_throw_nullpointerexception();
409 java_handle_bytearray_t* ba = jlt.get_backtrace();
414 // We need a critical section here as the stacktrace structure is
415 // mapped onto a Java byte-array.
419 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
421 int32_t depth = st->length;
429 /* JVM_GetStackTraceElement */
431 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
433 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
435 java_lang_Throwable jlt(throwable);
436 java_handle_bytearray_t* ba = jlt.get_backtrace();
438 // XXX We need a critical section here as the stacktrace structure is
439 // mapped onto a Java byte-array.
440 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
442 return stacktrace_get_StackTraceElement(st, index);
448 jint JVM_IHashCode(JNIEnv* env, jobject handle)
450 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
452 java_lang_Object o(handle);
454 return o.get_hashcode();
458 /* JVM_MonitorWait */
460 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
462 #if defined(ENABLE_THREADS)
466 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
468 /* exceptions_throw_illegalargumentexception("argument out of range"); */
469 exceptions_throw_illegalargumentexception();
473 #if defined(ENABLE_THREADS)
474 o = (java_handle_t *) handle;
476 lock_wait_for_object(o, ms, 0);
481 /* JVM_MonitorNotify */
483 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
485 #if defined(ENABLE_THREADS)
489 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
491 #if defined(ENABLE_THREADS)
492 o = (java_handle_t *) handle;
494 lock_notify_object(o);
499 /* JVM_MonitorNotifyAll */
501 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
503 #if defined(ENABLE_THREADS)
507 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
509 #if defined(ENABLE_THREADS)
510 o = (java_handle_t *) handle;
512 lock_notify_all_object(o);
519 jobject JVM_Clone(JNIEnv* env, jobject handle)
521 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
523 return (jobject) builtin_clone(env, (java_handle_t *) handle);
527 /* JVM_InitializeCompiler */
529 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
531 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
535 /* JVM_IsSilentCompiler */
537 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
539 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
545 /* JVM_CompileClass */
547 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
549 log_println("JVM_CompileClass: IMPLEMENT ME!");
555 /* JVM_CompileClasses */
557 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
559 log_println("JVM_CompileClasses: IMPLEMENT ME!");
565 /* JVM_CompilerCommand */
567 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
569 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
575 /* JVM_EnableCompiler */
577 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
579 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
580 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
584 /* JVM_DisableCompiler */
586 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
588 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
589 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
593 /* JVM_GetLastErrorString */
595 jint JVM_GetLastErrorString(char* buf, int len)
597 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
599 HPI& hpi = VM::get_current()->get_hpi();
600 return hpi.get_system().GetLastErrorString(buf, len);
606 char *JVM_NativePath(char* path)
608 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
610 HPI& hpi = VM::get_current()->get_hpi();
611 return hpi.get_file().NativePath(path);
615 /* JVM_GetCallerClass */
617 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
621 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
623 c = stacktrace_get_caller_class(depth);
629 /* JVM_FindPrimitiveClass */
631 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
636 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
639 c = Primitive::get_class_by_name(u);
641 return (jclass) LLNI_classinfo_wrap(c);
645 /* JVM_ResolveClass */
647 void JVM_ResolveClass(JNIEnv* env, jclass cls)
649 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
650 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
654 /* JVM_FindClassFromClassLoader */
656 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
662 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
664 /* As of now, OpenJDK does not call this function with throwError
667 assert(throwError == false);
669 u = utf_new_char(name);
670 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
672 c = load_class_from_classloader(u, cl);
678 if (!(c->state & CLASS_INITIALIZED))
679 if (!initialize_class(c))
682 return (jclass) LLNI_classinfo_wrap(c);
686 /* JVM_FindClassFromClass */
688 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
690 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
696 /* JVM_DefineClass */
698 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
700 log_println("JVM_DefineClass: IMPLEMENT ME!");
706 /* JVM_DefineClassWithSource */
708 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
714 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
717 u = utf_new_char(name);
721 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
723 /* XXX do something with source */
725 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
727 return (jclass) LLNI_classinfo_wrap(c);
731 /* JVM_FindLoadedClass */
733 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
739 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
741 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
743 u = javastring_toutf((java_handle_t *) name, true);
744 c = classcache_lookup(cl, u);
746 return (jclass) LLNI_classinfo_wrap(c);
750 /* JVM_GetClassName */
752 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
756 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
758 c = LLNI_classinfo_unwrap(cls);
760 return (jstring) class_get_classname(c);
764 /* JVM_GetClassInterfaces */
766 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
769 java_handle_objectarray_t *oa;
771 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
773 c = LLNI_classinfo_unwrap(cls);
775 oa = class_get_interfaces(c);
777 return (jobjectArray) oa;
781 /* JVM_GetClassLoader */
783 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
788 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
790 c = LLNI_classinfo_unwrap(cls);
791 cl = class_get_classloader(c);
793 TRACEJVMCALLSEXIT(("->%p", cl));
799 /* JVM_IsInterface */
801 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
805 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
807 c = LLNI_classinfo_unwrap(cls);
809 return class_is_interface(c);
813 /* JVM_GetClassSigners */
815 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
817 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
823 /* JVM_SetClassSigners */
825 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
828 java_handle_objectarray_t *hoa;
830 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
832 c = LLNI_classinfo_unwrap(cls);
834 hoa = (java_handle_objectarray_t *) signers;
836 /* This call is ignored for primitive types and arrays. Signers
837 are only set once, ClassLoader.java, and thus shouldn't be
838 called with an array. Only the bootstrap loader creates
841 if (class_is_primitive(c) || class_is_array(c))
844 LLNI_classinfo_field_set(c, signers, hoa);
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);
1030 return (jobjectArray) oa;
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);
1179 return (jobjectArray) oa;
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);
1193 return (jobjectArray) oa;
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);
1210 return (jobjectArray) oa;
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 java_handle_objectarray_t *classes;
1624 java_handle_objectarray_t *packages;
1625 java_booleanarray_t *classEnabled;
1626 java_booleanarray_t *packageEnabled;
1627 #if defined(ENABLE_ASSERTION)
1632 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1634 #if defined(ENABLE_ASSERTION)
1635 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1637 classes = builtin_anewarray(0, class_java_lang_Object);
1639 if (classes == NULL)
1642 #if defined(ENABLE_ASSERTION)
1643 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1645 packages = builtin_anewarray(0, class_java_lang_Object);
1647 if (packages == NULL)
1650 #if defined(ENABLE_ASSERTION)
1651 classEnabled = builtin_newarray_boolean(assertion_class_count);
1653 classEnabled = builtin_newarray_boolean(0);
1655 if (classEnabled == NULL)
1658 #if defined(ENABLE_ASSERTION)
1659 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1661 packageEnabled = builtin_newarray_boolean(0);
1663 if (packageEnabled == NULL)
1666 #if defined(ENABLE_ASSERTION)
1667 /* initialize arrays */
1669 if (list_assertion_names != NULL) {
1673 for (List<assertion_name_t*>::iterator it = list_assertion_names->begin(); it != list_assertion_names->end(); it++) {
1674 assertion_name_t* item = *it;
1676 js = javastring_new_from_ascii(item->name);
1681 if (item->package == false) {
1682 classes->data[i] = js;
1683 classEnabled->data[i] = (jboolean) item->enabled;
1687 packages->data[j] = js;
1688 packageEnabled->data[j] = (jboolean) item->enabled;
1695 /* set instance fields */
1697 java_lang_AssertionStatusDirectives jlasd(classes, classEnabled, packages, packageEnabled);
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. The
2134 priority is set later during startup. */
2139 result = threads_thread_is_alive(t);
2145 /* JVM_SuspendThread */
2147 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2149 log_println("JVM_SuspendThread: Deprecated. Not implemented.");
2153 /* JVM_ResumeThread */
2155 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2157 log_println("JVM_ResumeThread: Deprecated. Not implemented.");
2161 /* JVM_SetThreadPriority */
2163 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2168 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2170 h = (java_handle_t *) jthread;
2171 t = thread_get_thread(h);
2173 /* The threadobject is null when a thread is created in Java. The
2174 priority is set later during startup. */
2179 threads_set_thread_priority(t->tid, prio);
2185 void JVM_Yield(JNIEnv *env, jclass threadClass)
2187 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2195 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2197 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2199 threads_sleep(millis, 0);
2203 /* JVM_CurrentThread */
2205 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2209 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2211 o = thread_get_current_object();
2217 /* JVM_CountStackFrames */
2219 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2221 log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2229 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2234 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2236 h = (java_handle_t *) jthread;
2237 t = thread_get_thread(h);
2242 threads_thread_interrupt(t);
2246 /* JVM_IsInterrupted */
2248 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2252 jboolean interrupted;
2254 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2256 h = (java_handle_t *) jthread;
2257 t = thread_get_thread(h);
2259 interrupted = thread_is_interrupted(t);
2261 if (interrupted && clear_interrupted)
2262 thread_set_interrupted(t, false);
2270 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2275 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2277 h = (java_handle_t *) obj;
2280 exceptions_throw_nullpointerexception();
2284 result = lock_is_held_by_current_thread(h);
2290 /* JVM_DumpAllStacks */
2292 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2294 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2298 /* JVM_CurrentLoadedClass */
2300 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2302 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2308 /* JVM_CurrentClassLoader */
2310 jobject JVM_CurrentClassLoader(JNIEnv *env)
2312 /* XXX if a method in a class in a trusted loader is in a
2313 doPrivileged, return NULL */
2315 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2321 /* JVM_GetClassContext */
2323 jobjectArray JVM_GetClassContext(JNIEnv *env)
2325 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2327 return (jobjectArray) stacktrace_getClassContext();
2331 /* JVM_ClassDepth */
2333 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2335 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2341 /* JVM_ClassLoaderDepth */
2343 jint JVM_ClassLoaderDepth(JNIEnv *env)
2345 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2351 /* JVM_GetSystemPackage */
2353 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2359 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2361 /* s = Package::find(name); */
2362 u = javastring_toutf((java_handle_t *) name, false);
2364 result = Package::find(u);
2367 s = javastring_new(result);
2375 /* JVM_GetSystemPackages */
2377 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2379 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2385 /* JVM_AllocateNewObject */
2387 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2389 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2395 /* JVM_AllocateNewArray */
2397 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2399 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2405 /* JVM_LatestUserDefinedLoader */
2407 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2411 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2413 cl = stacktrace_first_nonnull_classloader();
2415 return (jobject) cl;
2419 /* JVM_LoadClass0 */
2421 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2423 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2429 /* JVM_GetArrayLength */
2431 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2435 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2437 a = (java_handle_t *) arr;
2439 return array_length_get(a);
2443 /* JVM_GetArrayElement */
2445 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2450 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2452 a = (java_handle_t *) arr;
2454 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2455 /* exceptions_throw_illegalargumentexception(); */
2459 o = array_element_get(a, index);
2465 /* JVM_GetPrimitiveArrayElement */
2467 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2471 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2479 /* JVM_SetArrayElement */
2481 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2484 java_handle_t *value;
2486 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2488 a = (java_handle_t *) arr;
2489 value = (java_handle_t *) val;
2491 array_element_set(a, index, value);
2495 /* JVM_SetPrimitiveArrayElement */
2497 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2499 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2505 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2510 java_handle_objectarray_t *oa;
2512 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2514 if (eltClass == NULL) {
2515 exceptions_throw_nullpointerexception();
2519 /* NegativeArraySizeException is checked in builtin_newarray. */
2521 c = LLNI_classinfo_unwrap(eltClass);
2523 /* Create primitive or object array. */
2525 if (class_is_primitive(c)) {
2526 pc = Primitive::get_arrayclass_by_name(c->name);
2528 /* void arrays are not allowed. */
2531 exceptions_throw_illegalargumentexception();
2535 a = builtin_newarray(length, pc);
2540 oa = builtin_anewarray(length, c);
2542 return (jobject) oa;
2547 /* JVM_NewMultiArray */
2549 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2552 java_handle_intarray_t *ia;
2558 java_handle_objectarray_t *a;
2560 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2562 if (eltClass == NULL) {
2563 exceptions_throw_nullpointerexception();
2567 /* NegativeArraySizeException is checked in builtin_newarray. */
2569 c = LLNI_classinfo_unwrap(eltClass);
2571 ia = (java_handle_intarray_t *) dim;
2573 length = array_length_get((java_handle_t *) ia);
2575 /* We check here for exceptions thrown in array_length_get,
2576 otherwise these exceptions get overwritten by the following
2577 IllegalArgumentException. */
2582 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2583 exceptions_throw_illegalargumentexception();
2587 /* XXX This is just a quick hack to get it working. */
2589 dims = MNEW(long, length);
2591 for (i = 0; i < length; i++) {
2592 value = LLNI_array_direct(ia, i);
2593 dims[i] = (long) value;
2596 /* Create an array-class if necessary. */
2598 if (class_is_primitive(c))
2599 ac = Primitive::get_arrayclass_by_name(c->name);
2601 ac = class_array_of(c, true);
2606 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2612 /* JVM_InitializeSocketLibrary */
2614 jint JVM_InitializeSocketLibrary()
2616 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2618 HPI& hpi = VM::get_current()->get_hpi();
2619 return hpi.initialize_socket_library();
2625 jint JVM_Socket(jint domain, jint type, jint protocol)
2627 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2629 return os::socket(domain, type, protocol);
2633 /* JVM_SocketClose */
2635 jint JVM_SocketClose(jint fd)
2637 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2639 return os::close(fd);
2643 /* JVM_SocketShutdown */
2645 jint JVM_SocketShutdown(jint fd, jint howto)
2647 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2649 return os::shutdown(fd, howto);
2655 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2657 log_println("JVM_Recv: IMPLEMENT ME!");
2665 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2667 TRACEJVMCALLSENTER(("JVM_Send(fd=%d, buf=%p, nBytes=%d, flags=%d", fd, buf, nBytes, flags));
2669 int result = os::send(fd, buf, nBytes, flags);
2671 TRACEJVMCALLSEXIT(("->%d", result));
2679 jint JVM_Timeout(int fd, long timeout)
2681 log_println("JVM_Timeout: IMPLEMENT ME!");
2689 jint JVM_Listen(jint fd, jint count)
2691 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2693 return os::listen(fd, count);
2699 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2701 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2703 return os::connect(fd, him, len);
2709 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2711 log_println("JVM_Bind: IMPLEMENT ME!");
2719 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2721 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2723 return os::accept(fd, him, (socklen_t *) len);
2729 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2731 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2737 /* JVM_GetSockName */
2739 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2741 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2743 return os::getsockname(fd, him, (socklen_t *) len);
2749 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2751 log_println("JVM_SendTo: IMPLEMENT ME!");
2757 /* JVM_SocketAvailable */
2759 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2761 #if defined(FIONREAD)
2765 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2769 result = ioctl(fd, FIONREAD, &bytes);
2778 # error FIONREAD not defined
2783 /* JVM_GetSockOpt */
2785 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2787 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2789 return os::getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2793 /* JVM_SetSockOpt */
2795 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2797 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2799 return os::setsockopt(fd, level, optname, optval, optlen);
2803 /* JVM_GetHostName */
2805 int JVM_GetHostName(char *name, int namelen)
2809 TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2811 result = os::gethostname(name, namelen);
2813 TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
2819 /* JVM_GetHostByAddr */
2821 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2823 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2829 /* JVM_GetHostByName */
2831 struct hostent *JVM_GetHostByName(char* name)
2833 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2839 /* JVM_GetProtoByName */
2841 struct protoent *JVM_GetProtoByName(char* name)
2843 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2849 /* JVM_LoadLibrary */
2851 void* JVM_LoadLibrary(const char* name)
2853 TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
2855 utf* u = utf_new_char(name);
2857 NativeLibrary nl(u);
2858 void* handle = nl.open();
2860 TRACEJVMCALLSEXIT(("->%p", handle));
2866 /* JVM_UnloadLibrary */
2868 void JVM_UnloadLibrary(void* handle)
2870 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2872 NativeLibrary nl(handle);
2877 /* JVM_FindLibraryEntry */
2879 void *JVM_FindLibraryEntry(void* handle, const char* name)
2883 TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
2885 HPI& hpi = VM::get_current()->get_hpi();
2886 symbol = hpi.get_library().FindLibraryEntry(handle, name);
2888 TRACEJVMCALLSEXIT(("->%p", symbol));
2896 jboolean JVM_IsNaN(jdouble a)
2898 log_println("JVM_IsNaN: IMPLEMENT ME!");
2904 /* JVM_IsSupportedJNIVersion */
2906 jboolean JVM_IsSupportedJNIVersion(jint version)
2908 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
2910 return jni_version_check(version);
2914 /* JVM_InternString */
2916 jstring JVM_InternString(JNIEnv *env, jstring str)
2918 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
2920 return (jstring) javastring_intern((java_handle_t *) str);
2924 /* JVM_RawMonitorCreate */
2926 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2928 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
2930 Mutex* m = new Mutex();
2936 /* JVM_RawMonitorDestroy */
2938 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void* mon)
2940 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
2942 delete ((Mutex*) mon);
2946 /* JVM_RawMonitorEnter */
2948 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void* mon)
2950 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
2952 ((Mutex*) mon)->lock();
2958 /* JVM_RawMonitorExit */
2960 JNIEXPORT void JNICALL JVM_RawMonitorExit(void* mon)
2962 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
2964 ((Mutex*) mon)->unlock();
2968 /* JVM_SetPrimitiveFieldValues */
2970 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2972 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
2976 /* JVM_GetPrimitiveFieldValues */
2978 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2980 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
2984 /* JVM_AccessVMBooleanFlag */
2986 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
2988 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
2994 /* JVM_AccessVMIntFlag */
2996 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
2998 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3004 /* JVM_VMBreakPoint */
3006 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3008 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3012 /* JVM_GetClassFields */
3014 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3016 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3022 /* JVM_GetClassMethods */
3024 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3026 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3032 /* JVM_GetClassConstructors */
3034 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3036 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3042 /* JVM_GetClassField */
3044 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3046 log_println("JVM_GetClassField: IMPLEMENT ME!");
3052 /* JVM_GetClassMethod */
3054 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3056 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3062 /* JVM_GetClassConstructor */
3064 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3066 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3072 /* JVM_NewInstance */
3074 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3076 log_println("JVM_NewInstance: IMPLEMENT ME!");
3084 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3086 log_println("JVM_GetField: IMPLEMENT ME!");
3092 /* JVM_GetPrimitiveField */
3094 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3098 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3108 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3110 log_println("JVM_SetField: IMPLEMENT ME!");
3114 /* JVM_SetPrimitiveField */
3116 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3118 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3122 /* JVM_InvokeMethod */
3124 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3126 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3128 java_lang_reflect_Method jlrm(method);
3130 java_handle_t* result = jlrm.invoke((java_handle_t*) obj, (java_handle_objectarray_t*) args0);
3132 return (jobject) result;
3136 /* JVM_NewInstanceFromConstructor */
3138 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3140 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3142 java_lang_reflect_Constructor jlrc(con);
3143 java_handle_t* o = jlrc.new_instance((java_handle_objectarray_t*) args0);
3149 /* JVM_SupportsCX8 */
3151 jboolean JVM_SupportsCX8()
3153 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3163 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3165 log_println("JVM_CX8Field: IMPLEMENT ME!");
3171 /* JVM_GetAllThreads */
3173 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3175 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3181 /* JVM_DumpThreads */
3183 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3187 TRACEJVMCALLS(("JVM_DumpThreads((env=%p, threadClass=%p, threads=%p)", env, threadClass, threads));
3189 if (threads == NULL) {
3190 exceptions_throw_nullpointerexception();
3194 // Get length of the threads array.
3195 int32_t length = array_length_get((java_handle_t*) threads);
3198 exceptions_throw_illegalargumentexception();
3202 // Allocate array to hold stacktraces.
3203 classinfo* arrayclass = class_array_of(class_java_lang_StackTraceElement, true);
3204 java_handle_objectarray_t* oas = builtin_anewarray(length, arrayclass);
3210 // Iterate over all passed thread objects.
3211 for (i = 0; i < length; i++) {
3212 java_handle_t* thread = array_objectarray_element_get(threads, i);
3214 // Get thread for the given thread object.
3215 threadobject* t = thread_get_thread(thread);
3220 // Get stacktrace for given thread.
3221 stacktrace_t* st = stacktrace_get_of_thread(t);
3226 // Convert stacktrace into array of StackTraceElements.
3227 java_handle_objectarray_t* oa = stacktrace_get_StackTraceElements(st);
3229 array_objectarray_element_set(oas, i, (java_handle_t*) oa);
3236 /* JVM_GetManagement */
3238 void *JVM_GetManagement(jint version)
3240 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3242 return Management::get_jmm_interface(version);
3246 /* JVM_InitAgentProperties */
3248 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3250 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3256 /* JVM_GetEnclosingMethodInfo */
3258 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3262 java_handle_objectarray_t *oa;
3264 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3266 c = LLNI_classinfo_unwrap(ofClass);
3268 if ((c == NULL) || class_is_primitive(c))
3271 m = class_get_enclosingmethod_raw(c);
3276 oa = builtin_anewarray(3, class_java_lang_Object);
3281 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
3282 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3283 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3285 return (jobjectArray) oa;
3289 /* JVM_GetThreadStateValues */
3291 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3293 java_handle_intarray_t *ia;
3295 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3296 env, javaThreadState));
3298 /* If new thread states are added in future JDK and VM versions,
3299 this should check if the JDK version is compatible with thread
3300 states supported by the VM. Return NULL if not compatible.
3302 This function must map the VM java_lang_Thread::ThreadStatus
3303 to the Java thread state that the JDK supports. */
3305 switch (javaThreadState) {
3306 case THREAD_STATE_NEW:
3307 ia = builtin_newarray_int(1);
3312 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3315 case THREAD_STATE_RUNNABLE:
3316 ia = builtin_newarray_int(1);
3321 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3324 case THREAD_STATE_BLOCKED:
3325 ia = builtin_newarray_int(1);
3330 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3333 case THREAD_STATE_WAITING:
3334 ia = builtin_newarray_int(2);
3339 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3340 /* XXX Implement parked stuff. */
3341 /* array_intarray_element_set(ia, 1, PARKED); */
3344 case THREAD_STATE_TIMED_WAITING:
3345 ia = builtin_newarray_int(3);
3350 /* XXX Not sure about that one. */
3351 /* array_intarray_element_set(ia, 0, SLEEPING); */
3352 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3353 /* XXX Implement parked stuff. */
3354 /* array_intarray_element_set(ia, 2, PARKED); */
3357 case THREAD_STATE_PARKED:
3358 ia = builtin_newarray_int(2);
3363 array_intarray_element_set(ia, 0, THREAD_STATE_PARKED);
3366 case THREAD_STATE_TIMED_PARKED:
3367 ia = builtin_newarray_int(2);
3372 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_PARKED);
3375 case THREAD_STATE_TERMINATED:
3376 ia = builtin_newarray_int(1);
3381 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3385 /* Unknown state - probably incompatible JDK version */
3389 return (jintArray) ia;
3393 /* JVM_GetThreadStateNames */
3395 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3397 java_handle_intarray_t *ia;
3398 java_handle_objectarray_t *oa;
3401 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3402 env, javaThreadState, values));
3404 ia = (java_handle_intarray_t *) values;
3406 /* If new thread states are added in future JDK and VM versions,
3407 this should check if the JDK version is compatible with thread
3408 states supported by the VM. Return NULL if not compatible.
3410 This function must map the VM java_lang_Thread::ThreadStatus
3411 to the Java thread state that the JDK supports. */
3413 if (values == NULL) {
3414 exceptions_throw_nullpointerexception();
3418 switch (javaThreadState) {
3419 case THREAD_STATE_NEW:
3420 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3422 oa = builtin_anewarray(1, class_java_lang_String);
3427 s = javastring_new(utf_new_char("NEW"));
3432 array_objectarray_element_set(oa, 0, s);
3435 case THREAD_STATE_RUNNABLE:
3436 oa = builtin_anewarray(1, class_java_lang_String);
3441 s = javastring_new(utf_new_char("RUNNABLE"));
3446 array_objectarray_element_set(oa, 0, s);
3449 case THREAD_STATE_BLOCKED:
3450 oa = builtin_anewarray(1, class_java_lang_String);
3455 s = javastring_new(utf_new_char("BLOCKED"));
3460 array_objectarray_element_set(oa, 0, s);
3463 case THREAD_STATE_WAITING:
3464 oa = builtin_anewarray(2, class_java_lang_String);
3469 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3474 array_objectarray_element_set(oa, 0, s);
3475 /* array_objectarray_element_set(oa, 1, s); */
3478 case THREAD_STATE_TIMED_WAITING:
3479 oa = builtin_anewarray(3, class_java_lang_String);
3484 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3485 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3490 /* array_objectarray_element_set(oa, 0, s); */
3491 array_objectarray_element_set(oa, 0, s);
3492 /* array_objectarray_element_set(oa, 2, s); */
3495 case THREAD_STATE_PARKED:
3496 oa = builtin_anewarray(2, class_java_lang_String);
3501 s = javastring_new(utf_new_char("WAITING.PARKED"));
3506 array_objectarray_element_set(oa, 0, s);
3507 /* array_objectarray_element_set(oa, 1, s); */
3510 case THREAD_STATE_TIMED_PARKED:
3511 oa = builtin_anewarray(3, class_java_lang_String);
3516 s = javastring_new(utf_new_char("TIMED_WAITING.PARKED"));
3521 array_objectarray_element_set(oa, 0, s);
3522 /* array_objectarray_element_set(oa, 1, s); */
3525 case THREAD_STATE_TERMINATED:
3526 oa = builtin_anewarray(1, class_java_lang_String);
3531 s = javastring_new(utf_new_char("TERMINATED"));
3536 array_objectarray_element_set(oa, 0, s);
3540 /* Unknown state - probably incompatible JDK version */
3544 return (jobjectArray) oa;
3548 /* JVM_GetVersionInfo */
3550 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3552 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3556 /* OS: JVM_RegisterSignal */
3558 void *JVM_RegisterSignal(jint sig, void *handler)
3560 functionptr newHandler;
3562 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3564 if (handler == (void *) 2)
3565 newHandler = (functionptr) signal_thread_handler;
3567 newHandler = (functionptr) (uintptr_t) handler;
3574 /* These signals are already used by the VM. */
3578 /* This signal is used by the VM to dump thread stacks unless
3579 ReduceSignalUsage is set, in which case the user is allowed
3580 to set his own _native_ handler for this signal; thus, in
3581 either case, we do not allow JVM_RegisterSignal to change
3591 signal_register_signal(sig, newHandler, SA_RESTART | SA_SIGINFO);
3593 /* XXX Should return old handler. */
3599 /* OS: JVM_RaiseSignal */
3601 jboolean JVM_RaiseSignal(jint sig)
3603 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3609 /* OS: JVM_FindSignal */
3611 jint JVM_FindSignal(const char *name)
3613 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3615 #if defined(__LINUX__)
3616 if (strcmp(name, "HUP") == 0)
3619 if (strcmp(name, "INT") == 0)
3622 if (strcmp(name, "TERM") == 0)
3624 #elif defined(__SOLARIS__)
3627 if (os::str2sig(name, &signum) == -1)
3632 # error Not implemented for this OS.
3642 * These are local overrides for various environment variables in Emacs.
3643 * Please do not remove this and leave it at the end of the file, where
3644 * Emacs will automagically detect them.
3645 * ---------------------------------------------------------------------
3648 * indent-tabs-mode: t
3652 * vim:noexpandtab:sw=4:ts=4: