1 /* src/native/vm/sun/jvm.c - HotSpot JVM interface functions
3 Copyright (C) 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
36 #if defined(HAVE_SYS_IOCTL_H)
37 #define BSD_COMP /* Get FIONREAD on Solaris2 */
38 #include <sys/ioctl.h>
41 #include <sys/socket.h>
43 #include <sys/types.h>
47 #include "mm/memory.h"
49 #include "native/jni.h"
50 #include "native/llni.h"
51 #include "native/native.h"
53 #include "native/include/java_lang_AssertionStatusDirectives.h"
54 #include "native/include/java_lang_String.h" /* required by j.l.CL */
55 #include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
56 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
57 #include "native/include/java_lang_StackTraceElement.h"
58 #include "native/include/java_lang_Throwable.h"
59 #include "native/include/java_security_ProtectionDomain.h"
61 #if defined(ENABLE_ANNOTATIONS)
62 #include "native/include/sun_reflect_ConstantPool.h"
65 #include "native/vm/java_lang_Class.h"
66 #include "native/vm/java_lang_reflect_Constructor.h"
67 #include "native/vm/java_lang_reflect_Method.h"
68 #include "native/vm/reflect.h"
70 #include "threads/lock-common.h"
71 #include "threads/threadlist.h"
72 #include "threads/threads-common.h"
74 #include "toolbox/logging.h"
75 #include "toolbox/list.h"
79 #if defined(ENABLE_ASSERTION)
80 #include "vm/assertion.h"
83 #include "vm/builtin.h"
84 #include "vm/exceptions.h"
85 #include "vm/global.h"
86 #include "vm/initialize.h"
87 #include "vm/package.h"
88 #include "vm/primitive.h"
89 #include "vm/properties.h"
90 #include "vm/resolve.h"
91 #include "vm/signallocal.h"
92 #include "vm/stringlocal.h"
95 #include "vm/jit/stacktrace.h"
97 #include "vmcore/classcache.h"
98 #include "vmcore/options.h"
99 #include "vmcore/system.h"
102 /* debugging macros ***********************************************************/
106 # define TRACEJVMCALLS(...) \
108 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
109 log_println(__VA_ARGS__); \
113 # define TRACEJVMCALLSVERBOSE(x) \
115 if (opt_TraceJVMCallsVerbose) { \
120 # define PRINTJVMWARNINGS(...)
122 /* if (opt_PrintJVMWarnings) { \ */
123 /* log_println(__VA_ARGS__); \ */
129 # define TRACEJVMCALLS(...)
130 # define TRACEJVMCALLSVERBOSE(x)
131 # define PRINTJVMWARNINGS(...)
137 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
138 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
139 /* and build number (xx) */
140 unsigned int update_version : 8; /* Update release version (uu) */
141 unsigned int special_update_version : 8; /* Special update release version (c) */
142 unsigned int reserved1 : 16;
143 unsigned int reserved2;
145 /* The following bits represents JVM supports that JDK has dependency on.
146 * JDK can use these bits to determine which JVM version
147 * and support it has to maintain runtime compatibility.
149 * When a new bit is added in a minor or update release, make sure
150 * the new bit is also added in the main/baseline.
152 unsigned int is_attachable : 1;
160 * A structure used to a capture exception table entry in a Java method.
167 } JVM_ExceptionTableEntryType;
170 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
172 if ((intptr_t) count <= 0)
175 return vsnprintf(str, count, fmt, args);
179 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
185 len = jio_vsnprintf(str, count, fmt, ap);
192 int jio_fprintf(FILE* f, const char *fmt, ...)
194 log_println("jio_fprintf: IMPLEMENT ME!");
200 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
202 log_println("jio_vfprintf: IMPLEMENT ME!");
208 int jio_printf(const char *fmt, ...)
210 log_println("jio_printf: IMPLEMENT ME!");
216 /* JVM_GetInterfaceVersion */
218 jint JVM_GetInterfaceVersion()
220 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
222 #define JVM_INTERFACE_VERSION 4
224 return JVM_INTERFACE_VERSION;
228 /* JVM_CurrentTimeMillis */
230 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
232 TRACEJVMCALLS("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored);
234 return (jlong) builtin_currenttimemillis();
240 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
242 TRACEJVMCALLS("JVM_NanoTime(env=%p, ignored=%p)", env, ignored);
244 return (jlong) builtin_nanotime();
250 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
255 s = (java_handle_t *) src;
256 d = (java_handle_t *) dst;
258 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));
260 builtin_arraycopy(s, src_pos, d, dst_pos, length);
264 /* JVM_InitProperties */
266 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
270 TRACEJVMCALLS("JVM_InitProperties(env=%p, properties=%p)", env, properties);
272 h = (java_handle_t *) properties;
274 properties_system_add_all(h);
282 void JVM_Exit(jint code)
284 log_println("JVM_Exit: IMPLEMENT ME!");
290 void JVM_Halt(jint code)
292 TRACEJVMCALLS("JVM_Halt(code=%d)", code);
299 /* JVM_OnExit(void (*func)) */
301 void JVM_OnExit(void (*func)(void))
303 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
311 TRACEJVMCALLS("JVM_GC()");
317 /* JVM_MaxObjectInspectionAge */
319 jlong JVM_MaxObjectInspectionAge(void)
321 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
327 /* JVM_TraceInstructions */
329 void JVM_TraceInstructions(jboolean on)
331 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
335 /* JVM_TraceMethodCalls */
337 void JVM_TraceMethodCalls(jboolean on)
339 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
343 /* JVM_TotalMemory */
345 jlong JVM_TotalMemory(void)
347 TRACEJVMCALLS("JVM_TotalMemory()");
349 return gc_get_heap_size();
355 jlong JVM_FreeMemory(void)
357 TRACEJVMCALLS("JVM_FreeMemory()");
359 return gc_get_free_bytes();
365 jlong JVM_MaxMemory(void)
367 TRACEJVMCALLS("JVM_MaxMemory()");
369 return gc_get_max_heap_size();
373 /* JVM_ActiveProcessorCount */
375 jint JVM_ActiveProcessorCount(void)
377 TRACEJVMCALLS("JVM_ActiveProcessorCount()");
379 return system_processors_online();
383 /* JVM_FillInStackTrace */
385 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
387 java_lang_Throwable *o;
388 java_handle_bytearray_t *ba;
390 TRACEJVMCALLS("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver);
392 o = (java_lang_Throwable *) receiver;
394 ba = stacktrace_get_current();
399 LLNI_field_set_ref(o, backtrace, (java_lang_Object *) ba);
403 /* JVM_PrintStackTrace */
405 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
407 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
411 /* JVM_GetStackTraceDepth */
413 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
415 java_lang_Throwable *t;
416 java_handle_bytearray_t *ba;
420 TRACEJVMCALLS("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable);
422 if (throwable == NULL) {
423 exceptions_throw_nullpointerexception();
427 t = (java_lang_Throwable *) throwable;
429 LLNI_field_get_ref(t, backtrace, ba);
434 /* We need a critical section here as the stacktrace structure is
435 mapped onto a Java byte-array. */
439 st = (stacktrace_t *) LLNI_array_data(ba);
449 /* JVM_GetStackTraceElement */
451 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
453 java_lang_Throwable *t;
454 java_handle_bytearray_t *ba;
456 stacktrace_entry_t *ste;
460 java_lang_StackTraceElement *o;
461 java_lang_String *declaringclass;
462 java_lang_String *filename;
465 TRACEJVMCALLS("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index);
467 t = (java_lang_Throwable *) throwable;
469 LLNI_field_get_ref(t, backtrace, ba);
471 /* FIXME critical section */
473 st = (stacktrace_t *) LLNI_array_data(ba);
475 if ((index < 0) || (index >= st->length)) {
476 /* XXX This should be an IndexOutOfBoundsException (check this
479 exceptions_throw_arrayindexoutofboundsexception();
483 /* Get the stacktrace entry. */
485 ste = &(st->entries[index]);
487 /* Get the codeinfo, methodinfo and classinfo. */
493 /* allocate a new StackTraceElement */
495 o = (java_lang_StackTraceElement *)
496 builtin_new(class_java_lang_StackTraceElement);
503 if (!(m->flags & ACC_NATIVE)) {
504 if (c->sourcefile != NULL)
505 filename = (java_lang_String *) javastring_new(c->sourcefile);
512 /* get line number */
514 if (m->flags & ACC_NATIVE) {
518 /* FIXME The linenumbertable_linenumber_for_pc could change
519 the methodinfo pointer when hitting an inlined method. */
521 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
522 linenumber = (linenumber == 0) ? -1 : linenumber;
525 /* get declaring class name */
527 declaringclass = _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(c));
529 /* fill the java.lang.StackTraceElement element */
531 /* FIXME critical section */
533 o->declaringClass = declaringclass;
534 o->methodName = (java_lang_String *) javastring_new(m->name);
535 o->fileName = filename;
536 o->lineNumber = linenumber;
544 jint JVM_IHashCode(JNIEnv* env, jobject handle)
546 TRACEJVMCALLS("JVM_IHashCode(env=%p, jobject=%p)", env, handle);
548 return (jint) ((ptrint) handle);
552 /* JVM_MonitorWait */
554 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
556 #if defined(ENABLE_THREADS)
560 TRACEJVMCALLS("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms);
562 /* exceptions_throw_illegalargumentexception("argument out of range"); */
563 exceptions_throw_illegalargumentexception();
567 #if defined(ENABLE_THREADS)
568 o = (java_handle_t *) handle;
570 lock_wait_for_object(o, ms, 0);
575 /* JVM_MonitorNotify */
577 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
579 #if defined(ENABLE_THREADS)
583 TRACEJVMCALLS("JVM_MonitorNotify(env=%p, handle=%p)", env, handle);
585 #if defined(ENABLE_THREADS)
586 o = (java_handle_t *) handle;
588 lock_notify_object(o);
593 /* JVM_MonitorNotifyAll */
595 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
597 #if defined(ENABLE_THREADS)
601 TRACEJVMCALLS("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle);
603 #if defined(ENABLE_THREADS)
604 o = (java_handle_t *) handle;
606 lock_notify_all_object(o);
613 jobject JVM_Clone(JNIEnv* env, jobject handle)
615 TRACEJVMCALLS("JVM_Clone(env=%p, handle=%p)", env, handle);
617 return (jobject) builtin_clone(env, (java_handle_t *) handle);
621 /* JVM_InitializeCompiler */
623 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
625 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
629 /* JVM_IsSilentCompiler */
631 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
633 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
639 /* JVM_CompileClass */
641 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
643 log_println("JVM_CompileClass: IMPLEMENT ME!");
649 /* JVM_CompileClasses */
651 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
653 log_println("JVM_CompileClasses: IMPLEMENT ME!");
659 /* JVM_CompilerCommand */
661 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
663 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
669 /* JVM_EnableCompiler */
671 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
673 TRACEJVMCALLS("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls);
674 PRINTJVMWARNINGS("JVM_EnableCompiler not supported");
678 /* JVM_DisableCompiler */
680 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
682 TRACEJVMCALLS("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls);
683 PRINTJVMWARNINGS("JVM_DisableCompiler not supported");
687 /* JVM_GetLastErrorString */
689 jint JVM_GetLastErrorString(char *buf, int len)
715 char *JVM_NativePath(char *path)
717 TRACEJVMCALLS("JVM_NativePath(path=%s)", path);
719 /* XXX is this correct? */
725 /* JVM_GetCallerClass */
727 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
729 java_handle_objectarray_t *oa;
731 TRACEJVMCALLS("JVM_GetCallerClass(env=%p, depth=%d)", env, depth);
733 oa = stacktrace_getClassContext();
738 if (oa->header.size < depth)
741 return (jclass) oa->data[depth - 1];
746 /* JVM_FindPrimitiveClass */
748 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
753 TRACEJVMCALLS("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s);
756 c = primitive_class_get_by_name(u);
758 return (jclass) LLNI_classinfo_wrap(c);
762 /* JVM_ResolveClass */
764 void JVM_ResolveClass(JNIEnv* env, jclass cls)
766 TRACEJVMCALLS("JVM_ResolveClass(env=%p, cls=%p)", env, cls);
767 PRINTJVMWARNINGS("JVM_ResolveClass not implemented");
771 /* JVM_FindClassFromClassLoader */
773 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
779 TRACEJVMCALLS("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError);
781 u = utf_new_char(name);
782 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
784 c = load_class_from_classloader(u, cl);
790 if (!(c->state & CLASS_INITIALIZED))
791 if (!initialize_class(c))
794 return (jclass) LLNI_classinfo_wrap(c);
798 /* JVM_FindClassFromClass */
800 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
802 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
808 /* JVM_DefineClass */
810 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
812 log_println("JVM_DefineClass: IMPLEMENT ME!");
818 /* JVM_DefineClassWithSource */
820 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
826 TRACEJVMCALLS("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source);
829 u = utf_new_char(name);
833 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
835 /* XXX do something with source */
837 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
839 return (jclass) LLNI_classinfo_wrap(c);
843 /* JVM_FindLoadedClass */
845 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
851 TRACEJVMCALLS("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name);
853 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
855 u = javastring_toutf((java_handle_t *) name, true);
856 c = classcache_lookup(cl, u);
858 return (jclass) LLNI_classinfo_wrap(c);
862 /* JVM_GetClassName */
864 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
866 TRACEJVMCALLS("JVM_GetClassName(env=%p, cls=%p)", env, cls);
868 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
872 /* JVM_GetClassInterfaces */
874 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
877 java_handle_objectarray_t *oa;
879 TRACEJVMCALLS("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls);
881 c = LLNI_classinfo_unwrap(cls);
883 oa = class_get_interfaces(c);
885 return (jobjectArray) oa;
889 /* JVM_GetClassLoader */
891 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
896 TRACEJVMCALLS("JVM_GetClassLoader(env=%p, cls=%p)", env, cls);
898 c = LLNI_classinfo_unwrap(cls);
899 cl = class_get_classloader(c);
905 /* JVM_IsInterface */
907 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
911 TRACEJVMCALLS("JVM_IsInterface(env=%p, cls=%p)", env, cls);
913 c = LLNI_classinfo_unwrap(cls);
915 return class_is_interface(c);
919 /* JVM_GetClassSigners */
921 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
923 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
929 /* JVM_SetClassSigners */
931 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
934 java_handle_objectarray_t *hoa;
936 TRACEJVMCALLS("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers);
938 c = LLNI_classinfo_unwrap(cls);
940 hoa = (java_handle_objectarray_t *) signers;
942 /* This call is ignored for primitive types and arrays. Signers
943 are only set once, ClassLoader.java, and thus shouldn't be
944 called with an array. Only the bootstrap loader creates
947 if (class_is_primitive(c) || class_is_array(c))
950 LLNI_classinfo_field_set(c, signers, hoa);
954 /* JVM_GetProtectionDomain */
956 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
960 TRACEJVMCALLS("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls);
962 c = LLNI_classinfo_unwrap(cls);
965 exceptions_throw_nullpointerexception();
969 /* Primitive types do not have a protection domain. */
971 if (class_is_primitive(c))
974 return (jobject) c->protectiondomain;
978 /* JVM_SetProtectionDomain */
980 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
982 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
986 /* JVM_DoPrivileged */
988 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
993 java_handle_t *result;
996 TRACEJVMCALLS("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException);
998 o = (java_handle_t *) action;
1001 if (action == NULL) {
1002 exceptions_throw_nullpointerexception();
1006 /* lookup run() method (throw no exceptions) */
1008 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1011 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1012 exceptions_throw_internalerror("No run method");
1016 /* XXX It seems something with a privileged stack needs to be done
1019 result = vm_call_method(m, o);
1021 e = exceptions_get_and_clear_exception();
1024 exceptions_throw_privilegedactionexception(e);
1028 return (jobject) result;
1032 /* JVM_GetInheritedAccessControlContext */
1034 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1036 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1042 /* JVM_GetStackAccessControlContext */
1044 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1046 TRACEJVMCALLS("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls);
1048 /* XXX All stuff I tested so far works without that function. At
1049 some point we have to implement it, but I disable the output
1050 for now to make IcedTea happy. */
1056 /* JVM_IsArrayClass */
1058 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1062 TRACEJVMCALLS("JVM_IsArrayClass(env=%p, cls=%p)", env, cls);
1064 c = LLNI_classinfo_unwrap(cls);
1066 return class_is_array(c);
1070 /* JVM_IsPrimitiveClass */
1072 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1076 TRACEJVMCALLS("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls);
1078 c = LLNI_classinfo_unwrap(cls);
1080 return class_is_primitive(c);
1084 /* JVM_GetComponentType */
1086 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1088 classinfo *component;
1091 TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
1093 c = LLNI_classinfo_unwrap(cls);
1095 component = class_get_componenttype(c);
1097 return (jclass) LLNI_classinfo_wrap(component);
1101 /* JVM_GetClassModifiers */
1103 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1108 TRACEJVMCALLS("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls);
1110 c = LLNI_classinfo_unwrap(cls);
1112 flags = class_get_modifiers(c, false);
1118 /* JVM_GetDeclaredClasses */
1120 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1123 java_handle_objectarray_t *oa;
1125 TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
1127 c = LLNI_classinfo_unwrap(ofClass);
1129 oa = class_get_declaredclasses(c, false);
1131 return (jobjectArray) oa;
1135 /* JVM_GetDeclaringClass */
1137 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1142 TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
1144 c = LLNI_classinfo_unwrap(ofClass);
1146 dc = class_get_declaringclass(c);
1148 return (jclass) LLNI_classinfo_wrap(dc);
1152 /* JVM_GetClassSignature */
1154 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1160 TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
1162 c = LLNI_classinfo_unwrap(cls);
1164 /* Get the signature of the class. */
1166 u = class_get_signature(c);
1171 /* Convert UTF-string to a Java-string. */
1173 s = javastring_new(u);
1179 /* JVM_GetClassAnnotations */
1181 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1183 classinfo *c = NULL; /* classinfo for 'cls' */
1184 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1186 TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
1189 exceptions_throw_nullpointerexception();
1193 c = LLNI_classinfo_unwrap(cls);
1195 /* get annotations: */
1196 annotations = class_get_annotations(c);
1198 return (jbyteArray)annotations;
1202 /* JVM_GetFieldAnnotations */
1204 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1206 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1207 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1209 TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
1211 if (field == NULL) {
1212 exceptions_throw_nullpointerexception();
1216 rf = (java_lang_reflect_Field*)field;
1218 LLNI_field_get_ref(rf, annotations, ba);
1220 return (jbyteArray)ba;
1224 /* JVM_GetMethodAnnotations */
1226 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1228 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1229 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1231 TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
1233 if (method == NULL) {
1234 exceptions_throw_nullpointerexception();
1238 rm = (java_lang_reflect_Method*)method;
1240 LLNI_field_get_ref(rm, annotations, ba);
1242 return (jbyteArray)ba;
1246 /* JVM_GetMethodDefaultAnnotationValue */
1248 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1250 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1251 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1253 TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
1255 if (method == NULL) {
1256 exceptions_throw_nullpointerexception();
1260 rm = (java_lang_reflect_Method*)method;
1262 LLNI_field_get_ref(rm, annotationDefault, ba);
1264 return (jbyteArray)ba;
1268 /* JVM_GetMethodParameterAnnotations */
1270 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1272 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1273 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1275 TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
1277 if (method == NULL) {
1278 exceptions_throw_nullpointerexception();
1282 rm = (java_lang_reflect_Method*)method;
1284 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1286 return (jbyteArray)ba;
1290 /* JVM_GetClassDeclaredFields */
1292 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1294 TRACEJVMCALLS("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly);
1296 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1300 /* JVM_GetClassDeclaredMethods */
1302 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1304 TRACEJVMCALLS("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly);
1306 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1310 /* JVM_GetClassDeclaredConstructors */
1312 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1314 TRACEJVMCALLS("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly);
1316 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1320 /* JVM_GetClassAccessFlags */
1322 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1326 TRACEJVMCALLS("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls);
1328 c = LLNI_classinfo_unwrap(cls);
1330 /* Primitive type classes have the correct access flags. */
1332 return c->flags & ACC_CLASS_REFLECT_MASK;
1336 /* JVM_GetClassConstantPool */
1338 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1340 #if defined(ENABLE_ANNOTATIONS)
1341 sun_reflect_ConstantPool *constantPool = NULL;
1342 /* constant pool object for the class refered by 'cls' */
1343 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1344 /* constantPoolOop field of the constant pool object */
1346 TRACEJVMCALLS("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls);
1349 (sun_reflect_ConstantPool*)native_new_and_init(
1350 class_sun_reflect_ConstantPool);
1352 if (constantPool == NULL) {
1357 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1359 return (jobject)constantPool;
1361 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1367 /* JVM_ConstantPoolGetSize */
1369 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1371 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1373 TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
1375 c = LLNI_classinfo_unwrap(jcpool);
1381 /* JVM_ConstantPoolGetClassAt */
1383 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1385 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1386 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1387 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1389 TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
1391 c = LLNI_classinfo_unwrap(jcpool);
1393 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1396 exceptions_throw_illegalargumentexception();
1400 result = resolve_classref_eager(ref);
1402 return (jclass) LLNI_classinfo_wrap(result);
1406 /* JVM_ConstantPoolGetClassAtIfLoaded */
1408 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1410 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1411 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1412 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1414 TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
1416 c = LLNI_classinfo_unwrap(jcpool);
1418 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1421 exceptions_throw_illegalargumentexception();
1425 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1429 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1433 return (jclass) LLNI_classinfo_wrap(result);
1437 /* JVM_ConstantPoolGetMethodAt */
1439 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1441 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1442 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1444 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
1446 cls = LLNI_classinfo_unwrap(jcpool);
1447 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1450 exceptions_throw_illegalargumentexception();
1454 /* XXX: is that right? or do I have to use resolve_method_*? */
1455 return (jobject)reflect_method_new(ref->p.method);
1459 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1461 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1463 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1464 classinfo *c = NULL; /* resolved declaring class of the method */
1465 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1467 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1469 cls = LLNI_classinfo_unwrap(jcpool);
1470 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1473 exceptions_throw_illegalargumentexception();
1477 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1481 if (c == NULL || !(c->state & CLASS_LOADED)) {
1485 return (jobject)reflect_method_new(ref->p.method);
1489 /* JVM_ConstantPoolGetFieldAt */
1491 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1493 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1494 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1496 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
1498 cls = LLNI_classinfo_unwrap(jcpool);
1499 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1502 exceptions_throw_illegalargumentexception();
1506 return (jobject)reflect_field_new(ref->p.field);
1510 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1512 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1514 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1515 classinfo *c; /* resolved declaring class for the field */
1516 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1518 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1520 cls = LLNI_classinfo_unwrap(jcpool);
1521 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1524 exceptions_throw_illegalargumentexception();
1528 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1532 if (c == NULL || !(c->state & CLASS_LOADED)) {
1536 return (jobject)reflect_field_new(ref->p.field);
1540 /* JVM_ConstantPoolGetMemberRefInfoAt */
1542 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1544 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1546 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1552 /* JVM_ConstantPoolGetIntAt */
1554 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1556 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1557 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1559 TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
1561 cls = LLNI_classinfo_unwrap(jcpool);
1562 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1565 exceptions_throw_illegalargumentexception();
1573 /* JVM_ConstantPoolGetLongAt */
1575 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1577 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1578 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1580 TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
1582 cls = LLNI_classinfo_unwrap(jcpool);
1583 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1586 exceptions_throw_illegalargumentexception();
1594 /* JVM_ConstantPoolGetFloatAt */
1596 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1598 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1599 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1601 TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
1603 cls = LLNI_classinfo_unwrap(jcpool);
1604 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1607 exceptions_throw_illegalargumentexception();
1615 /* JVM_ConstantPoolGetDoubleAt */
1617 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1619 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1620 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1622 TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
1624 cls = LLNI_classinfo_unwrap(jcpool);
1625 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1628 exceptions_throw_illegalargumentexception();
1636 /* JVM_ConstantPoolGetStringAt */
1638 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1640 utf *ref; /* utf object for the string in constant pool at index 'index' */
1641 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1643 TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
1645 cls = LLNI_classinfo_unwrap(jcpool);
1646 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1649 exceptions_throw_illegalargumentexception();
1653 /* XXX: I hope literalstring_new is the right Function. */
1654 return (jstring)literalstring_new(ref);
1658 /* JVM_ConstantPoolGetUTF8At */
1660 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1662 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1663 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1665 TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
1667 cls = LLNI_classinfo_unwrap(jcpool);
1668 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1671 exceptions_throw_illegalargumentexception();
1675 /* XXX: I hope literalstring_new is the right Function. */
1676 return (jstring)literalstring_new(ref);
1680 /* JVM_DesiredAssertionStatus */
1682 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1684 #if defined(ENABLE_ASSERTION)
1685 assertion_name_t *item;
1690 TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
1692 c = LLNI_classinfo_unwrap(cls);
1694 if (c->classloader == NULL) {
1695 status = (jboolean)assertion_system_enabled;
1698 status = (jboolean)assertion_user_enabled;
1701 if (list_assertion_names != NULL) {
1702 item = (assertion_name_t *)list_first(list_assertion_names);
1703 while (item != NULL) {
1704 name = utf_new_char(item->name);
1705 if (name == c->packagename) {
1706 status = (jboolean)item->enabled;
1708 else if (name == c->name) {
1709 status = (jboolean)item->enabled;
1712 item = (assertion_name_t *)list_next(list_assertion_names, item);
1718 return (jboolean)false;
1723 /* JVM_AssertionStatusDirectives */
1725 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1728 java_lang_AssertionStatusDirectives *o;
1729 java_handle_objectarray_t *classes;
1730 java_handle_objectarray_t *packages;
1731 java_booleanarray_t *classEnabled;
1732 java_booleanarray_t *packageEnabled;
1733 #if defined(ENABLE_ASSERTION)
1734 assertion_name_t *item;
1739 TRACEJVMCALLS("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused);
1741 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1746 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1751 #if defined(ENABLE_ASSERTION)
1752 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1754 classes = builtin_anewarray(0, class_java_lang_Object);
1756 if (classes == NULL)
1759 #if defined(ENABLE_ASSERTION)
1760 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1762 packages = builtin_anewarray(0, class_java_lang_Object);
1764 if (packages == NULL)
1767 #if defined(ENABLE_ASSERTION)
1768 classEnabled = builtin_newarray_boolean(assertion_class_count);
1770 classEnabled = builtin_newarray_boolean(0);
1772 if (classEnabled == NULL)
1775 #if defined(ENABLE_ASSERTION)
1776 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1778 packageEnabled = builtin_newarray_boolean(0);
1780 if (packageEnabled == NULL)
1783 #if defined(ENABLE_ASSERTION)
1784 /* initialize arrays */
1786 if (list_assertion_names != NULL) {
1790 item = (assertion_name_t *)list_first(list_assertion_names);
1791 while (item != NULL) {
1792 js = javastring_new_from_ascii(item->name);
1797 if (item->package == false) {
1798 classes->data[i] = js;
1799 classEnabled->data[i] = (jboolean) item->enabled;
1803 packages->data[j] = js;
1804 packageEnabled->data[j] = (jboolean) item->enabled;
1808 item = (assertion_name_t *)list_next(list_assertion_names, item);
1813 /* set instance fields */
1815 o->classes = classes;
1816 o->packages = packages;
1817 o->classEnabled = classEnabled;
1818 o->packageEnabled = packageEnabled;
1824 /* JVM_GetClassNameUTF */
1826 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1828 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1834 /* JVM_GetClassCPTypes */
1836 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1838 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1842 /* JVM_GetClassCPEntriesCount */
1844 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1846 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1852 /* JVM_GetClassFieldsCount */
1854 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1856 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1862 /* JVM_GetClassMethodsCount */
1864 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1866 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1872 /* JVM_GetMethodIxExceptionIndexes */
1874 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1876 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1880 /* JVM_GetMethodIxExceptionsCount */
1882 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1884 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1890 /* JVM_GetMethodIxByteCode */
1892 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1894 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1898 /* JVM_GetMethodIxByteCodeLength */
1900 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1902 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1908 /* JVM_GetMethodIxExceptionTableEntry */
1910 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1912 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1916 /* JVM_GetMethodIxExceptionTableLength */
1918 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1920 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1926 /* JVM_GetMethodIxModifiers */
1928 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1930 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1936 /* JVM_GetFieldIxModifiers */
1938 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1940 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1946 /* JVM_GetMethodIxLocalsCount */
1948 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1950 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1956 /* JVM_GetMethodIxArgsSize */
1958 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1960 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1966 /* JVM_GetMethodIxMaxStack */
1968 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1970 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1976 /* JVM_IsConstructorIx */
1978 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1980 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1986 /* JVM_GetMethodIxNameUTF */
1988 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1990 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1996 /* JVM_GetMethodIxSignatureUTF */
1998 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
2000 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
2006 /* JVM_GetCPFieldNameUTF */
2008 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2010 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
2016 /* JVM_GetCPMethodNameUTF */
2018 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2020 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
2026 /* JVM_GetCPMethodSignatureUTF */
2028 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2030 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
2036 /* JVM_GetCPFieldSignatureUTF */
2038 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2040 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2046 /* JVM_GetCPClassNameUTF */
2048 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2050 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2056 /* JVM_GetCPFieldClassNameUTF */
2058 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2060 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2066 /* JVM_GetCPMethodClassNameUTF */
2068 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2070 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2076 /* JVM_GetCPFieldModifiers */
2078 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2080 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2086 /* JVM_GetCPMethodModifiers */
2088 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2090 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2096 /* JVM_ReleaseUTF */
2098 void JVM_ReleaseUTF(const char *utf)
2100 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2104 /* JVM_IsSameClassPackage */
2106 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2108 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2116 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2119 * JVM I/O error codes
2121 #define JVM_EEXIST -100
2123 jint JVM_Open(const char *fname, jint flags, jint mode)
2127 TRACEJVMCALLS("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode);
2129 result = system_open(fname, flags, mode);
2147 jint JVM_Close(jint fd)
2149 TRACEJVMCALLS("JVM_Close(fd=%d)", fd);
2151 return system_close(fd);
2157 jint JVM_Read(jint fd, char *buf, jint nbytes)
2159 TRACEJVMCALLS("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes);
2161 return system_read(fd, buf, nbytes);
2167 jint JVM_Write(jint fd, char *buf, jint nbytes)
2169 TRACEJVMCALLS("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes);
2171 return system_write(fd, buf, nbytes);
2177 jint JVM_Available(jint fd, jlong *pbytes)
2179 #if defined(FIONREAD)
2183 TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
2187 result = ioctl(fd, FIONREAD, &bytes);
2196 # error FIONREAD not defined
2203 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2205 TRACEJVMCALLS("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence);
2207 return (jlong) system_lseek(fd, (off_t) offset, whence);
2213 jint JVM_SetLength(jint fd, jlong length)
2215 TRACEJVMCALLS("JVM_SetLength(fd=%d, length=%ld)", length);
2217 return system_ftruncate(fd, length);
2223 jint JVM_Sync(jint fd)
2225 TRACEJVMCALLS("JVM_Sync(fd=%d)", fd);
2227 return system_fsync(fd);
2231 /* JVM_StartThread */
2233 void JVM_StartThread(JNIEnv* env, jobject jthread)
2235 TRACEJVMCALLS("JVM_StartThread(env=%p, jthread=%p)", env, jthread);
2237 threads_thread_start((java_handle_t *) jthread);
2241 /* JVM_StopThread */
2243 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2245 log_println("JVM_StopThread: IMPLEMENT ME!");
2249 /* JVM_IsThreadAlive */
2251 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2257 TRACEJVMCALLS("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread);
2259 /* XXX this is just a quick hack */
2261 for (t = threadlist_first(); t != NULL; t = threadlist_next(t)) {
2262 LLNI_equals(t->object, jthread, equal);
2268 /* The threadobject is null when a thread is created in Java. The
2269 priority is set later during startup. */
2274 result = threads_thread_is_alive(t);
2280 /* JVM_SuspendThread */
2282 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2284 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2288 /* JVM_ResumeThread */
2290 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2292 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2296 /* JVM_SetThreadPriority */
2298 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2303 TRACEJVMCALLS("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio);
2305 h = (java_handle_t *) jthread;
2307 /* XXX this is just a quick hack */
2309 for (t = threadlist_first(); t != NULL; t = threadlist_next(t)) {
2314 /* The threadobject is null when a thread is created in Java. The
2315 priority is set later during startup. */
2320 threads_set_thread_priority(t->tid, prio);
2326 void JVM_Yield(JNIEnv *env, jclass threadClass)
2328 TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
2336 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2338 TRACEJVMCALLS("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis);
2340 threads_sleep(millis, 0);
2344 /* JVM_CurrentThread */
2346 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2350 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2352 o = threads_get_current_object();
2358 /* JVM_CountStackFrames */
2360 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2362 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2370 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2372 log_println("JVM_Interrupt: IMPLEMENT ME!");
2376 /* JVM_IsInterrupted */
2378 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2383 TRACEJVMCALLS("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted);
2385 h = (java_handle_t *) jthread;
2387 /* XXX do something with clear_interrupted */
2389 /* XXX this is just a quick hack */
2391 for (t = threadlist_first(); t != NULL; t = threadlist_next(t)) {
2396 return threads_thread_has_been_interrupted(t);
2402 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2407 TRACEJVMCALLS("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj);
2409 h = (java_handle_t *) obj;
2412 exceptions_throw_nullpointerexception();
2416 result = lock_is_held_by_current_thread(h);
2422 /* JVM_DumpAllStacks */
2424 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2426 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2430 /* JVM_CurrentLoadedClass */
2432 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2434 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2440 /* JVM_CurrentClassLoader */
2442 jobject JVM_CurrentClassLoader(JNIEnv *env)
2444 /* XXX if a method in a class in a trusted loader is in a
2445 doPrivileged, return NULL */
2447 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2453 /* JVM_GetClassContext */
2455 jobjectArray JVM_GetClassContext(JNIEnv *env)
2457 TRACEJVMCALLS("JVM_GetClassContext(env=%p)", env);
2459 return (jobjectArray) stacktrace_getClassContext();
2463 /* JVM_ClassDepth */
2465 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2467 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2473 /* JVM_ClassLoaderDepth */
2475 jint JVM_ClassLoaderDepth(JNIEnv *env)
2477 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2483 /* JVM_GetSystemPackage */
2485 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2491 TRACEJVMCALLS("JVM_GetSystemPackage(env=%p, name=%p)", env, name);
2493 /* s = package_find(name); */
2494 u = javastring_toutf((java_handle_t *) name, false);
2496 result = package_find(u);
2499 s = javastring_new(result);
2507 /* JVM_GetSystemPackages */
2509 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2511 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2517 /* JVM_AllocateNewObject */
2519 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2521 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2527 /* JVM_AllocateNewArray */
2529 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2531 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2537 /* JVM_LatestUserDefinedLoader */
2539 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2543 TRACEJVMCALLS("JVM_LatestUserDefinedLoader(env=%p)", env);
2545 cl = stacktrace_first_nonnull_classloader();
2547 return (jobject) cl;
2551 /* JVM_LoadClass0 */
2553 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2555 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2561 /* JVM_GetArrayLength */
2563 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2567 TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
2569 a = (java_handle_t *) arr;
2571 return array_length_get(a);
2575 /* JVM_GetArrayElement */
2577 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2582 TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
2584 a = (java_handle_t *) arr;
2586 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2587 /* exceptions_throw_illegalargumentexception(); */
2591 o = array_element_get(a, index);
2597 /* JVM_GetPrimitiveArrayElement */
2599 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2603 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2611 /* JVM_SetArrayElement */
2613 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2616 java_handle_t *value;
2618 TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
2620 a = (java_handle_t *) arr;
2621 value = (java_handle_t *) val;
2623 array_element_set(a, index, value);
2627 /* JVM_SetPrimitiveArrayElement */
2629 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2631 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2637 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2642 java_handle_objectarray_t *oa;
2644 TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
2646 if (eltClass == NULL) {
2647 exceptions_throw_nullpointerexception();
2651 /* NegativeArraySizeException is checked in builtin_newarray. */
2653 c = LLNI_classinfo_unwrap(eltClass);
2655 /* create primitive or object array */
2657 if (class_is_primitive(c)) {
2658 pc = primitive_arrayclass_get_by_name(c->name);
2659 a = builtin_newarray(length, pc);
2664 oa = builtin_anewarray(length, c);
2666 return (jobject) oa;
2671 /* JVM_NewMultiArray */
2673 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2676 java_handle_intarray_t *ia;
2682 java_handle_objectarray_t *a;
2684 TRACEJVMCALLS("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim);
2686 if (eltClass == NULL) {
2687 exceptions_throw_nullpointerexception();
2691 /* NegativeArraySizeException is checked in builtin_newarray. */
2693 c = LLNI_classinfo_unwrap(eltClass);
2695 /* XXX This is just a quick hack to get it working. */
2697 ia = (java_handle_intarray_t *) dim;
2699 length = array_length_get((java_handle_t *) ia);
2701 dims = MNEW(long, length);
2703 for (i = 0; i < length; i++) {
2704 value = LLNI_array_direct(ia, i);
2705 dims[i] = (long) value;
2708 /* Create an array-class if necessary. */
2710 if (class_is_primitive(c))
2711 ac = primitive_arrayclass_get_by_name(c->name);
2713 ac = class_array_of(c, true);
2718 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2724 /* JVM_InitializeSocketLibrary */
2726 jint JVM_InitializeSocketLibrary()
2728 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2736 jint JVM_Socket(jint domain, jint type, jint protocol)
2738 TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
2740 return system_socket(domain, type, protocol);
2744 /* JVM_SocketClose */
2746 jint JVM_SocketClose(jint fd)
2748 TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
2750 return system_close(fd);
2754 /* JVM_SocketShutdown */
2756 jint JVM_SocketShutdown(jint fd, jint howto)
2758 TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
2760 return system_shutdown(fd, howto);
2766 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2768 log_println("JVM_Recv: IMPLEMENT ME!");
2776 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2778 log_println("JVM_Send: IMPLEMENT ME!");
2786 jint JVM_Timeout(int fd, long timeout)
2788 log_println("JVM_Timeout: IMPLEMENT ME!");
2796 jint JVM_Listen(jint fd, jint count)
2798 TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
2800 return system_listen(fd, count);
2806 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2808 TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
2810 return system_connect(fd, him, len);
2816 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2818 log_println("JVM_Bind: IMPLEMENT ME!");
2826 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2828 TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
2830 return system_accept(fd, him, (socklen_t *) len);
2836 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2838 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2844 /* JVM_GetSockName */
2846 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2848 TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
2850 return system_getsockname(fd, him, (socklen_t *) len);
2856 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2858 log_println("JVM_SendTo: IMPLEMENT ME!");
2864 /* JVM_SocketAvailable */
2866 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2868 #if defined(FIONREAD)
2872 TRACEJVMCALLS("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes);
2876 result = ioctl(fd, FIONREAD, &bytes);
2885 # error FIONREAD not defined
2890 /* JVM_GetSockOpt */
2892 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2894 TRACEJVMCALLS("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen);
2896 return system_getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2900 /* JVM_SetSockOpt */
2902 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2904 TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
2906 return system_setsockopt(fd, level, optname, optval, optlen);
2910 /* JVM_GetHostName */
2912 int JVM_GetHostName(char *name, int namelen)
2914 TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
2916 return system_gethostname(name, namelen);
2920 /* JVM_GetHostByAddr */
2922 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2924 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2930 /* JVM_GetHostByName */
2932 struct hostent *JVM_GetHostByName(char* name)
2934 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2940 /* JVM_GetProtoByName */
2942 struct protoent *JVM_GetProtoByName(char* name)
2944 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2950 /* JVM_LoadLibrary */
2952 void *JVM_LoadLibrary(const char *name)
2956 TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
2958 u = utf_new_char(name);
2960 return native_library_open(u);
2964 /* JVM_UnloadLibrary */
2966 void JVM_UnloadLibrary(void* handle)
2968 TRACEJVMCALLS("JVM_UnloadLibrary(handle=%p)", handle);
2970 native_library_close(handle);
2974 /* JVM_FindLibraryEntry */
2976 void *JVM_FindLibraryEntry(void *handle, const char *name)
2980 TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
2982 symbol = lt_dlsym(handle, name);
2990 jboolean JVM_IsNaN(jdouble a)
2992 log_println("JVM_IsNaN: IMPLEMENT ME!");
2998 /* JVM_IsSupportedJNIVersion */
3000 jboolean JVM_IsSupportedJNIVersion(jint version)
3002 TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
3004 return jni_version_check(version);
3008 /* JVM_InternString */
3010 jstring JVM_InternString(JNIEnv *env, jstring str)
3012 TRACEJVMCALLS("JVM_InternString(env=%p, str=%p)", env, str);
3014 return (jstring) javastring_intern((java_handle_t *) str);
3018 /* JVM_RawMonitorCreate */
3020 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3024 TRACEJVMCALLS("JVM_RawMonitorCreate()");
3026 o = NEW(java_object_t);
3028 lock_init_object_lock(o);
3034 /* JVM_RawMonitorDestroy */
3036 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3038 TRACEJVMCALLS("JVM_RawMonitorDestroy(mon=%p)", mon);
3040 FREE(mon, java_object_t);
3044 /* JVM_RawMonitorEnter */
3046 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3048 TRACEJVMCALLS("JVM_RawMonitorEnter(mon=%p)", mon);
3050 (void) lock_monitor_enter((java_object_t *) mon);
3056 /* JVM_RawMonitorExit */
3058 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3060 TRACEJVMCALLS("JVM_RawMonitorExit(mon=%p)", mon);
3062 (void) lock_monitor_exit((java_object_t *) mon);
3066 /* JVM_SetPrimitiveFieldValues */
3068 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3070 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3074 /* JVM_GetPrimitiveFieldValues */
3076 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3078 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3082 /* JVM_AccessVMBooleanFlag */
3084 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3086 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3092 /* JVM_AccessVMIntFlag */
3094 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3096 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3102 /* JVM_VMBreakPoint */
3104 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3106 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3110 /* JVM_GetClassFields */
3112 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3114 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3120 /* JVM_GetClassMethods */
3122 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3124 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3130 /* JVM_GetClassConstructors */
3132 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3134 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3140 /* JVM_GetClassField */
3142 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3144 log_println("JVM_GetClassField: IMPLEMENT ME!");
3150 /* JVM_GetClassMethod */
3152 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3154 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3160 /* JVM_GetClassConstructor */
3162 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3164 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3170 /* JVM_NewInstance */
3172 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3174 log_println("JVM_NewInstance: IMPLEMENT ME!");
3182 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3184 log_println("JVM_GetField: IMPLEMENT ME!");
3190 /* JVM_GetPrimitiveField */
3192 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3196 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3206 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3208 log_println("JVM_SetField: IMPLEMENT ME!");
3212 /* JVM_SetPrimitiveField */
3214 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3216 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3220 /* JVM_InvokeMethod */
3222 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3224 TRACEJVMCALLS("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0);
3226 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
3230 /* JVM_NewInstanceFromConstructor */
3232 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
3234 TRACEJVMCALLS("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, c, args0);
3236 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
3240 /* JVM_SupportsCX8 */
3242 jboolean JVM_SupportsCX8()
3244 TRACEJVMCALLS("JVM_SupportsCX8()");
3254 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3256 log_println("JVM_CX8Field: IMPLEMENT ME!");
3262 /* JVM_GetAllThreads */
3264 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3266 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3272 /* JVM_DumpThreads */
3274 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3276 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3282 /* JVM_GetManagement */
3284 void *JVM_GetManagement(jint version)
3286 TRACEJVMCALLS("JVM_GetManagement(version=%d)", version);
3288 /* TODO We current don't support the management interface. */
3294 /* JVM_InitAgentProperties */
3296 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3298 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3304 /* JVM_GetEnclosingMethodInfo */
3306 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3310 java_handle_objectarray_t *oa;
3312 TRACEJVMCALLS("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass);
3314 c = LLNI_classinfo_unwrap(ofClass);
3316 if ((c == NULL) || class_is_primitive(c))
3319 m = class_get_enclosingmethod(c);
3324 oa = builtin_anewarray(3, class_java_lang_Object);
3329 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->class));
3330 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3331 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3333 return (jobjectArray) oa;
3337 /* JVM_GetThreadStateValues */
3339 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3341 java_handle_intarray_t *ia;
3343 TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3344 env, javaThreadState);
3346 /* If new thread states are added in future JDK and VM versions,
3347 this should check if the JDK version is compatible with thread
3348 states supported by the VM. Return NULL if not compatible.
3350 This function must map the VM java_lang_Thread::ThreadStatus
3351 to the Java thread state that the JDK supports. */
3353 switch (javaThreadState) {
3354 case THREAD_STATE_NEW:
3355 ia = builtin_newarray_int(1);
3360 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3363 case THREAD_STATE_RUNNABLE:
3364 ia = builtin_newarray_int(1);
3369 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3372 case THREAD_STATE_BLOCKED:
3373 ia = builtin_newarray_int(1);
3378 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3381 case THREAD_STATE_WAITING:
3382 ia = builtin_newarray_int(2);
3387 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3388 /* XXX Implement parked stuff. */
3389 /* array_intarray_element_set(ia, 1, PARKED); */
3392 case THREAD_STATE_TIMED_WAITING:
3393 ia = builtin_newarray_int(3);
3398 /* XXX Not sure about that one. */
3399 /* array_intarray_element_set(ia, 0, SLEEPING); */
3400 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3401 /* XXX Implement parked stuff. */
3402 /* array_intarray_element_set(ia, 2, PARKED); */
3405 case THREAD_STATE_TERMINATED:
3406 ia = builtin_newarray_int(1);
3411 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3415 /* Unknown state - probably incompatible JDK version */
3419 return (jintArray) ia;
3423 /* JVM_GetThreadStateNames */
3425 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3427 java_handle_intarray_t *ia;
3428 java_handle_objectarray_t *oa;
3431 TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3432 env, javaThreadState, values);
3434 ia = (java_handle_intarray_t *) values;
3436 /* If new thread states are added in future JDK and VM versions,
3437 this should check if the JDK version is compatible with thread
3438 states supported by the VM. Return NULL if not compatible.
3440 This function must map the VM java_lang_Thread::ThreadStatus
3441 to the Java thread state that the JDK supports. */
3443 if (values == NULL) {
3444 exceptions_throw_nullpointerexception();
3448 switch (javaThreadState) {
3449 case THREAD_STATE_NEW:
3450 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3452 oa = builtin_anewarray(1, class_java_lang_String);
3457 s = javastring_new(utf_new_char("NEW"));
3462 array_objectarray_element_set(oa, 0, s);
3465 case THREAD_STATE_RUNNABLE:
3466 oa = builtin_anewarray(1, class_java_lang_String);
3471 s = javastring_new(utf_new_char("RUNNABLE"));
3476 array_objectarray_element_set(oa, 0, s);
3479 case THREAD_STATE_BLOCKED:
3480 oa = builtin_anewarray(1, class_java_lang_String);
3485 s = javastring_new(utf_new_char("BLOCKED"));
3490 array_objectarray_element_set(oa, 0, s);
3493 case THREAD_STATE_WAITING:
3494 oa = builtin_anewarray(2, class_java_lang_String);
3499 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3500 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3505 array_objectarray_element_set(oa, 0, s);
3506 /* array_objectarray_element_set(oa, 1, s); */
3509 case THREAD_STATE_TIMED_WAITING:
3510 oa = builtin_anewarray(3, class_java_lang_String);
3515 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3516 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3517 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3522 /* array_objectarray_element_set(oa, 0, s); */
3523 array_objectarray_element_set(oa, 0, s);
3524 /* array_objectarray_element_set(oa, 2, s); */
3527 case THREAD_STATE_TERMINATED:
3528 oa = builtin_anewarray(1, class_java_lang_String);
3533 s = javastring_new(utf_new_char("TERMINATED"));
3538 array_objectarray_element_set(oa, 0, s);
3542 /* Unknown state - probably incompatible JDK version */
3546 return (jobjectArray) oa;
3550 /* JVM_GetVersionInfo */
3552 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3554 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3558 /* OS: JVM_RegisterSignal */
3560 void *JVM_RegisterSignal(jint sig, void *handler)
3562 functionptr newHandler;
3564 TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
3566 if (handler == (void *) 2)
3567 newHandler = (functionptr) signal_thread_handler;
3569 newHandler = (functionptr) (uintptr_t) handler;
3576 /* These signals are already used by the VM. */
3580 /* This signal is used by the VM to dump thread stacks unless
3581 ReduceSignalUsage is set, in which case the user is allowed
3582 to set his own _native_ handler for this signal; thus, in
3583 either case, we do not allow JVM_RegisterSignal to change
3593 signal_register_signal(sig, newHandler, 0);
3595 /* XXX Should return old handler. */
3601 /* OS: JVM_RaiseSignal */
3603 jboolean JVM_RaiseSignal(jint sig)
3605 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3611 /* OS: JVM_FindSignal */
3613 jint JVM_FindSignal(const char *name)
3615 TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
3617 #if defined(__LINUX__)
3618 if (strcmp(name, "HUP") == 0)
3621 if (strcmp(name, "INT") == 0)
3624 if (strcmp(name, "TERM") == 0)
3627 # error not implemented for this OS
3635 * These are local overrides for various environment variables in Emacs.
3636 * Please do not remove this and leave it at the end of the file, where
3637 * Emacs will automagically detect them.
3638 * ---------------------------------------------------------------------
3641 * indent-tabs-mode: t