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>
46 #include "mm/memory.h"
48 #include "native/jni.h"
49 #include "native/llni.h"
50 #include "native/native.h"
52 #include "native/vm/reflection.hpp"
54 #include "native/vm/openjdk/hpi.h"
56 #include "threads/lock-common.h"
57 #include "threads/thread.hpp"
59 #include "toolbox/logging.h"
60 #include "toolbox/list.h"
64 #if defined(ENABLE_ASSERTION)
65 #include "vm/assertion.h"
68 #include "vm/builtin.h"
69 #include "vm/exceptions.hpp"
70 #include "vm/global.h"
71 #include "vm/initialize.h"
72 #include "vm/package.hpp"
73 #include "vm/primitive.hpp"
74 #include "vm/properties.h"
75 #include "vm/resolve.h"
76 #include "vm/signallocal.h"
77 #include "vm/string.hpp"
80 #include "vm/jit/stacktrace.hpp"
82 #include "vmcore/classcache.h"
83 #include "vmcore/globals.hpp"
84 #include "vmcore/javaobjects.hpp"
85 #include "vmcore/options.h"
86 #include "vmcore/os.hpp"
89 /* debugging macros ***********************************************************/
93 # define TRACEJVMCALLS(x) \
95 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
100 # define TRACEJVMCALLSENTER(x) \
102 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
108 # define TRACEJVMCALLSEXIT(x) \
110 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
116 # define TRACEJVMCALLSVERBOSE(x) \
118 if (opt_TraceJVMCallsVerbose) { \
123 # define PRINTJVMWARNINGS(x)
125 /* if (opt_PrintJVMWarnings) { \ */
126 /* log_println x; \ */
132 # define TRACEJVMCALLS(x)
133 # define TRACEJVMCALLSENTER(x)
134 # define TRACEJVMCALLSEXIT(x)
135 # define TRACEJVMCALLSVERBOSE(x)
136 # define PRINTJVMWARNINGS(x)
142 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
143 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
144 /* and build number (xx) */
145 unsigned int update_version : 8; /* Update release version (uu) */
146 unsigned int special_update_version : 8; /* Special update release version (c) */
147 unsigned int reserved1 : 16;
148 unsigned int reserved2;
150 /* The following bits represents JVM supports that JDK has dependency on.
151 * JDK can use these bits to determine which JVM version
152 * and support it has to maintain runtime compatibility.
154 * When a new bit is added in a minor or update release, make sure
155 * the new bit is also added in the main/baseline.
157 unsigned int is_attachable : 1;
165 * A structure used to a capture exception table entry in a Java method.
172 } JVM_ExceptionTableEntryType;
175 // Interface functions are exported as C functions.
178 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
180 if ((intptr_t) count <= 0)
183 return vsnprintf(str, count, fmt, args);
187 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
193 len = jio_vsnprintf(str, count, fmt, ap);
200 int jio_fprintf(FILE* f, const char *fmt, ...)
202 log_println("jio_fprintf: IMPLEMENT ME!");
208 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
210 log_println("jio_vfprintf: IMPLEMENT ME!");
216 int jio_printf(const char *fmt, ...)
218 log_println("jio_printf: IMPLEMENT ME!");
224 /* JVM_GetInterfaceVersion */
226 jint JVM_GetInterfaceVersion()
228 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
230 #define JVM_INTERFACE_VERSION 4
232 return JVM_INTERFACE_VERSION;
236 /* JVM_CurrentTimeMillis */
238 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
240 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
242 return (jlong) builtin_currenttimemillis();
248 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
250 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
252 return (jlong) builtin_nanotime();
258 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
263 s = (java_handle_t *) src;
264 d = (java_handle_t *) dst;
266 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));
268 builtin_arraycopy(s, src_pos, d, dst_pos, length);
272 /* JVM_InitProperties */
274 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
279 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
281 h = (java_handle_t *) properties;
283 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
284 sun.nio.MaxDirectMemorySize property. Do this after setting
285 user properties to prevent people from setting the value with a
286 -D option, as requested. */
288 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
289 properties_add("sun.nio.MaxDirectMemorySize", buf);
291 /* Add all properties. */
293 properties_system_add_all(h);
301 void JVM_Exit(jint code)
303 log_println("JVM_Exit: IMPLEMENT ME!");
309 void JVM_Halt(jint code)
311 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
318 /* JVM_OnExit(void (*func)) */
320 void JVM_OnExit(void (*func)(void))
322 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
330 TRACEJVMCALLS(("JVM_GC()"));
336 /* JVM_MaxObjectInspectionAge */
338 jlong JVM_MaxObjectInspectionAge(void)
340 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
346 /* JVM_TraceInstructions */
348 void JVM_TraceInstructions(jboolean on)
350 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
354 /* JVM_TraceMethodCalls */
356 void JVM_TraceMethodCalls(jboolean on)
358 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
362 /* JVM_TotalMemory */
364 jlong JVM_TotalMemory(void)
366 TRACEJVMCALLS(("JVM_TotalMemory()"));
368 return gc_get_heap_size();
374 jlong JVM_FreeMemory(void)
376 TRACEJVMCALLS(("JVM_FreeMemory()"));
378 return gc_get_free_bytes();
384 jlong JVM_MaxMemory(void)
386 TRACEJVMCALLS(("JVM_MaxMemory()"));
388 return gc_get_max_heap_size();
392 /* JVM_ActiveProcessorCount */
394 jint JVM_ActiveProcessorCount(void)
396 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
398 return os::processors_online();
402 /* JVM_FillInStackTrace */
404 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
406 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
408 java_handle_bytearray_t* ba = stacktrace_get_current();
413 java_lang_Throwable jlt(receiver, ba);
417 /* JVM_PrintStackTrace */
419 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
421 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
425 /* JVM_GetStackTraceDepth */
427 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
429 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
431 java_lang_Throwable jlt(throwable);
434 exceptions_throw_nullpointerexception();
438 java_handle_bytearray_t* ba = jlt.get_backtrace();
443 // We need a critical section here as the stacktrace structure is
444 // mapped onto a Java byte-array.
448 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
450 int32_t depth = st->length;
458 /* JVM_GetStackTraceElement */
460 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
462 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
464 java_lang_Throwable jlt(throwable);
465 java_handle_bytearray_t* ba = jlt.get_backtrace();
467 // We need a critical section here as the stacktrace structure is
468 // mapped onto a Java byte-array.
471 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
473 if ((index < 0) || (index >= st->length)) {
474 /* XXX This should be an IndexOutOfBoundsException (check this
476 exceptions_throw_arrayindexoutofboundsexception();
480 // Get the stacktrace entry.
481 stacktrace_entry_t* ste = &(st->entries[index]);
483 // Get the codeinfo, methodinfo and classinfo.
484 codeinfo* code = ste->code;
485 methodinfo* m = code->m;
486 classinfo* c = m->clazz;
489 java_handle_t* filename;
491 if (!(m->flags & ACC_NATIVE)) {
492 if (c->sourcefile != NULL)
493 filename = javastring_new(c->sourcefile);
503 if (m->flags & ACC_NATIVE) {
507 /* FIXME The linenumbertable_linenumber_for_pc could change
508 the methodinfo pointer when hitting an inlined method. */
510 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
511 linenumber = (linenumber == 0) ? -1 : linenumber;
516 // Get declaring class name.
517 java_handle_t* declaringclass = class_get_classname(c);
519 // Allocate a new StackTraceElement object.
520 java_lang_StackTraceElement jlste(declaringclass, javastring_new(m->name), filename, linenumber);
525 return (jobject) jlste.get_handle();
531 jint JVM_IHashCode(JNIEnv* env, jobject handle)
533 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
535 return (jint) ((ptrint) handle);
539 /* JVM_MonitorWait */
541 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
543 #if defined(ENABLE_THREADS)
547 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
549 /* exceptions_throw_illegalargumentexception("argument out of range"); */
550 exceptions_throw_illegalargumentexception();
554 #if defined(ENABLE_THREADS)
555 o = (java_handle_t *) handle;
557 lock_wait_for_object(o, ms, 0);
562 /* JVM_MonitorNotify */
564 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
566 #if defined(ENABLE_THREADS)
570 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
572 #if defined(ENABLE_THREADS)
573 o = (java_handle_t *) handle;
575 lock_notify_object(o);
580 /* JVM_MonitorNotifyAll */
582 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
584 #if defined(ENABLE_THREADS)
588 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
590 #if defined(ENABLE_THREADS)
591 o = (java_handle_t *) handle;
593 lock_notify_all_object(o);
600 jobject JVM_Clone(JNIEnv* env, jobject handle)
602 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
604 return (jobject) builtin_clone(env, (java_handle_t *) handle);
608 /* JVM_InitializeCompiler */
610 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
612 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
616 /* JVM_IsSilentCompiler */
618 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
620 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
626 /* JVM_CompileClass */
628 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
630 log_println("JVM_CompileClass: IMPLEMENT ME!");
636 /* JVM_CompileClasses */
638 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
640 log_println("JVM_CompileClasses: IMPLEMENT ME!");
646 /* JVM_CompilerCommand */
648 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
650 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
656 /* JVM_EnableCompiler */
658 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
660 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
661 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
665 /* JVM_DisableCompiler */
667 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
669 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
670 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
674 /* JVM_GetLastErrorString */
676 jint JVM_GetLastErrorString(char *buf, int len)
678 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
680 return hpi_system->GetLastErrorString(buf, len);
686 char *JVM_NativePath(char *path)
688 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
690 return hpi_file->NativePath(path);
694 /* JVM_GetCallerClass */
696 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
700 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
702 c = stacktrace_get_caller_class(depth);
708 /* JVM_FindPrimitiveClass */
710 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
715 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
718 c = Primitive::get_class_by_name(u);
720 return (jclass) LLNI_classinfo_wrap(c);
724 /* JVM_ResolveClass */
726 void JVM_ResolveClass(JNIEnv* env, jclass cls)
728 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
729 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
733 /* JVM_FindClassFromClassLoader */
735 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
741 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
743 /* As of now, OpenJDK does not call this function with throwError
746 assert(throwError == false);
748 u = utf_new_char(name);
749 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
751 c = load_class_from_classloader(u, cl);
757 if (!(c->state & CLASS_INITIALIZED))
758 if (!initialize_class(c))
761 return (jclass) LLNI_classinfo_wrap(c);
765 /* JVM_FindClassFromClass */
767 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
769 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
775 /* JVM_DefineClass */
777 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
779 log_println("JVM_DefineClass: IMPLEMENT ME!");
785 /* JVM_DefineClassWithSource */
787 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
793 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
796 u = utf_new_char(name);
800 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
802 /* XXX do something with source */
804 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
806 return (jclass) LLNI_classinfo_wrap(c);
810 /* JVM_FindLoadedClass */
812 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
818 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
820 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
822 u = javastring_toutf((java_handle_t *) name, true);
823 c = classcache_lookup(cl, u);
825 return (jclass) LLNI_classinfo_wrap(c);
829 /* JVM_GetClassName */
831 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
835 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
837 c = LLNI_classinfo_unwrap(cls);
839 return (jstring) class_get_classname(c);
843 /* JVM_GetClassInterfaces */
845 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
848 java_handle_objectarray_t *oa;
850 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
852 c = LLNI_classinfo_unwrap(cls);
854 oa = class_get_interfaces(c);
856 return (jobjectArray) oa;
860 /* JVM_GetClassLoader */
862 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
867 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
869 c = LLNI_classinfo_unwrap(cls);
870 cl = class_get_classloader(c);
872 TRACEJVMCALLSEXIT(("->%p", cl));
878 /* JVM_IsInterface */
880 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
884 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
886 c = LLNI_classinfo_unwrap(cls);
888 return class_is_interface(c);
892 /* JVM_GetClassSigners */
894 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
896 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
902 /* JVM_SetClassSigners */
904 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
907 java_handle_objectarray_t *hoa;
909 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
911 c = LLNI_classinfo_unwrap(cls);
913 hoa = (java_handle_objectarray_t *) signers;
915 /* This call is ignored for primitive types and arrays. Signers
916 are only set once, ClassLoader.java, and thus shouldn't be
917 called with an array. Only the bootstrap loader creates
920 if (class_is_primitive(c) || class_is_array(c))
923 LLNI_classinfo_field_set(c, signers, hoa);
927 /* JVM_GetProtectionDomain */
929 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
933 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
935 c = LLNI_classinfo_unwrap(cls);
938 exceptions_throw_nullpointerexception();
942 /* Primitive types do not have a protection domain. */
944 if (class_is_primitive(c))
947 return (jobject) c->protectiondomain;
951 /* JVM_SetProtectionDomain */
953 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
955 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
959 /* JVM_DoPrivileged */
961 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
966 java_handle_t *result;
969 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
971 h = (java_handle_t *) action;
972 LLNI_class_get(h, c);
974 if (action == NULL) {
975 exceptions_throw_nullpointerexception();
979 /* lookup run() method (throw no exceptions) */
981 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
984 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
985 exceptions_throw_internalerror("No run method");
989 /* XXX It seems something with a privileged stack needs to be done
992 result = vm_call_method(m, h);
994 e = exceptions_get_exception();
997 if ( builtin_instanceof(e, class_java_lang_Exception) &&
998 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
999 exceptions_clear_exception();
1000 exceptions_throw_privilegedactionexception(e);
1006 return (jobject) result;
1010 /* JVM_GetInheritedAccessControlContext */
1012 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1014 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1020 /* JVM_GetStackAccessControlContext */
1022 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1024 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
1026 /* XXX All stuff I tested so far works without that function. At
1027 some point we have to implement it, but I disable the output
1028 for now to make IcedTea happy. */
1034 /* JVM_IsArrayClass */
1036 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1040 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1042 c = LLNI_classinfo_unwrap(cls);
1044 return class_is_array(c);
1048 /* JVM_IsPrimitiveClass */
1050 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1054 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1056 c = LLNI_classinfo_unwrap(cls);
1058 return class_is_primitive(c);
1062 /* JVM_GetComponentType */
1064 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1066 classinfo *component;
1069 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1071 c = LLNI_classinfo_unwrap(cls);
1073 component = class_get_componenttype(c);
1075 return (jclass) LLNI_classinfo_wrap(component);
1079 /* JVM_GetClassModifiers */
1081 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1086 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1088 c = LLNI_classinfo_unwrap(cls);
1090 flags = class_get_modifiers(c, false);
1096 /* JVM_GetDeclaredClasses */
1098 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1101 java_handle_objectarray_t *oa;
1103 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1105 c = LLNI_classinfo_unwrap(ofClass);
1107 oa = class_get_declaredclasses(c, false);
1109 return (jobjectArray) oa;
1113 /* JVM_GetDeclaringClass */
1115 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1120 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1122 c = LLNI_classinfo_unwrap(ofClass);
1124 dc = class_get_declaringclass(c);
1126 return (jclass) LLNI_classinfo_wrap(dc);
1130 /* JVM_GetClassSignature */
1132 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1138 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1140 c = LLNI_classinfo_unwrap(cls);
1142 /* Get the signature of the class. */
1144 u = class_get_signature(c);
1149 /* Convert UTF-string to a Java-string. */
1151 s = javastring_new(u);
1157 /* JVM_GetClassAnnotations */
1159 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1161 TRACEJVMCALLS(("JVM_GetClassAnnotations(env=%p, cls=%p)", env, cls));
1164 exceptions_throw_nullpointerexception();
1168 classinfo* c = LLNI_classinfo_unwrap(cls);
1170 /* get annotations: */
1171 java_handle_bytearray_t* annotations = class_get_annotations(c);
1173 return (jbyteArray) annotations;
1177 /* JVM_GetFieldAnnotations */
1179 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1181 TRACEJVMCALLS(("JVM_GetFieldAnnotations(env=%p, field=%p)", env, field));
1183 java_lang_reflect_Field jlrf(field);
1185 if (jlrf.is_null()) {
1186 exceptions_throw_nullpointerexception();
1190 return (jbyteArray) jlrf.get_annotations();
1194 /* JVM_GetMethodAnnotations */
1196 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1198 TRACEJVMCALLS(("JVM_GetMethodAnnotations(env=%p, method=%p)", env, method));
1200 java_lang_reflect_Method jlrm(method);
1202 if (jlrm.is_null()) {
1203 exceptions_throw_nullpointerexception();
1207 return (jbyteArray) jlrm.get_annotations();
1211 /* JVM_GetMethodDefaultAnnotationValue */
1213 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1215 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue(env=%p, method=%p)", env, method));
1217 java_lang_reflect_Method jlrm(method);
1219 if (jlrm.is_null()) {
1220 exceptions_throw_nullpointerexception();
1224 return (jbyteArray) jlrm.get_annotationDefault();
1228 /* JVM_GetMethodParameterAnnotations */
1230 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1232 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations(env=%p, method=%p)", env, method));
1234 java_lang_reflect_Method jlrm(method);
1236 if (jlrm.is_null() == NULL) {
1237 exceptions_throw_nullpointerexception();
1241 return (jbyteArray) jlrm.get_parameterAnnotations();
1245 /* JVM_GetClassDeclaredFields */
1247 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1250 java_handle_objectarray_t *oa;
1252 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1254 c = LLNI_classinfo_unwrap(ofClass);
1256 oa = class_get_declaredfields(c, publicOnly);
1258 return (jobjectArray) oa;
1262 /* JVM_GetClassDeclaredMethods */
1264 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1267 java_handle_objectarray_t *oa;
1269 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1271 c = LLNI_classinfo_unwrap(ofClass);
1273 oa = class_get_declaredmethods(c, publicOnly);
1275 return (jobjectArray) oa;
1279 /* JVM_GetClassDeclaredConstructors */
1281 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1284 java_handle_objectarray_t *oa;
1286 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1288 c = LLNI_classinfo_unwrap(ofClass);
1290 oa = class_get_declaredconstructors(c, publicOnly);
1292 return (jobjectArray) oa;
1296 /* JVM_GetClassAccessFlags */
1298 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1302 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1304 c = LLNI_classinfo_unwrap(cls);
1306 /* Primitive type classes have the correct access flags. */
1308 return c->flags & ACC_CLASS_REFLECT_MASK;
1312 /* JVM_GetClassConstantPool */
1314 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1316 #if defined(ENABLE_ANNOTATIONS)
1317 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1319 java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
1320 sun_reflect_ConstantPool cp(h, cls);
1326 return (jobject) cp.get_handle();
1328 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1334 /* JVM_ConstantPoolGetSize */
1336 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1338 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1340 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1342 c = LLNI_classinfo_unwrap(jcpool);
1348 /* JVM_ConstantPoolGetClassAt */
1350 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1352 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1353 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1354 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1356 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1358 c = LLNI_classinfo_unwrap(jcpool);
1360 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1363 exceptions_throw_illegalargumentexception();
1367 result = resolve_classref_eager(ref);
1369 return (jclass) LLNI_classinfo_wrap(result);
1373 /* JVM_ConstantPoolGetClassAtIfLoaded */
1375 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1377 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1378 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1379 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1381 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1383 c = LLNI_classinfo_unwrap(jcpool);
1385 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1388 exceptions_throw_illegalargumentexception();
1392 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1396 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1400 return (jclass) LLNI_classinfo_wrap(result);
1404 /* JVM_ConstantPoolGetMethodAt */
1406 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1408 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1409 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1411 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1413 cls = LLNI_classinfo_unwrap(jcpool);
1414 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1417 exceptions_throw_illegalargumentexception();
1421 /* XXX: is that right? or do I have to use resolve_method_*? */
1422 return (jobject)reflect_method_new(ref->p.method);
1426 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1428 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1430 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1431 classinfo *c = NULL; /* resolved declaring class of the method */
1432 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1434 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1436 cls = LLNI_classinfo_unwrap(jcpool);
1437 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1440 exceptions_throw_illegalargumentexception();
1444 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1448 if (c == NULL || !(c->state & CLASS_LOADED)) {
1452 return (jobject)reflect_method_new(ref->p.method);
1456 /* JVM_ConstantPoolGetFieldAt */
1458 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1460 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1461 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1463 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1465 cls = LLNI_classinfo_unwrap(jcpool);
1466 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1469 exceptions_throw_illegalargumentexception();
1473 return (jobject)reflect_field_new(ref->p.field);
1477 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1479 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1481 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1482 classinfo *c; /* resolved declaring class for the field */
1483 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1485 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1487 cls = LLNI_classinfo_unwrap(jcpool);
1488 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1491 exceptions_throw_illegalargumentexception();
1495 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1499 if (c == NULL || !(c->state & CLASS_LOADED)) {
1503 return (jobject)reflect_field_new(ref->p.field);
1507 /* JVM_ConstantPoolGetMemberRefInfoAt */
1509 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1511 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1513 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1519 /* JVM_ConstantPoolGetIntAt */
1521 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1523 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1524 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1526 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1528 cls = LLNI_classinfo_unwrap(jcpool);
1529 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1532 exceptions_throw_illegalargumentexception();
1540 /* JVM_ConstantPoolGetLongAt */
1542 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1544 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1545 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1547 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1549 cls = LLNI_classinfo_unwrap(jcpool);
1550 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1553 exceptions_throw_illegalargumentexception();
1561 /* JVM_ConstantPoolGetFloatAt */
1563 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1565 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1566 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1568 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1570 cls = LLNI_classinfo_unwrap(jcpool);
1571 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1574 exceptions_throw_illegalargumentexception();
1582 /* JVM_ConstantPoolGetDoubleAt */
1584 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1586 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1587 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1589 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1591 cls = LLNI_classinfo_unwrap(jcpool);
1592 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1595 exceptions_throw_illegalargumentexception();
1603 /* JVM_ConstantPoolGetStringAt */
1605 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1607 utf *ref; /* utf object for the string in constant pool at index 'index' */
1608 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1610 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1612 cls = LLNI_classinfo_unwrap(jcpool);
1613 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1616 exceptions_throw_illegalargumentexception();
1620 /* XXX: I hope literalstring_new is the right Function. */
1621 return (jstring)literalstring_new(ref);
1625 /* JVM_ConstantPoolGetUTF8At */
1627 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1629 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1630 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1632 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1634 cls = LLNI_classinfo_unwrap(jcpool);
1635 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1638 exceptions_throw_illegalargumentexception();
1642 /* XXX: I hope literalstring_new is the right Function. */
1643 return (jstring)literalstring_new(ref);
1647 /* JVM_DesiredAssertionStatus */
1649 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1651 #if defined(ENABLE_ASSERTION)
1652 assertion_name_t *item;
1657 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1659 c = LLNI_classinfo_unwrap(cls);
1661 if (c->classloader == NULL) {
1662 status = (jboolean)assertion_system_enabled;
1665 status = (jboolean)assertion_user_enabled;
1668 if (list_assertion_names != NULL) {
1669 item = (assertion_name_t *)list_first(list_assertion_names);
1670 while (item != NULL) {
1671 name = utf_new_char(item->name);
1672 if (name == c->packagename) {
1673 status = (jboolean)item->enabled;
1675 else if (name == c->name) {
1676 status = (jboolean)item->enabled;
1679 item = (assertion_name_t *)list_next(list_assertion_names, item);
1685 return (jboolean)false;
1690 /* JVM_AssertionStatusDirectives */
1692 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1695 java_lang_AssertionStatusDirectives *o;
1696 java_handle_objectarray_t *classes;
1697 java_handle_objectarray_t *packages;
1698 java_booleanarray_t *classEnabled;
1699 java_booleanarray_t *packageEnabled;
1700 #if defined(ENABLE_ASSERTION)
1701 assertion_name_t *item;
1706 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1708 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1713 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1718 #if defined(ENABLE_ASSERTION)
1719 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1721 classes = builtin_anewarray(0, class_java_lang_Object);
1723 if (classes == NULL)
1726 #if defined(ENABLE_ASSERTION)
1727 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1729 packages = builtin_anewarray(0, class_java_lang_Object);
1731 if (packages == NULL)
1734 #if defined(ENABLE_ASSERTION)
1735 classEnabled = builtin_newarray_boolean(assertion_class_count);
1737 classEnabled = builtin_newarray_boolean(0);
1739 if (classEnabled == NULL)
1742 #if defined(ENABLE_ASSERTION)
1743 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1745 packageEnabled = builtin_newarray_boolean(0);
1747 if (packageEnabled == NULL)
1750 #if defined(ENABLE_ASSERTION)
1751 /* initialize arrays */
1753 if (list_assertion_names != NULL) {
1757 item = (assertion_name_t *)list_first(list_assertion_names);
1758 while (item != NULL) {
1759 js = javastring_new_from_ascii(item->name);
1764 if (item->package == false) {
1765 classes->data[i] = js;
1766 classEnabled->data[i] = (jboolean) item->enabled;
1770 packages->data[j] = js;
1771 packageEnabled->data[j] = (jboolean) item->enabled;
1775 item = (assertion_name_t *)list_next(list_assertion_names, item);
1780 /* set instance fields */
1782 o->classes = classes;
1783 o->packages = packages;
1784 o->classEnabled = classEnabled;
1785 o->packageEnabled = packageEnabled;
1791 /* JVM_GetClassNameUTF */
1793 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1795 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1801 /* JVM_GetClassCPTypes */
1803 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1805 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1809 /* JVM_GetClassCPEntriesCount */
1811 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1813 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1819 /* JVM_GetClassFieldsCount */
1821 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1823 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1829 /* JVM_GetClassMethodsCount */
1831 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1833 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1839 /* JVM_GetMethodIxExceptionIndexes */
1841 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1843 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1847 /* JVM_GetMethodIxExceptionsCount */
1849 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1851 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1857 /* JVM_GetMethodIxByteCode */
1859 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1861 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1865 /* JVM_GetMethodIxByteCodeLength */
1867 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1869 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1875 /* JVM_GetMethodIxExceptionTableEntry */
1877 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1879 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1883 /* JVM_GetMethodIxExceptionTableLength */
1885 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1887 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1893 /* JVM_GetMethodIxModifiers */
1895 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1897 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1903 /* JVM_GetFieldIxModifiers */
1905 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1907 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1913 /* JVM_GetMethodIxLocalsCount */
1915 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1917 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1923 /* JVM_GetMethodIxArgsSize */
1925 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1927 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1933 /* JVM_GetMethodIxMaxStack */
1935 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1937 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1943 /* JVM_IsConstructorIx */
1945 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1947 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1953 /* JVM_GetMethodIxNameUTF */
1955 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1957 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1963 /* JVM_GetMethodIxSignatureUTF */
1965 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1967 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1973 /* JVM_GetCPFieldNameUTF */
1975 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1977 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1983 /* JVM_GetCPMethodNameUTF */
1985 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1987 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1993 /* JVM_GetCPMethodSignatureUTF */
1995 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1997 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
2003 /* JVM_GetCPFieldSignatureUTF */
2005 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2007 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2013 /* JVM_GetCPClassNameUTF */
2015 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2017 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2023 /* JVM_GetCPFieldClassNameUTF */
2025 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2027 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2033 /* JVM_GetCPMethodClassNameUTF */
2035 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2037 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2043 /* JVM_GetCPFieldModifiers */
2045 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2047 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2053 /* JVM_GetCPMethodModifiers */
2055 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2057 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2063 /* JVM_ReleaseUTF */
2065 void JVM_ReleaseUTF(const char *utf)
2067 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2071 /* JVM_IsSameClassPackage */
2073 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2075 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2083 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2086 * JVM I/O error codes
2088 #define JVM_EEXIST -100
2090 jint JVM_Open(const char *fname, jint flags, jint mode)
2094 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2096 result = hpi_file->Open(fname, flags, mode);
2114 jint JVM_Close(jint fd)
2116 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2118 return hpi_file->Close(fd);
2124 jint JVM_Read(jint fd, char *buf, jint nbytes)
2126 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2128 return (jint) hpi_file->Read(fd, buf, nbytes);
2134 jint JVM_Write(jint fd, char *buf, jint nbytes)
2136 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2138 return (jint) hpi_file->Write(fd, buf, nbytes);
2144 jint JVM_Available(jint fd, jlong *pbytes)
2146 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2148 return hpi_file->Available(fd, pbytes);
2154 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2156 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2158 return hpi_file->Seek(fd, (off_t) offset, whence);
2164 jint JVM_SetLength(jint fd, jlong length)
2166 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2168 return hpi_file->SetLength(fd, length);
2174 jint JVM_Sync(jint fd)
2176 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2178 return hpi_file->Sync(fd);
2182 /* JVM_StartThread */
2184 void JVM_StartThread(JNIEnv* env, jobject jthread)
2186 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2188 threads_thread_start((java_handle_t *) jthread);
2192 /* JVM_StopThread */
2194 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2196 log_println("JVM_StopThread: Deprecated. Not implemented.");
2200 /* JVM_IsThreadAlive */
2202 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2208 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2210 h = (java_handle_t *) jthread;
2211 t = thread_get_thread(h);
2213 /* The threadobject is null when a thread is created in Java. The
2214 priority is set later during startup. */
2219 result = threads_thread_is_alive(t);
2225 /* JVM_SuspendThread */
2227 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2229 log_println("JVM_SuspendThread: Deprecated. Not implemented.");
2233 /* JVM_ResumeThread */
2235 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2237 log_println("JVM_ResumeThread: Deprecated. Not implemented.");
2241 /* JVM_SetThreadPriority */
2243 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2248 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2250 h = (java_handle_t *) jthread;
2251 t = thread_get_thread(h);
2253 /* The threadobject is null when a thread is created in Java. The
2254 priority is set later during startup. */
2259 threads_set_thread_priority(t->tid, prio);
2265 void JVM_Yield(JNIEnv *env, jclass threadClass)
2267 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2275 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2277 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2279 threads_sleep(millis, 0);
2283 /* JVM_CurrentThread */
2285 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2289 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2291 o = thread_get_current_object();
2297 /* JVM_CountStackFrames */
2299 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2301 log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2309 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2314 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2316 h = (java_handle_t *) jthread;
2317 t = thread_get_thread(h);
2322 threads_thread_interrupt(t);
2326 /* JVM_IsInterrupted */
2328 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2332 jboolean interrupted;
2334 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2336 h = (java_handle_t *) jthread;
2337 t = thread_get_thread(h);
2339 interrupted = thread_is_interrupted(t);
2341 if (interrupted && clear_interrupted)
2342 thread_set_interrupted(t, false);
2350 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2355 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2357 h = (java_handle_t *) obj;
2360 exceptions_throw_nullpointerexception();
2364 result = lock_is_held_by_current_thread(h);
2370 /* JVM_DumpAllStacks */
2372 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2374 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2378 /* JVM_CurrentLoadedClass */
2380 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2382 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2388 /* JVM_CurrentClassLoader */
2390 jobject JVM_CurrentClassLoader(JNIEnv *env)
2392 /* XXX if a method in a class in a trusted loader is in a
2393 doPrivileged, return NULL */
2395 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2401 /* JVM_GetClassContext */
2403 jobjectArray JVM_GetClassContext(JNIEnv *env)
2405 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2407 return (jobjectArray) stacktrace_getClassContext();
2411 /* JVM_ClassDepth */
2413 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2415 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2421 /* JVM_ClassLoaderDepth */
2423 jint JVM_ClassLoaderDepth(JNIEnv *env)
2425 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2431 /* JVM_GetSystemPackage */
2433 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2439 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2441 /* s = Package::find(name); */
2442 u = javastring_toutf((java_handle_t *) name, false);
2444 result = Package::find(u);
2447 s = javastring_new(result);
2455 /* JVM_GetSystemPackages */
2457 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2459 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2465 /* JVM_AllocateNewObject */
2467 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2469 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2475 /* JVM_AllocateNewArray */
2477 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2479 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2485 /* JVM_LatestUserDefinedLoader */
2487 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2491 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2493 cl = stacktrace_first_nonnull_classloader();
2495 return (jobject) cl;
2499 /* JVM_LoadClass0 */
2501 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2503 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2509 /* JVM_GetArrayLength */
2511 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2515 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2517 a = (java_handle_t *) arr;
2519 return array_length_get(a);
2523 /* JVM_GetArrayElement */
2525 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2530 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2532 a = (java_handle_t *) arr;
2534 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2535 /* exceptions_throw_illegalargumentexception(); */
2539 o = array_element_get(a, index);
2545 /* JVM_GetPrimitiveArrayElement */
2547 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2551 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2559 /* JVM_SetArrayElement */
2561 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2564 java_handle_t *value;
2566 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2568 a = (java_handle_t *) arr;
2569 value = (java_handle_t *) val;
2571 array_element_set(a, index, value);
2575 /* JVM_SetPrimitiveArrayElement */
2577 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2579 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2585 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2590 java_handle_objectarray_t *oa;
2592 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2594 if (eltClass == NULL) {
2595 exceptions_throw_nullpointerexception();
2599 /* NegativeArraySizeException is checked in builtin_newarray. */
2601 c = LLNI_classinfo_unwrap(eltClass);
2603 /* Create primitive or object array. */
2605 if (class_is_primitive(c)) {
2606 pc = Primitive::get_arrayclass_by_name(c->name);
2608 /* void arrays are not allowed. */
2611 exceptions_throw_illegalargumentexception();
2615 a = builtin_newarray(length, pc);
2620 oa = builtin_anewarray(length, c);
2622 return (jobject) oa;
2627 /* JVM_NewMultiArray */
2629 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2632 java_handle_intarray_t *ia;
2638 java_handle_objectarray_t *a;
2640 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2642 if (eltClass == NULL) {
2643 exceptions_throw_nullpointerexception();
2647 /* NegativeArraySizeException is checked in builtin_newarray. */
2649 c = LLNI_classinfo_unwrap(eltClass);
2651 ia = (java_handle_intarray_t *) dim;
2653 length = array_length_get((java_handle_t *) ia);
2655 /* We check here for exceptions thrown in array_length_get,
2656 otherwise these exceptions get overwritten by the following
2657 IllegalArgumentException. */
2662 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2663 exceptions_throw_illegalargumentexception();
2667 /* XXX This is just a quick hack to get it working. */
2669 dims = MNEW(long, length);
2671 for (i = 0; i < length; i++) {
2672 value = LLNI_array_direct(ia, i);
2673 dims[i] = (long) value;
2676 /* Create an array-class if necessary. */
2678 if (class_is_primitive(c))
2679 ac = Primitive::get_arrayclass_by_name(c->name);
2681 ac = class_array_of(c, true);
2686 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2692 /* JVM_InitializeSocketLibrary */
2694 jint JVM_InitializeSocketLibrary()
2696 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2698 return hpi_initialize_socket_library();
2704 jint JVM_Socket(jint domain, jint type, jint protocol)
2706 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2708 return os::socket(domain, type, protocol);
2712 /* JVM_SocketClose */
2714 jint JVM_SocketClose(jint fd)
2716 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2718 return os::close(fd);
2722 /* JVM_SocketShutdown */
2724 jint JVM_SocketShutdown(jint fd, jint howto)
2726 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2728 return os::shutdown(fd, howto);
2734 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2736 log_println("JVM_Recv: IMPLEMENT ME!");
2744 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2746 log_println("JVM_Send: IMPLEMENT ME!");
2754 jint JVM_Timeout(int fd, long timeout)
2756 log_println("JVM_Timeout: IMPLEMENT ME!");
2764 jint JVM_Listen(jint fd, jint count)
2766 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2768 return os::listen(fd, count);
2774 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2776 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2778 return os::connect(fd, him, len);
2784 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2786 log_println("JVM_Bind: IMPLEMENT ME!");
2794 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2796 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2798 return os::accept(fd, him, (socklen_t *) len);
2804 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2806 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2812 /* JVM_GetSockName */
2814 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2816 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2818 return os::getsockname(fd, him, (socklen_t *) len);
2824 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2826 log_println("JVM_SendTo: IMPLEMENT ME!");
2832 /* JVM_SocketAvailable */
2834 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2836 #if defined(FIONREAD)
2840 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2844 result = ioctl(fd, FIONREAD, &bytes);
2853 # error FIONREAD not defined
2858 /* JVM_GetSockOpt */
2860 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2862 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2864 return os::getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2868 /* JVM_SetSockOpt */
2870 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2872 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2874 return os::setsockopt(fd, level, optname, optval, optlen);
2878 /* JVM_GetHostName */
2880 int JVM_GetHostName(char *name, int namelen)
2884 TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2886 result = os::gethostname(name, namelen);
2888 TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
2894 /* JVM_GetHostByAddr */
2896 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2898 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2904 /* JVM_GetHostByName */
2906 struct hostent *JVM_GetHostByName(char* name)
2908 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2914 /* JVM_GetProtoByName */
2916 struct protoent *JVM_GetProtoByName(char* name)
2918 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2924 /* JVM_LoadLibrary */
2926 void *JVM_LoadLibrary(const char *name)
2931 TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
2933 u = utf_new_char(name);
2935 handle = native_library_open(u);
2937 TRACEJVMCALLSEXIT(("->%p", handle));
2943 /* JVM_UnloadLibrary */
2945 void JVM_UnloadLibrary(void* handle)
2947 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2949 native_library_close(handle);
2953 /* JVM_FindLibraryEntry */
2955 void *JVM_FindLibraryEntry(void *handle, const char *name)
2959 TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
2961 symbol = hpi_library->FindLibraryEntry(handle, name);
2963 TRACEJVMCALLSEXIT(("->%p", symbol));
2971 jboolean JVM_IsNaN(jdouble a)
2973 log_println("JVM_IsNaN: IMPLEMENT ME!");
2979 /* JVM_IsSupportedJNIVersion */
2981 jboolean JVM_IsSupportedJNIVersion(jint version)
2983 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
2985 return jni_version_check(version);
2989 /* JVM_InternString */
2991 jstring JVM_InternString(JNIEnv *env, jstring str)
2993 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
2995 return (jstring) javastring_intern((java_handle_t *) str);
2999 /* JVM_RawMonitorCreate */
3001 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3005 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3007 o = NEW(java_object_t);
3009 lock_init_object_lock(o);
3015 /* JVM_RawMonitorDestroy */
3017 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3019 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3021 FREE(mon, java_object_t);
3025 /* JVM_RawMonitorEnter */
3027 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3029 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3031 (void) lock_monitor_enter((java_object_t *) mon);
3037 /* JVM_RawMonitorExit */
3039 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3041 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3043 (void) lock_monitor_exit((java_object_t *) mon);
3047 /* JVM_SetPrimitiveFieldValues */
3049 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3051 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3055 /* JVM_GetPrimitiveFieldValues */
3057 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3059 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3063 /* JVM_AccessVMBooleanFlag */
3065 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3067 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3073 /* JVM_AccessVMIntFlag */
3075 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3077 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3083 /* JVM_VMBreakPoint */
3085 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3087 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3091 /* JVM_GetClassFields */
3093 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3095 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3101 /* JVM_GetClassMethods */
3103 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3105 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3111 /* JVM_GetClassConstructors */
3113 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3115 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3121 /* JVM_GetClassField */
3123 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3125 log_println("JVM_GetClassField: IMPLEMENT ME!");
3131 /* JVM_GetClassMethod */
3133 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3135 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3141 /* JVM_GetClassConstructor */
3143 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3145 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3151 /* JVM_NewInstance */
3153 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3155 log_println("JVM_NewInstance: IMPLEMENT ME!");
3163 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3165 log_println("JVM_GetField: IMPLEMENT ME!");
3171 /* JVM_GetPrimitiveField */
3173 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3177 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3187 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3189 log_println("JVM_SetField: IMPLEMENT ME!");
3193 /* JVM_SetPrimitiveField */
3195 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3197 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3201 /* JVM_InvokeMethod */
3203 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3205 java_lang_reflect_Method *rm;
3212 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3214 rm = (java_lang_reflect_Method *) method;
3216 LLNI_field_get_cls(rm, clazz, c);
3217 LLNI_field_get_val(rm, slot, slot);
3218 LLNI_field_get_val(rm, override, override);
3220 m = &(c->methods[slot]);
3222 ro = reflect_method_invoke(m, (java_handle_t *) obj, (java_handle_objectarray_t *) args0, override);
3224 return (jobject) ro;
3228 /* JVM_NewInstanceFromConstructor */
3230 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3232 java_lang_reflect_Constructor *rc;
3239 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3241 rc = (java_lang_reflect_Constructor *) con;
3243 LLNI_field_get_cls(rc, clazz, c);
3244 LLNI_field_get_val(rc, slot, slot);
3245 LLNI_field_get_val(rc, override, override);
3247 m = &(c->methods[slot]);
3249 o = reflect_constructor_newinstance(m, (java_handle_objectarray_t *) args0, override);
3255 /* JVM_SupportsCX8 */
3257 jboolean JVM_SupportsCX8()
3259 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3269 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3271 log_println("JVM_CX8Field: IMPLEMENT ME!");
3277 /* JVM_GetAllThreads */
3279 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3281 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3287 /* JVM_DumpThreads */
3289 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3291 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3297 /* JVM_GetManagement */
3299 void *JVM_GetManagement(jint version)
3301 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3303 /* TODO We current don't support the management interface. */
3309 /* JVM_InitAgentProperties */
3311 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3313 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3319 /* JVM_GetEnclosingMethodInfo */
3321 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3325 java_handle_objectarray_t *oa;
3327 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3329 c = LLNI_classinfo_unwrap(ofClass);
3331 if ((c == NULL) || class_is_primitive(c))
3334 m = class_get_enclosingmethod_raw(c);
3339 oa = builtin_anewarray(3, class_java_lang_Object);
3344 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
3345 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3346 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3348 return (jobjectArray) oa;
3352 /* JVM_GetThreadStateValues */
3354 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3356 java_handle_intarray_t *ia;
3358 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3359 env, javaThreadState));
3361 /* If new thread states are added in future JDK and VM versions,
3362 this should check if the JDK version is compatible with thread
3363 states supported by the VM. Return NULL if not compatible.
3365 This function must map the VM java_lang_Thread::ThreadStatus
3366 to the Java thread state that the JDK supports. */
3368 switch (javaThreadState) {
3369 case THREAD_STATE_NEW:
3370 ia = builtin_newarray_int(1);
3375 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3378 case THREAD_STATE_RUNNABLE:
3379 ia = builtin_newarray_int(1);
3384 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3387 case THREAD_STATE_BLOCKED:
3388 ia = builtin_newarray_int(1);
3393 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3396 case THREAD_STATE_WAITING:
3397 ia = builtin_newarray_int(2);
3402 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3403 /* XXX Implement parked stuff. */
3404 /* array_intarray_element_set(ia, 1, PARKED); */
3407 case THREAD_STATE_TIMED_WAITING:
3408 ia = builtin_newarray_int(3);
3413 /* XXX Not sure about that one. */
3414 /* array_intarray_element_set(ia, 0, SLEEPING); */
3415 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3416 /* XXX Implement parked stuff. */
3417 /* array_intarray_element_set(ia, 2, PARKED); */
3420 case THREAD_STATE_TERMINATED:
3421 ia = builtin_newarray_int(1);
3426 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3430 /* Unknown state - probably incompatible JDK version */
3434 return (jintArray) ia;
3438 /* JVM_GetThreadStateNames */
3440 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3442 java_handle_intarray_t *ia;
3443 java_handle_objectarray_t *oa;
3446 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3447 env, javaThreadState, values));
3449 ia = (java_handle_intarray_t *) values;
3451 /* If new thread states are added in future JDK and VM versions,
3452 this should check if the JDK version is compatible with thread
3453 states supported by the VM. Return NULL if not compatible.
3455 This function must map the VM java_lang_Thread::ThreadStatus
3456 to the Java thread state that the JDK supports. */
3458 if (values == NULL) {
3459 exceptions_throw_nullpointerexception();
3463 switch (javaThreadState) {
3464 case THREAD_STATE_NEW:
3465 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3467 oa = builtin_anewarray(1, class_java_lang_String);
3472 s = javastring_new(utf_new_char("NEW"));
3477 array_objectarray_element_set(oa, 0, s);
3480 case THREAD_STATE_RUNNABLE:
3481 oa = builtin_anewarray(1, class_java_lang_String);
3486 s = javastring_new(utf_new_char("RUNNABLE"));
3491 array_objectarray_element_set(oa, 0, s);
3494 case THREAD_STATE_BLOCKED:
3495 oa = builtin_anewarray(1, class_java_lang_String);
3500 s = javastring_new(utf_new_char("BLOCKED"));
3505 array_objectarray_element_set(oa, 0, s);
3508 case THREAD_STATE_WAITING:
3509 oa = builtin_anewarray(2, class_java_lang_String);
3514 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3515 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3520 array_objectarray_element_set(oa, 0, s);
3521 /* array_objectarray_element_set(oa, 1, s); */
3524 case THREAD_STATE_TIMED_WAITING:
3525 oa = builtin_anewarray(3, class_java_lang_String);
3530 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3531 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3532 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3537 /* array_objectarray_element_set(oa, 0, s); */
3538 array_objectarray_element_set(oa, 0, s);
3539 /* array_objectarray_element_set(oa, 2, s); */
3542 case THREAD_STATE_TERMINATED:
3543 oa = builtin_anewarray(1, class_java_lang_String);
3548 s = javastring_new(utf_new_char("TERMINATED"));
3553 array_objectarray_element_set(oa, 0, s);
3557 /* Unknown state - probably incompatible JDK version */
3561 return (jobjectArray) oa;
3565 /* JVM_GetVersionInfo */
3567 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3569 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3573 /* OS: JVM_RegisterSignal */
3575 void *JVM_RegisterSignal(jint sig, void *handler)
3577 functionptr newHandler;
3579 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3581 if (handler == (void *) 2)
3582 newHandler = (functionptr) signal_thread_handler;
3584 newHandler = (functionptr) (uintptr_t) handler;
3591 /* These signals are already used by the VM. */
3595 /* This signal is used by the VM to dump thread stacks unless
3596 ReduceSignalUsage is set, in which case the user is allowed
3597 to set his own _native_ handler for this signal; thus, in
3598 either case, we do not allow JVM_RegisterSignal to change
3608 signal_register_signal(sig, newHandler, SA_RESTART | SA_SIGINFO);
3610 /* XXX Should return old handler. */
3616 /* OS: JVM_RaiseSignal */
3618 jboolean JVM_RaiseSignal(jint sig)
3620 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3626 /* OS: JVM_FindSignal */
3628 jint JVM_FindSignal(const char *name)
3630 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3632 #if defined(__LINUX__)
3633 if (strcmp(name, "HUP") == 0)
3636 if (strcmp(name, "INT") == 0)
3639 if (strcmp(name, "TERM") == 0)
3642 # error not implemented for this OS
3652 * These are local overrides for various environment variables in Emacs.
3653 * Please do not remove this and leave it at the end of the file, where
3654 * Emacs will automagically detect them.
3655 * ---------------------------------------------------------------------
3658 * indent-tabs-mode: t