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/socket.h>
43 #include <sys/types.h>
45 // Include our JNI header before the JVM headers, because the JVM
46 // headers include jni.h and we want to override the typedefs in
48 #include "native/jni.hpp"
50 // We include jvm_md.h before jvm.h as the latter includes the former.
51 #include INCLUDE_JVM_MD_H
52 #include INCLUDE_JVM_H
54 #include "fdlibm/fdlibm.h"
56 #include "mm/memory.hpp"
58 #include "native/llni.h"
59 #include "native/native.hpp"
61 #include "native/vm/reflection.hpp"
63 #include "native/vm/openjdk/hpi.hpp"
64 #include "native/vm/openjdk/management.hpp"
66 #include "threads/lock.hpp"
67 #include "threads/thread.hpp"
68 #include "threads/threadlist.hpp"
70 #include "toolbox/logging.hpp"
71 #include "toolbox/list.hpp"
73 #include "vm/array.hpp"
75 #if defined(ENABLE_ASSERTION)
76 #include "vm/assertion.hpp"
79 #include "vm/jit/builtin.hpp"
80 #include "vm/classcache.hpp"
81 #include "vm/exceptions.hpp"
82 #include "vm/global.h"
83 #include "vm/globals.hpp"
84 #include "vm/initialize.hpp"
85 #include "vm/javaobjects.hpp"
86 #include "vm/options.h"
88 #include "vm/package.hpp"
89 #include "vm/primitive.hpp"
90 #include "vm/properties.hpp"
91 #include "vm/resolve.hpp"
92 #include "vm/signallocal.hpp"
93 #include "vm/string.hpp"
96 #include "vm/jit/stacktrace.hpp"
99 /* debugging macros ***********************************************************/
103 # define TRACEJVMCALLS(x) \
105 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
110 # define TRACEJVMCALLSENTER(x) \
112 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
118 # define TRACEJVMCALLSEXIT(x) \
120 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
126 # define TRACEJVMCALLSVERBOSE(x) \
128 if (opt_TraceJVMCallsVerbose) { \
133 # define PRINTJVMWARNINGS(x) \
135 if (opt_PrintWarnings) { \
142 # define TRACEJVMCALLS(x)
143 # define TRACEJVMCALLSENTER(x)
144 # define TRACEJVMCALLSEXIT(x)
145 # define TRACEJVMCALLSVERBOSE(x)
146 # define PRINTJVMWARNINGS(x)
151 // Interface functions are exported as C functions.
154 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
156 if ((intptr_t) count <= 0)
159 return vsnprintf(str, count, fmt, args);
163 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
169 len = jio_vsnprintf(str, count, fmt, ap);
176 int jio_fprintf(FILE* f, const char *fmt, ...)
178 log_println("jio_fprintf: IMPLEMENT ME!");
184 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
186 log_println("jio_vfprintf: IMPLEMENT ME!");
192 int jio_printf(const char *fmt, ...)
194 log_println("jio_printf: IMPLEMENT ME!");
200 /* JVM_GetInterfaceVersion */
202 jint JVM_GetInterfaceVersion()
204 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
206 #define JVM_INTERFACE_VERSION 4
208 return JVM_INTERFACE_VERSION;
212 /* JVM_CurrentTimeMillis */
214 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
216 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
218 return (jlong) builtin_currenttimemillis();
224 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
226 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
228 return (jlong) builtin_nanotime();
234 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
239 s = (java_handle_t *) src;
240 d = (java_handle_t *) dst;
242 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));
244 builtin_arraycopy(s, src_pos, d, dst_pos, length);
248 /* JVM_InitProperties */
250 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
255 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
257 h = (java_handle_t *) properties;
259 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
260 sun.nio.MaxDirectMemorySize property. Do this after setting
261 user properties to prevent people from setting the value with a
262 -D option, as requested. */
264 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
265 VM::get_current()->get_properties().put("sun.nio.MaxDirectMemorySize", buf);
267 // Fill the java.util.Properties object.
268 VM::get_current()->get_properties().fill(h);
276 void JVM_Exit(jint code)
278 log_println("JVM_Exit: IMPLEMENT ME!");
284 void JVM_Halt(jint code)
286 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
293 /* JVM_OnExit(void (*func)) */
295 void JVM_OnExit(void (*func)(void))
297 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
305 TRACEJVMCALLS(("JVM_GC()"));
311 /* JVM_MaxObjectInspectionAge */
313 jlong JVM_MaxObjectInspectionAge(void)
315 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
321 /* JVM_TraceInstructions */
323 void JVM_TraceInstructions(jboolean on)
325 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
329 /* JVM_TraceMethodCalls */
331 void JVM_TraceMethodCalls(jboolean on)
333 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
337 /* JVM_TotalMemory */
339 jlong JVM_TotalMemory(void)
341 TRACEJVMCALLS(("JVM_TotalMemory()"));
343 return gc_get_heap_size();
349 jlong JVM_FreeMemory(void)
351 TRACEJVMCALLS(("JVM_FreeMemory()"));
353 return gc_get_free_bytes();
359 jlong JVM_MaxMemory(void)
361 TRACEJVMCALLS(("JVM_MaxMemory()"));
363 return gc_get_max_heap_size();
367 /* JVM_ActiveProcessorCount */
369 jint JVM_ActiveProcessorCount(void)
371 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
373 return os::processors_online();
377 /* JVM_FillInStackTrace */
379 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
381 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
383 java_handle_bytearray_t* ba = stacktrace_get_current();
388 java_lang_Throwable jlt(receiver, ba);
392 /* JVM_PrintStackTrace */
394 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
396 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
400 /* JVM_GetStackTraceDepth */
402 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
404 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
406 java_lang_Throwable jlt(throwable);
409 exceptions_throw_nullpointerexception();
413 ByteArray ba(jlt.get_backtrace());
418 // We need a critical section here as the stacktrace structure is
419 // mapped onto a Java byte-array.
423 stacktrace_t* st = (stacktrace_t *) ba.get_raw_data_ptr();
425 int32_t depth = st->length;
433 /* JVM_GetStackTraceElement */
435 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
437 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
439 java_lang_Throwable jlt(throwable);
440 ByteArray ba(jlt.get_backtrace());
442 // XXX We need a critical section here as the stacktrace structure is
443 // mapped onto a Java byte-array.
444 stacktrace_t* st = (stacktrace_t *) ba.get_raw_data_ptr();
446 return stacktrace_get_StackTraceElement(st, index);
452 jint JVM_IHashCode(JNIEnv* env, jobject handle)
454 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
456 java_lang_Object o(handle);
458 return o.get_hashcode();
462 /* JVM_MonitorWait */
464 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
466 #if defined(ENABLE_THREADS)
470 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
472 /* exceptions_throw_illegalargumentexception("argument out of range"); */
473 exceptions_throw_illegalargumentexception();
477 #if defined(ENABLE_THREADS)
478 o = (java_handle_t *) handle;
480 lock_wait_for_object(o, ms, 0);
485 /* JVM_MonitorNotify */
487 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
489 #if defined(ENABLE_THREADS)
493 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
495 #if defined(ENABLE_THREADS)
496 o = (java_handle_t *) handle;
498 lock_notify_object(o);
503 /* JVM_MonitorNotifyAll */
505 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
507 #if defined(ENABLE_THREADS)
511 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
513 #if defined(ENABLE_THREADS)
514 o = (java_handle_t *) handle;
516 lock_notify_all_object(o);
523 jobject JVM_Clone(JNIEnv* env, jobject handle)
525 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
527 return (jobject) builtin_clone(env, (java_handle_t *) handle);
531 /* JVM_InitializeCompiler */
533 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
535 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
539 /* JVM_IsSilentCompiler */
541 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
543 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
549 /* JVM_CompileClass */
551 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
553 log_println("JVM_CompileClass: IMPLEMENT ME!");
559 /* JVM_CompileClasses */
561 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
563 log_println("JVM_CompileClasses: IMPLEMENT ME!");
569 /* JVM_CompilerCommand */
571 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
573 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
579 /* JVM_EnableCompiler */
581 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
583 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
584 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
588 /* JVM_DisableCompiler */
590 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
592 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
593 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
597 /* JVM_GetLastErrorString */
599 jint JVM_GetLastErrorString(char* buf, int len)
601 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
603 HPI& hpi = VM::get_current()->get_hpi();
604 return hpi.get_system().GetLastErrorString(buf, len);
610 char *JVM_NativePath(char* path)
612 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
614 HPI& hpi = VM::get_current()->get_hpi();
615 return hpi.get_file().NativePath(path);
619 /* JVM_GetCallerClass */
621 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
625 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
627 c = stacktrace_get_caller_class(depth);
633 /* JVM_FindPrimitiveClass */
635 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
640 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
643 c = Primitive::get_class_by_name(u);
645 return (jclass) LLNI_classinfo_wrap(c);
649 /* JVM_ResolveClass */
651 void JVM_ResolveClass(JNIEnv* env, jclass cls)
653 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
654 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
658 /* JVM_FindClassFromClassLoader */
660 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
666 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
668 /* As of now, OpenJDK does not call this function with throwError
671 assert(throwError == false);
673 u = utf_new_char(name);
674 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
676 c = load_class_from_classloader(u, cl);
682 if (!(c->state & CLASS_INITIALIZED))
683 if (!initialize_class(c))
686 return (jclass) LLNI_classinfo_wrap(c);
690 /* JVM_FindClassFromClass */
692 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
694 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
700 /* JVM_DefineClass */
702 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
704 log_println("JVM_DefineClass: IMPLEMENT ME!");
710 /* JVM_DefineClassWithSource */
712 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
718 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
721 u = utf_new_char(name);
725 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
727 /* XXX do something with source */
729 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
731 return (jclass) LLNI_classinfo_wrap(c);
735 /* JVM_FindLoadedClass */
737 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
743 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
745 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
747 u = javastring_toutf((java_handle_t *) name, true);
748 c = classcache_lookup(cl, u);
750 return (jclass) LLNI_classinfo_wrap(c);
754 /* JVM_GetClassName */
756 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
760 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
762 c = LLNI_classinfo_unwrap(cls);
764 return (jstring) class_get_classname(c);
768 /* JVM_GetClassInterfaces */
770 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
773 java_handle_objectarray_t *oa;
775 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
777 c = LLNI_classinfo_unwrap(cls);
779 oa = class_get_interfaces(c);
785 /* JVM_GetClassLoader */
787 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
792 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
794 c = LLNI_classinfo_unwrap(cls);
795 cl = class_get_classloader(c);
797 TRACEJVMCALLSEXIT(("->%p", cl));
803 /* JVM_IsInterface */
805 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
809 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
811 c = LLNI_classinfo_unwrap(cls);
813 return class_is_interface(c);
817 /* JVM_GetClassSigners */
819 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
821 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
827 /* JVM_SetClassSigners */
829 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
831 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
833 classinfo* c = LLNI_classinfo_unwrap(cls);
835 ObjectArray oa(signers);
837 /* This call is ignored for primitive types and arrays. Signers
838 are only set once, ClassLoader.java, and thus shouldn't be
839 called with an array. Only the bootstrap loader creates
842 if (class_is_primitive(c) || class_is_array(c))
846 LLNI_classinfo_field_set(c, signers, (java_objectarray_t*) oa.get_handle());
850 /* JVM_GetProtectionDomain */
852 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
856 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
858 c = LLNI_classinfo_unwrap(cls);
861 exceptions_throw_nullpointerexception();
865 /* Primitive types do not have a protection domain. */
867 if (class_is_primitive(c))
870 return (jobject) c->protectiondomain;
874 /* JVM_SetProtectionDomain */
876 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
878 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
882 /* JVM_DoPrivileged */
884 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
889 java_handle_t *result;
892 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
894 h = (java_handle_t *) action;
895 LLNI_class_get(h, c);
897 if (action == NULL) {
898 exceptions_throw_nullpointerexception();
902 /* lookup run() method (throw no exceptions) */
904 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
907 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
908 exceptions_throw_internalerror("No run method");
912 /* XXX It seems something with a privileged stack needs to be done
915 result = vm_call_method(m, h);
917 e = exceptions_get_exception();
920 if ( builtin_instanceof(e, class_java_lang_Exception) &&
921 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
922 exceptions_clear_exception();
923 exceptions_throw_privilegedactionexception(e);
929 return (jobject) result;
933 /* JVM_GetInheritedAccessControlContext */
935 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
937 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
943 /* JVM_GetStackAccessControlContext */
945 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
947 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
949 /* XXX All stuff I tested so far works without that function. At
950 some point we have to implement it, but I disable the output
951 for now to make IcedTea happy. */
957 /* JVM_IsArrayClass */
959 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
963 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
965 c = LLNI_classinfo_unwrap(cls);
967 return class_is_array(c);
971 /* JVM_IsPrimitiveClass */
973 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
977 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
979 c = LLNI_classinfo_unwrap(cls);
981 return class_is_primitive(c);
985 /* JVM_GetComponentType */
987 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
989 classinfo *component;
992 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
994 c = LLNI_classinfo_unwrap(cls);
996 component = class_get_componenttype(c);
998 return (jclass) LLNI_classinfo_wrap(component);
1002 /* JVM_GetClassModifiers */
1004 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1009 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1011 c = LLNI_classinfo_unwrap(cls);
1013 flags = class_get_modifiers(c, false);
1019 /* JVM_GetDeclaredClasses */
1021 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1024 java_handle_objectarray_t *oa;
1026 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1028 c = LLNI_classinfo_unwrap(ofClass);
1030 oa = class_get_declaredclasses(c, false);
1036 /* JVM_GetDeclaringClass */
1038 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1043 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1045 c = LLNI_classinfo_unwrap(ofClass);
1047 dc = class_get_declaringclass(c);
1049 return (jclass) LLNI_classinfo_wrap(dc);
1053 /* JVM_GetClassSignature */
1055 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1061 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1063 c = LLNI_classinfo_unwrap(cls);
1065 /* Get the signature of the class. */
1067 u = class_get_signature(c);
1072 /* Convert UTF-string to a Java-string. */
1074 s = javastring_new(u);
1080 /* JVM_GetClassAnnotations */
1082 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1084 TRACEJVMCALLS(("JVM_GetClassAnnotations(env=%p, cls=%p)", env, cls));
1087 exceptions_throw_nullpointerexception();
1091 classinfo* c = LLNI_classinfo_unwrap(cls);
1093 /* get annotations: */
1094 java_handle_bytearray_t* annotations = class_get_annotations(c);
1096 return (jbyteArray) annotations;
1100 /* JVM_GetFieldAnnotations */
1102 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1104 TRACEJVMCALLS(("JVM_GetFieldAnnotations(env=%p, field=%p)", env, field));
1106 java_lang_reflect_Field jlrf(field);
1108 if (jlrf.is_null()) {
1109 exceptions_throw_nullpointerexception();
1113 return (jbyteArray) jlrf.get_annotations();
1117 /* JVM_GetMethodAnnotations */
1119 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1121 TRACEJVMCALLS(("JVM_GetMethodAnnotations(env=%p, method=%p)", env, method));
1123 java_lang_reflect_Method jlrm(method);
1125 if (jlrm.is_null()) {
1126 exceptions_throw_nullpointerexception();
1130 return (jbyteArray) jlrm.get_annotations();
1134 /* JVM_GetMethodDefaultAnnotationValue */
1136 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1138 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue(env=%p, method=%p)", env, method));
1140 java_lang_reflect_Method jlrm(method);
1142 if (jlrm.is_null()) {
1143 exceptions_throw_nullpointerexception();
1147 return (jbyteArray) jlrm.get_annotationDefault();
1151 /* JVM_GetMethodParameterAnnotations */
1153 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1155 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations(env=%p, method=%p)", env, method));
1157 java_lang_reflect_Method jlrm(method);
1159 if (jlrm.is_null()) {
1160 exceptions_throw_nullpointerexception();
1164 return (jbyteArray) jlrm.get_parameterAnnotations();
1168 /* JVM_GetClassDeclaredFields */
1170 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1173 java_handle_objectarray_t *oa;
1175 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1177 c = LLNI_classinfo_unwrap(ofClass);
1179 oa = class_get_declaredfields(c, publicOnly);
1185 /* JVM_GetClassDeclaredMethods */
1187 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1189 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1191 classinfo* c = LLNI_classinfo_unwrap(ofClass);
1193 java_handle_objectarray_t* oa = class_get_declaredmethods(c, publicOnly);
1199 /* JVM_GetClassDeclaredConstructors */
1201 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1204 java_handle_objectarray_t *oa;
1206 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1208 c = LLNI_classinfo_unwrap(ofClass);
1210 oa = class_get_declaredconstructors(c, publicOnly);
1216 /* JVM_GetClassAccessFlags */
1218 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1222 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1224 c = LLNI_classinfo_unwrap(cls);
1226 /* Primitive type classes have the correct access flags. */
1228 return c->flags & ACC_CLASS_REFLECT_MASK;
1232 /* JVM_GetClassConstantPool */
1234 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1236 #if defined(ENABLE_ANNOTATIONS)
1237 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1239 java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
1240 sun_reflect_ConstantPool cp(h, cls);
1246 return (jobject) cp.get_handle();
1248 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1254 /* JVM_ConstantPoolGetSize */
1256 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1258 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1260 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1262 c = LLNI_classinfo_unwrap(jcpool);
1268 /* JVM_ConstantPoolGetClassAt */
1270 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1272 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1273 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1274 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1276 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1278 c = LLNI_classinfo_unwrap(jcpool);
1280 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1283 exceptions_throw_illegalargumentexception();
1287 result = resolve_classref_eager(ref);
1289 return (jclass) LLNI_classinfo_wrap(result);
1293 /* JVM_ConstantPoolGetClassAtIfLoaded */
1295 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1297 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1298 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1299 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1301 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1303 c = LLNI_classinfo_unwrap(jcpool);
1305 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1308 exceptions_throw_illegalargumentexception();
1312 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1316 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1320 return (jclass) LLNI_classinfo_wrap(result);
1324 /* JVM_ConstantPoolGetMethodAt */
1326 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1328 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1329 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1331 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1333 cls = LLNI_classinfo_unwrap(jcpool);
1334 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1337 exceptions_throw_illegalargumentexception();
1341 // Create a new java.lang.reflect.Method Java object.
1342 /* XXX: is that right? or do I have to use resolve_method_*? */
1343 java_lang_reflect_Method jlrm(ref->p.method);
1345 return (jobject) jlrm.get_handle();
1349 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1351 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1353 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1354 classinfo *c = NULL; /* resolved declaring class of the method */
1355 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1357 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1359 cls = LLNI_classinfo_unwrap(jcpool);
1360 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1363 exceptions_throw_illegalargumentexception();
1367 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1371 if (c == NULL || !(c->state & CLASS_LOADED)) {
1375 // Create a new java.lang.reflect.Method Java object.
1376 java_lang_reflect_Method jlrm(ref->p.method);
1378 return (jobject) jlrm.get_handle();
1382 /* JVM_ConstantPoolGetFieldAt */
1384 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1386 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1387 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1389 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1391 cls = LLNI_classinfo_unwrap(jcpool);
1392 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1395 exceptions_throw_illegalargumentexception();
1399 // Create a new java.lang.reflect.Field Java object.
1400 java_lang_reflect_Field jlrf(ref->p.field);
1402 return (jobject) jlrf.get_handle();
1406 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1408 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1410 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1411 classinfo *c; /* resolved declaring class for the field */
1412 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1414 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1416 cls = LLNI_classinfo_unwrap(jcpool);
1417 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1420 exceptions_throw_illegalargumentexception();
1424 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1428 if (c == NULL || !(c->state & CLASS_LOADED)) {
1432 // Create a new java.lang.reflect.Field Java object.
1433 java_lang_reflect_Field jlrf(ref->p.field);
1435 return (jobject) jlrf.get_handle();
1439 /* JVM_ConstantPoolGetMemberRefInfoAt */
1441 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1443 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1445 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1451 /* JVM_ConstantPoolGetIntAt */
1453 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1455 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1456 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1458 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1460 cls = LLNI_classinfo_unwrap(jcpool);
1461 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1464 exceptions_throw_illegalargumentexception();
1472 /* JVM_ConstantPoolGetLongAt */
1474 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1476 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1477 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1479 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1481 cls = LLNI_classinfo_unwrap(jcpool);
1482 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1485 exceptions_throw_illegalargumentexception();
1493 /* JVM_ConstantPoolGetFloatAt */
1495 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1497 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1498 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1500 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1502 cls = LLNI_classinfo_unwrap(jcpool);
1503 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1506 exceptions_throw_illegalargumentexception();
1514 /* JVM_ConstantPoolGetDoubleAt */
1516 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1518 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1519 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1521 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1523 cls = LLNI_classinfo_unwrap(jcpool);
1524 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1527 exceptions_throw_illegalargumentexception();
1535 /* JVM_ConstantPoolGetStringAt */
1537 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1539 utf *ref; /* utf object for the string in constant pool at index 'index' */
1540 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1542 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1544 cls = LLNI_classinfo_unwrap(jcpool);
1545 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1548 exceptions_throw_illegalargumentexception();
1552 /* XXX: I hope literalstring_new is the right Function. */
1553 return (jstring)literalstring_new(ref);
1557 /* JVM_ConstantPoolGetUTF8At */
1559 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1561 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1562 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1564 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1566 cls = LLNI_classinfo_unwrap(jcpool);
1567 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1570 exceptions_throw_illegalargumentexception();
1574 /* XXX: I hope literalstring_new is the right Function. */
1575 return (jstring)literalstring_new(ref);
1579 /* JVM_DesiredAssertionStatus */
1581 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1583 #if defined(ENABLE_ASSERTION)
1588 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1590 c = LLNI_classinfo_unwrap(cls);
1592 if (c->classloader == NULL) {
1593 status = (jboolean)assertion_system_enabled;
1596 status = (jboolean)assertion_user_enabled;
1599 if (list_assertion_names != NULL) {
1600 for (List<assertion_name_t*>::iterator it = list_assertion_names->begin();
1601 it != list_assertion_names->end(); it++) {
1602 assertion_name_t* item = *it;
1604 name = utf_new_char(item->name);
1605 if (name == c->packagename) {
1606 status = (jboolean)item->enabled;
1608 else if (name == c->name) {
1609 status = (jboolean)item->enabled;
1616 return (jboolean)false;
1621 /* JVM_AssertionStatusDirectives */
1623 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1625 #if defined(ENABLE_ASSERTION)
1630 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1632 #if defined(ENABLE_ASSERTION)
1633 ObjectArray classes(assertion_class_count, class_java_lang_Object);
1635 ObjectArray classes(0, class_java_lang_Object);
1637 if (classes.is_null())
1640 #if defined(ENABLE_ASSERTION)
1641 ObjectArray packages(assertion_package_count, class_java_lang_Object);
1643 ObjectArray packages(0, class_java_lang_Object);
1645 if (packages.is_null())
1648 #if defined(ENABLE_ASSERTION)
1649 BooleanArray classEnabled(assertion_class_count);
1651 BooleanArray classEnabled(0);
1653 if (classEnabled.is_null())
1656 #if defined(ENABLE_ASSERTION)
1657 BooleanArray packageEnabled(assertion_package_count);
1659 BooleanArray packageEnabled(0);
1661 if (packageEnabled.is_null())
1664 #if defined(ENABLE_ASSERTION)
1665 /* initialize arrays */
1667 if (list_assertion_names != NULL) {
1671 for (List<assertion_name_t*>::iterator it = list_assertion_names->begin(); it != list_assertion_names->end(); it++) {
1672 assertion_name_t* item = *it;
1674 js = javastring_new_from_ascii(item->name);
1679 if (item->package == false) {
1680 classes.set_element(i, js);
1681 classEnabled.set_element(i, (jboolean) item->enabled);
1685 packages.set_element(j, js);
1686 packageEnabled.set_element(j, (jboolean) item->enabled);
1693 /* set instance fields */
1695 java_lang_AssertionStatusDirectives jlasd(
1696 classes.get_handle(),
1697 classEnabled.get_handle(),
1698 packages.get_handle(),
1699 packageEnabled.get_handle());
1701 return (jobject) jlasd.get_handle();
1705 /* JVM_GetClassNameUTF */
1707 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1709 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1715 /* JVM_GetClassCPTypes */
1717 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1719 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1723 /* JVM_GetClassCPEntriesCount */
1725 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1727 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1733 /* JVM_GetClassFieldsCount */
1735 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1737 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1743 /* JVM_GetClassMethodsCount */
1745 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1747 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1753 /* JVM_GetMethodIxExceptionIndexes */
1755 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1757 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1761 /* JVM_GetMethodIxExceptionsCount */
1763 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1765 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1771 /* JVM_GetMethodIxByteCode */
1773 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1775 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1779 /* JVM_GetMethodIxByteCodeLength */
1781 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1783 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1789 /* JVM_GetMethodIxExceptionTableEntry */
1791 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1793 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1797 /* JVM_GetMethodIxExceptionTableLength */
1799 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1801 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1807 /* JVM_GetMethodIxModifiers */
1809 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1811 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1817 /* JVM_GetFieldIxModifiers */
1819 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1821 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1827 /* JVM_GetMethodIxLocalsCount */
1829 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1831 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1837 /* JVM_GetMethodIxArgsSize */
1839 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1841 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1847 /* JVM_GetMethodIxMaxStack */
1849 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1851 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1857 /* JVM_IsConstructorIx */
1859 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1861 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1867 /* JVM_GetMethodIxNameUTF */
1869 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1871 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1877 /* JVM_GetMethodIxSignatureUTF */
1879 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1881 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1887 /* JVM_GetCPFieldNameUTF */
1889 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1891 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1897 /* JVM_GetCPMethodNameUTF */
1899 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1901 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1907 /* JVM_GetCPMethodSignatureUTF */
1909 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1911 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1917 /* JVM_GetCPFieldSignatureUTF */
1919 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1921 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1927 /* JVM_GetCPClassNameUTF */
1929 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1931 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
1937 /* JVM_GetCPFieldClassNameUTF */
1939 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1941 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
1947 /* JVM_GetCPMethodClassNameUTF */
1949 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1951 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
1957 /* JVM_GetCPFieldModifiers */
1959 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1961 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
1967 /* JVM_GetCPMethodModifiers */
1969 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1971 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
1977 /* JVM_ReleaseUTF */
1979 void JVM_ReleaseUTF(const char *utf)
1981 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
1985 /* JVM_IsSameClassPackage */
1987 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
1989 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
1997 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2000 * JVM I/O error codes
2002 #define JVM_EEXIST -100
2004 jint JVM_Open(const char* fname, jint flags, jint mode)
2008 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2010 HPI& hpi = VM::get_current()->get_hpi();
2011 result = hpi.get_file().Open(fname, flags, mode);
2029 jint JVM_Close(jint fd)
2031 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2033 HPI& hpi = VM::get_current()->get_hpi();
2034 return hpi.get_file().Close(fd);
2040 jint JVM_Read(jint fd, char* buf, jint nbytes)
2042 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2044 HPI& hpi = VM::get_current()->get_hpi();
2045 return (jint) hpi.get_file().Read(fd, buf, nbytes);
2051 jint JVM_Write(jint fd, char* buf, jint nbytes)
2053 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2055 HPI& hpi = VM::get_current()->get_hpi();
2056 return (jint) hpi.get_file().Write(fd, buf, nbytes);
2062 jint JVM_Available(jint fd, jlong* pbytes)
2064 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2066 HPI& hpi = VM::get_current()->get_hpi();
2067 return hpi.get_file().Available(fd, pbytes);
2073 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2075 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2077 HPI& hpi = VM::get_current()->get_hpi();
2078 return hpi.get_file().Seek(fd, (off_t) offset, whence);
2084 jint JVM_SetLength(jint fd, jlong length)
2086 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2088 HPI& hpi = VM::get_current()->get_hpi();
2089 return hpi.get_file().SetLength(fd, length);
2095 jint JVM_Sync(jint fd)
2097 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2099 HPI& hpi = VM::get_current()->get_hpi();
2100 return hpi.get_file().Sync(fd);
2104 /* JVM_StartThread */
2106 void JVM_StartThread(JNIEnv* env, jobject jthread)
2108 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2110 threads_thread_start((java_handle_t *) jthread);
2114 /* JVM_StopThread */
2116 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2118 log_println("JVM_StopThread: Deprecated. Not implemented.");
2122 /* JVM_IsThreadAlive */
2124 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2130 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2132 h = (java_handle_t *) jthread;
2133 t = thread_get_thread(h);
2135 /* The threadobject is null when a thread is created in Java. */
2140 result = threads_thread_is_alive(t);
2146 /* JVM_SuspendThread */
2148 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2153 TRACEJVMCALLS(("JVM_SuspendThread(env=%p, jthread=%p)", env, jthread));
2155 if (opt_PrintWarnings)
2156 log_println("JVM_SuspendThread: Deprecated, do not use!");
2158 h = (java_handle_t *) jthread;
2159 t = thread_get_thread(h);
2161 /* The threadobject is null when a thread is created in Java. */
2166 threads_suspend_thread(t, SUSPEND_REASON_JAVA);
2170 /* JVM_ResumeThread */
2172 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2177 TRACEJVMCALLS(("JVM_ResumeThread(env=%p, jthread=%p)", env, jthread));
2179 if (opt_PrintWarnings)
2180 log_println("JVM_ResumeThread: Deprecated, do not use!");
2182 h = (java_handle_t *) jthread;
2183 t = thread_get_thread(h);
2185 /* The threadobject is null when a thread is created in Java. */
2190 threads_resume_thread(t, SUSPEND_REASON_JAVA);
2194 /* JVM_SetThreadPriority */
2196 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2201 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2203 h = (java_handle_t *) jthread;
2204 t = thread_get_thread(h);
2206 /* The threadobject is null when a thread is created in Java. The
2207 priority is set later during startup. */
2212 threads_set_thread_priority(t->tid, prio);
2218 void JVM_Yield(JNIEnv *env, jclass threadClass)
2220 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2228 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2230 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2232 threads_sleep(millis, 0);
2236 /* JVM_CurrentThread */
2238 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2242 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2244 o = thread_get_current_object();
2250 /* JVM_CountStackFrames */
2252 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2254 log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2262 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2267 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2269 h = (java_handle_t *) jthread;
2270 t = thread_get_thread(h);
2272 /* The threadobject is null when a thread is created in Java. */
2277 threads_thread_interrupt(t);
2281 /* JVM_IsInterrupted */
2283 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2287 jboolean interrupted;
2289 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2291 h = (java_handle_t *) jthread;
2292 t = thread_get_thread(h);
2294 /* The threadobject is null when a thread is created in Java. */
2299 interrupted = thread_is_interrupted(t);
2301 if (interrupted && clear_interrupted)
2302 thread_set_interrupted(t, false);
2310 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2315 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2317 h = (java_handle_t *) obj;
2320 exceptions_throw_nullpointerexception();
2324 result = lock_is_held_by_current_thread(h);
2330 /* JVM_DumpAllStacks */
2332 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2334 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2338 /* JVM_CurrentLoadedClass */
2340 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2342 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2348 /* JVM_CurrentClassLoader */
2350 jobject JVM_CurrentClassLoader(JNIEnv *env)
2352 TRACEJVMCALLS(("JVM_CurrentClassLoader(env=%p)", env));
2353 PRINTJVMWARNINGS(("JVM_CurrentClassLoader is deprecated, do not use it."));
2355 return stacktrace_first_nonsystem_classloader();
2359 /* JVM_GetClassContext */
2361 jobjectArray JVM_GetClassContext(JNIEnv *env)
2363 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2365 return stacktrace_getClassContext();
2369 /* JVM_ClassDepth */
2371 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2373 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2379 /* JVM_ClassLoaderDepth */
2381 jint JVM_ClassLoaderDepth(JNIEnv *env)
2383 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2389 /* JVM_GetSystemPackage */
2391 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2397 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2399 /* s = Package::find(name); */
2400 u = javastring_toutf((java_handle_t *) name, false);
2402 result = Package::find(u);
2405 s = javastring_new(result);
2413 /* JVM_GetSystemPackages */
2415 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2417 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2423 /* JVM_AllocateNewObject */
2425 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2427 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2433 /* JVM_AllocateNewArray */
2435 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2437 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2443 /* JVM_LatestUserDefinedLoader */
2445 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2447 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2449 return stacktrace_first_nonnull_classloader();
2453 /* JVM_LoadClass0 */
2455 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2457 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2463 /* JVM_GetArrayLength */
2465 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2467 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2470 exceptions_throw_nullpointerexception();
2476 // Check for exception in constructor.
2481 return a.get_length();
2485 /* JVM_GetArrayElement */
2487 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2489 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2493 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2494 /* exceptions_throw_illegalargumentexception(); */
2498 return a.get_boxed_element(index);
2502 /* JVM_GetPrimitiveArrayElement */
2504 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2508 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2516 /* JVM_SetArrayElement */
2518 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2520 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2524 a.set_boxed_element(index, val);
2528 /* JVM_SetPrimitiveArrayElement */
2530 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2532 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2538 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2540 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2542 if (eltClass == NULL) {
2543 exceptions_throw_nullpointerexception();
2547 /* NegativeArraySizeException is checked by array constructor. */
2549 classinfo* c = LLNI_classinfo_unwrap(eltClass);
2551 /* Create primitive or object array. */
2553 if (class_is_primitive(c)) {
2554 classinfo* pc = Primitive::get_arrayclass_by_name(c->name);
2556 /* void arrays are not allowed. */
2559 exceptions_throw_illegalargumentexception();
2563 Array a(length, pc);
2565 return (jobject) a.get_handle();
2568 ObjectArray oa(length, c);
2570 return (jobject) oa.get_handle();
2575 /* JVM_NewMultiArray */
2577 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2585 java_handle_objectarray_t *a;
2587 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2589 if (eltClass == NULL) {
2590 exceptions_throw_nullpointerexception();
2594 /* NegativeArraySizeException is checked in builtin_newarray. */
2596 c = LLNI_classinfo_unwrap(eltClass);
2600 /* We check here for exceptions thrown in array_length_get,
2601 otherwise these exceptions get overwritten by the following
2602 IllegalArgumentException. */
2607 length = ia.get_length();
2609 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2610 exceptions_throw_illegalargumentexception();
2614 /* XXX This is just a quick hack to get it working. */
2616 dims = MNEW(long, length);
2618 for (i = 0; i < length; i++) {
2619 value = ia.get_element(i);
2620 dims[i] = (long) value;
2623 /* Create an array-class if necessary. */
2625 if (class_is_primitive(c)) {
2626 ac = Primitive::get_arrayclass_by_name(c->name);
2628 // Arrays of void are not allowed.
2630 exceptions_throw_illegalargumentexception();
2635 ac = class_multiarray_of((length - 1), ac, true);
2638 ac = class_multiarray_of(length, c, true);
2643 /* Allocate a new array on the heap. */
2645 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2651 /* JVM_InitializeSocketLibrary */
2653 jint JVM_InitializeSocketLibrary()
2655 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2657 HPI& hpi = VM::get_current()->get_hpi();
2658 return hpi.initialize_socket_library();
2664 jint JVM_Socket(jint domain, jint type, jint protocol)
2666 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2668 return os::socket(domain, type, protocol);
2672 /* JVM_SocketClose */
2674 jint JVM_SocketClose(jint fd)
2676 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2678 return os::close(fd);
2682 /* JVM_SocketShutdown */
2684 jint JVM_SocketShutdown(jint fd, jint howto)
2686 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2688 return os::shutdown(fd, howto);
2694 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2696 log_println("JVM_Recv: IMPLEMENT ME!");
2704 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2706 TRACEJVMCALLSENTER(("JVM_Send(fd=%d, buf=%p, nBytes=%d, flags=%d", fd, buf, nBytes, flags));
2708 int result = os::send(fd, buf, nBytes, flags);
2710 TRACEJVMCALLSEXIT(("->%d", result));
2718 jint JVM_Timeout(int fd, long timeout)
2720 log_println("JVM_Timeout: IMPLEMENT ME!");
2728 jint JVM_Listen(jint fd, jint count)
2730 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2732 return os::listen(fd, count);
2738 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2740 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2742 return os::connect(fd, him, len);
2748 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2750 log_println("JVM_Bind: IMPLEMENT ME!");
2758 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2760 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2762 return os::accept(fd, him, (socklen_t *) len);
2768 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2770 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2776 /* JVM_GetSockName */
2778 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2780 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2782 return os::getsockname(fd, him, (socklen_t *) len);
2788 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2790 log_println("JVM_SendTo: IMPLEMENT ME!");
2796 /* JVM_SocketAvailable */
2798 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2800 #if defined(FIONREAD)
2804 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2808 result = ioctl(fd, FIONREAD, &bytes);
2817 # error FIONREAD not defined
2822 /* JVM_GetSockOpt */
2824 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2826 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2828 return os::getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2832 /* JVM_SetSockOpt */
2834 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2836 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2838 return os::setsockopt(fd, level, optname, optval, optlen);
2842 /* JVM_GetHostName */
2844 int JVM_GetHostName(char *name, int namelen)
2848 TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2850 result = os::gethostname(name, namelen);
2852 TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
2858 /* JVM_GetHostByAddr */
2860 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2862 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2868 /* JVM_GetHostByName */
2870 struct hostent *JVM_GetHostByName(char* name)
2872 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2878 /* JVM_GetProtoByName */
2880 struct protoent *JVM_GetProtoByName(char* name)
2882 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2888 /* JVM_LoadLibrary */
2890 void* JVM_LoadLibrary(const char* name)
2892 TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
2894 utf* u = utf_new_char(name);
2896 NativeLibrary nl(u);
2897 void* handle = nl.open();
2899 TRACEJVMCALLSEXIT(("->%p", handle));
2905 /* JVM_UnloadLibrary */
2907 void JVM_UnloadLibrary(void* handle)
2909 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2911 NativeLibrary nl(handle);
2916 /* JVM_FindLibraryEntry */
2918 void *JVM_FindLibraryEntry(void* handle, const char* name)
2922 TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
2924 HPI& hpi = VM::get_current()->get_hpi();
2925 symbol = hpi.get_library().FindLibraryEntry(handle, name);
2927 TRACEJVMCALLSEXIT(("->%p", symbol));
2935 jboolean JVM_IsNaN(jdouble d)
2939 TRACEJVMCALLSENTER(("JVM_IsNaN(d=%f)", d));
2943 TRACEJVMCALLSEXIT(("->%d", result));
2949 /* JVM_IsSupportedJNIVersion */
2951 jboolean JVM_IsSupportedJNIVersion(jint version)
2953 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
2955 return jni_version_check(version);
2959 /* JVM_InternString */
2961 jstring JVM_InternString(JNIEnv *env, jstring str)
2963 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
2965 return (jstring) javastring_intern((java_handle_t *) str);
2969 /* JVM_RawMonitorCreate */
2971 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2973 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
2975 Mutex* m = new Mutex();
2981 /* JVM_RawMonitorDestroy */
2983 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void* mon)
2985 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
2987 delete ((Mutex*) mon);
2991 /* JVM_RawMonitorEnter */
2993 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void* mon)
2995 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
2997 ((Mutex*) mon)->lock();
3003 /* JVM_RawMonitorExit */
3005 JNIEXPORT void JNICALL JVM_RawMonitorExit(void* mon)
3007 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3009 ((Mutex*) mon)->unlock();
3013 /* JVM_SetPrimitiveFieldValues */
3015 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3017 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3021 /* JVM_GetPrimitiveFieldValues */
3023 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3025 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3029 /* JVM_AccessVMBooleanFlag */
3031 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3033 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3039 /* JVM_AccessVMIntFlag */
3041 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3043 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3049 /* JVM_VMBreakPoint */
3051 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3053 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3057 /* JVM_GetClassFields */
3059 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3061 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3067 /* JVM_GetClassMethods */
3069 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3071 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3077 /* JVM_GetClassConstructors */
3079 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3081 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3087 /* JVM_GetClassField */
3089 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3091 log_println("JVM_GetClassField: IMPLEMENT ME!");
3097 /* JVM_GetClassMethod */
3099 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3101 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3107 /* JVM_GetClassConstructor */
3109 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3111 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3117 /* JVM_NewInstance */
3119 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3121 log_println("JVM_NewInstance: IMPLEMENT ME!");
3129 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3131 log_println("JVM_GetField: IMPLEMENT ME!");
3137 /* JVM_GetPrimitiveField */
3139 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3143 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3153 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3155 log_println("JVM_SetField: IMPLEMENT ME!");
3159 /* JVM_SetPrimitiveField */
3161 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3163 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3167 /* JVM_InvokeMethod */
3169 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3171 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3173 java_lang_reflect_Method jlrm(method);
3175 java_handle_t* result = jlrm.invoke((java_handle_t*) obj, (java_handle_objectarray_t*) args0);
3177 return (jobject) result;
3181 /* JVM_NewInstanceFromConstructor */
3183 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3185 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3187 java_lang_reflect_Constructor jlrc(con);
3188 java_handle_t* o = jlrc.new_instance((java_handle_objectarray_t*) args0);
3194 /* JVM_SupportsCX8 */
3196 jboolean JVM_SupportsCX8()
3198 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3208 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3210 log_println("JVM_CX8Field: IMPLEMENT ME!");
3216 /* JVM_GetAllThreads */
3218 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3220 // Get a list of all active threads.
3221 List<threadobject*> active_threads;
3222 ThreadList::get_active_java_threads(active_threads);
3224 // Allocate array to hold the java.lang.Thread objects.
3225 int32_t length = active_threads.size();
3226 ObjectArray oa(length, class_java_lang_Thread);
3231 // Iterate over all threads (which were active just a second ago).
3233 for (List<threadobject*>::iterator it = active_threads.begin(); it != active_threads.end(); it++) {
3234 threadobject* t = *it;
3236 java_handle_t* h = thread_get_object(t);
3239 oa.set_element(index, h);
3244 return oa.get_handle();
3248 /* JVM_DumpThreads */
3250 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3254 TRACEJVMCALLS(("JVM_DumpThreads((env=%p, threadClass=%p, threads=%p)", env, threadClass, threads));
3256 if (threads == NULL) {
3257 exceptions_throw_nullpointerexception();
3261 ObjectArray oa(threads);
3263 // Get length of the threads array.
3264 int32_t length = oa.get_length();
3267 exceptions_throw_illegalargumentexception();
3271 // Allocate array to hold stacktraces.
3272 classinfo* arrayclass = class_array_of(class_java_lang_StackTraceElement, true);
3273 ObjectArray oaresult(length, arrayclass);
3275 if (oaresult.is_null()) {
3279 // Iterate over all passed thread objects.
3280 for (i = 0; i < length; i++) {
3281 java_handle_t* thread = oa.get_element(i);
3283 // Get thread for the given thread object.
3284 threadobject* t = thread_get_thread(thread);
3286 // The threadobject is null when a thread is created in Java.
3290 // Get stacktrace for given thread.
3291 stacktrace_t* st = stacktrace_get_of_thread(t);
3293 // Convert stacktrace into array of StackTraceElements.
3294 java_handle_objectarray_t* oaste = stacktrace_get_StackTraceElements(st);
3299 oaresult.set_element(i, oaste);
3302 return oaresult.get_handle();
3306 /* JVM_GetManagement */
3308 void *JVM_GetManagement(jint version)
3310 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3312 return Management::get_jmm_interface(version);
3316 /* JVM_InitAgentProperties */
3318 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3320 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3326 /* JVM_GetEnclosingMethodInfo */
3328 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3330 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3332 classinfo* c = LLNI_classinfo_unwrap(ofClass);
3334 if ((c == NULL) || class_is_primitive(c))
3337 methodinfo* m = class_get_enclosingmethod_raw(c);
3342 ObjectArray oa(3, class_java_lang_Object);
3347 oa.set_element(0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
3348 oa.set_element(1, javastring_new(m->name));
3349 oa.set_element(2, javastring_new(m->descriptor));
3351 return oa.get_handle();
3355 /* JVM_GetThreadStateValues */
3357 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3359 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3360 env, javaThreadState));
3362 /* If new thread states are added in future JDK and VM versions,
3363 this should check if the JDK version is compatible with thread
3364 states supported by the VM. Return NULL if not compatible.
3366 This function must map the VM java_lang_Thread::ThreadStatus
3367 to the Java thread state that the JDK supports. */
3369 switch (javaThreadState) {
3370 case THREAD_STATE_NEW:
3377 ia.set_element(0, THREAD_STATE_NEW);
3378 return ia.get_handle();
3381 case THREAD_STATE_RUNNABLE:
3388 ia.set_element(0, THREAD_STATE_RUNNABLE);
3389 return ia.get_handle();
3392 case THREAD_STATE_BLOCKED:
3399 ia.set_element(0, THREAD_STATE_BLOCKED);
3400 return ia.get_handle();
3403 case THREAD_STATE_WAITING:
3410 ia.set_element(0, THREAD_STATE_WAITING);
3411 ia.set_element(1, THREAD_STATE_PARKED);
3412 return ia.get_handle();
3415 case THREAD_STATE_TIMED_WAITING:
3422 /* XXX Not sure about that one. */
3423 /* ia.set_element(0, SLEEPING); */
3424 ia.set_element(0, THREAD_STATE_TIMED_WAITING);
3425 ia.set_element(1, THREAD_STATE_TIMED_PARKED);
3426 return ia.get_handle();
3429 case THREAD_STATE_TERMINATED:
3436 ia.set_element(0, THREAD_STATE_TERMINATED);
3437 return ia.get_handle();
3441 /* Unknown state - probably incompatible JDK version */
3447 /* JVM_GetThreadStateNames */
3449 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3453 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3454 env, javaThreadState, values));
3456 IntArray ia(values);
3458 /* If new thread states are added in future JDK and VM versions,
3459 this should check if the JDK version is compatible with thread
3460 states supported by the VM. Return NULL if not compatible.
3462 This function must map the VM java_lang_Thread::ThreadStatus
3463 to the Java thread state that the JDK supports. */
3465 if (values == NULL) {
3466 exceptions_throw_nullpointerexception();
3470 switch (javaThreadState) {
3471 case THREAD_STATE_NEW:
3473 assert(ia.get_length() == 1 && ia.get_element(0) == THREAD_STATE_NEW);
3475 ObjectArray oa(1, class_java_lang_String);
3480 s = javastring_new(utf_new_char("NEW"));
3485 oa.set_element(0, s);
3486 return oa.get_handle();
3489 case THREAD_STATE_RUNNABLE:
3491 ObjectArray oa(1, class_java_lang_String);
3496 s = javastring_new(utf_new_char("RUNNABLE"));
3501 oa.set_element(0, s);
3502 return oa.get_handle();
3505 case THREAD_STATE_BLOCKED:
3507 ObjectArray oa(1, class_java_lang_String);
3512 s = javastring_new(utf_new_char("BLOCKED"));
3517 oa.set_element(0, s);
3518 return oa.get_handle();
3521 case THREAD_STATE_WAITING:
3523 ObjectArray oa(2, class_java_lang_String);
3528 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3533 oa.set_element(0, s);
3535 s = javastring_new(utf_new_char("WAITING.PARKED"));
3540 oa.set_element(1, s);
3541 return oa.get_handle();
3544 case THREAD_STATE_TIMED_WAITING:
3546 ObjectArray oa(2, class_java_lang_String);
3551 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3552 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3557 oa.set_element(0, s);
3559 s = javastring_new(utf_new_char("TIMED_WAITING.PARKED"));
3564 oa.set_element(1, s);
3565 return oa.get_handle();
3568 case THREAD_STATE_TERMINATED:
3570 ObjectArray oa(1, class_java_lang_String);
3575 s = javastring_new(utf_new_char("TERMINATED"));
3580 oa.set_element(0, s);
3581 return oa.get_handle();
3585 /* Unknown state - probably incompatible JDK version */
3591 /* JVM_GetVersionInfo */
3593 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3595 TRACEJVMCALLS(("JVM_GetVersionInfo(env=%p, info=%p, info_size=%zd)", env, info, info_size));
3597 memset(info, 0, info_size);
3599 info->jvm_version = ((VERSION_MAJOR & 0xff) << 24) | ((VERSION_MINOR & 0xff) << 16) | (VERSION_MICRO & 0xff);
3600 info->update_version = 0;
3601 info->special_update_version = 0;
3602 info->is_attach_supported = 0;
3603 info->is_kernel_jvm = 0;
3607 /* OS: JVM_RegisterSignal */
3609 void *JVM_RegisterSignal(jint sig, void *handler)
3611 functionptr newHandler;
3613 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3615 if (handler == (void *) 2)
3616 newHandler = (functionptr) signal_thread_handler;
3618 newHandler = (functionptr) (uintptr_t) handler;
3625 /* These signals are already used by the VM. */
3629 /* This signal is used by the VM to dump thread stacks unless
3630 ReduceSignalUsage is set, in which case the user is allowed
3631 to set his own _native_ handler for this signal; thus, in
3632 either case, we do not allow JVM_RegisterSignal to change
3642 signal_register_signal(sig, newHandler, SA_RESTART | SA_SIGINFO);
3644 /* XXX Should return old handler. */
3650 /* OS: JVM_RaiseSignal */
3652 jboolean JVM_RaiseSignal(jint sig)
3654 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3660 /* OS: JVM_FindSignal */
3662 jint JVM_FindSignal(const char *name)
3664 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3666 #if defined(__LINUX__)
3667 if (strcmp(name, "HUP") == 0)
3670 if (strcmp(name, "INT") == 0)
3673 if (strcmp(name, "TERM") == 0)
3675 #elif defined(__SOLARIS__)
3678 if (os::str2sig(name, &signum) == -1)
3683 # error Not implemented for this OS.
3693 * These are local overrides for various environment variables in Emacs.
3694 * Please do not remove this and leave it at the end of the file, where
3695 * Emacs will automagically detect them.
3696 * ---------------------------------------------------------------------
3699 * indent-tabs-mode: t
3703 * vim:noexpandtab:sw=4:ts=4: