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/threads-common.h"
73 #include "toolbox/logging.h"
74 #include "toolbox/list.h"
78 #if defined(ENABLE_ASSERTION)
79 #include "vm/assertion.h"
82 #include "vm/builtin.h"
83 #include "vm/exceptions.h"
84 #include "vm/global.h"
85 #include "vm/initialize.h"
86 #include "vm/package.h"
87 #include "vm/primitive.h"
88 #include "vm/properties.h"
89 #include "vm/resolve.h"
90 #include "vm/signallocal.h"
91 #include "vm/stringlocal.h"
94 #include "vm/jit/stacktrace.h"
96 #include "vmcore/classcache.h"
97 #include "vmcore/options.h"
98 #include "vmcore/system.h"
101 /* debugging macros ***********************************************************/
105 # define TRACEJVMCALLS(x) \
107 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
112 # define TRACEJVMCALLSVERBOSE(x) \
114 if (opt_TraceJVMCallsVerbose) { \
119 # define PRINTJVMWARNINGS(x)
121 /* if (opt_PrintJVMWarnings) { \ */
122 /* log_println x; \ */
128 # define TRACEJVMCALLS(x)
129 # define TRACEJVMCALLSVERBOSE(x)
130 # define PRINTJVMWARNINGS(x)
136 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
137 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
138 /* and build number (xx) */
139 unsigned int update_version : 8; /* Update release version (uu) */
140 unsigned int special_update_version : 8; /* Special update release version (c) */
141 unsigned int reserved1 : 16;
142 unsigned int reserved2;
144 /* The following bits represents JVM supports that JDK has dependency on.
145 * JDK can use these bits to determine which JVM version
146 * and support it has to maintain runtime compatibility.
148 * When a new bit is added in a minor or update release, make sure
149 * the new bit is also added in the main/baseline.
151 unsigned int is_attachable : 1;
159 * A structure used to a capture exception table entry in a Java method.
166 } JVM_ExceptionTableEntryType;
169 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
171 if ((intptr_t) count <= 0)
174 return vsnprintf(str, count, fmt, args);
178 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
184 len = jio_vsnprintf(str, count, fmt, ap);
191 int jio_fprintf(FILE* f, const char *fmt, ...)
193 log_println("jio_fprintf: IMPLEMENT ME!");
199 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
201 log_println("jio_vfprintf: IMPLEMENT ME!");
207 int jio_printf(const char *fmt, ...)
209 log_println("jio_printf: IMPLEMENT ME!");
215 /* JVM_GetInterfaceVersion */
217 jint JVM_GetInterfaceVersion()
219 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
221 #define JVM_INTERFACE_VERSION 4
223 return JVM_INTERFACE_VERSION;
227 /* JVM_CurrentTimeMillis */
229 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
231 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
233 return (jlong) builtin_currenttimemillis();
239 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
241 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
243 return (jlong) builtin_nanotime();
249 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
254 s = (java_handle_t *) src;
255 d = (java_handle_t *) dst;
257 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));
259 builtin_arraycopy(s, src_pos, d, dst_pos, length);
263 /* JVM_InitProperties */
265 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
269 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
271 h = (java_handle_t *) properties;
273 properties_system_add_all(h);
281 void JVM_Exit(jint code)
283 log_println("JVM_Exit: IMPLEMENT ME!");
289 void JVM_Halt(jint code)
291 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
298 /* JVM_OnExit(void (*func)) */
300 void JVM_OnExit(void (*func)(void))
302 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
310 TRACEJVMCALLS(("JVM_GC()"));
316 /* JVM_MaxObjectInspectionAge */
318 jlong JVM_MaxObjectInspectionAge(void)
320 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
326 /* JVM_TraceInstructions */
328 void JVM_TraceInstructions(jboolean on)
330 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
334 /* JVM_TraceMethodCalls */
336 void JVM_TraceMethodCalls(jboolean on)
338 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
342 /* JVM_TotalMemory */
344 jlong JVM_TotalMemory(void)
346 TRACEJVMCALLS(("JVM_TotalMemory()"));
348 return gc_get_heap_size();
354 jlong JVM_FreeMemory(void)
356 TRACEJVMCALLS(("JVM_FreeMemory()"));
358 return gc_get_free_bytes();
364 jlong JVM_MaxMemory(void)
366 TRACEJVMCALLS(("JVM_MaxMemory()"));
368 return gc_get_max_heap_size();
372 /* JVM_ActiveProcessorCount */
374 jint JVM_ActiveProcessorCount(void)
376 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
378 return system_processors_online();
382 /* JVM_FillInStackTrace */
384 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
386 java_lang_Throwable *o;
387 java_handle_bytearray_t *ba;
389 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
391 o = (java_lang_Throwable *) receiver;
393 ba = stacktrace_get_current();
398 LLNI_field_set_ref(o, backtrace, (java_lang_Object *) ba);
402 /* JVM_PrintStackTrace */
404 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
406 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
410 /* JVM_GetStackTraceDepth */
412 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
414 java_lang_Throwable *to;
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 to = (java_lang_Throwable *) throwable;
429 LLNI_field_get_ref(to, backtrace, o);
431 ba = (java_handle_bytearray_t *) o;
436 /* We need a critical section here as the stacktrace structure is
437 mapped onto a Java byte-array. */
441 st = (stacktrace_t *) LLNI_array_data(ba);
451 /* JVM_GetStackTraceElement */
453 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
455 java_lang_Throwable *to;
457 java_handle_bytearray_t *ba;
459 stacktrace_entry_t *ste;
463 java_lang_StackTraceElement *steo;
464 java_lang_String *declaringclass;
465 java_lang_String *filename;
468 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
470 to = (java_lang_Throwable *) throwable;
472 LLNI_field_get_ref(to, backtrace, o);
474 ba = (java_handle_bytearray_t *) o;
476 /* FIXME critical section */
478 st = (stacktrace_t *) LLNI_array_data(ba);
480 if ((index < 0) || (index >= st->length)) {
481 /* XXX This should be an IndexOutOfBoundsException (check this
484 exceptions_throw_arrayindexoutofboundsexception();
488 /* Get the stacktrace entry. */
490 ste = &(st->entries[index]);
492 /* Get the codeinfo, methodinfo and classinfo. */
498 /* allocate a new StackTraceElement */
500 steo = (java_lang_StackTraceElement *)
501 builtin_new(class_java_lang_StackTraceElement);
508 if (!(m->flags & ACC_NATIVE)) {
509 if (c->sourcefile != NULL)
510 filename = (java_lang_String *) javastring_new(c->sourcefile);
517 /* get line number */
519 if (m->flags & ACC_NATIVE) {
523 /* FIXME The linenumbertable_linenumber_for_pc could change
524 the methodinfo pointer when hitting an inlined method. */
526 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
527 linenumber = (linenumber == 0) ? -1 : linenumber;
530 /* get declaring class name */
532 declaringclass = _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(c));
534 /* fill the java.lang.StackTraceElement element */
536 /* FIXME critical section */
538 steo->declaringClass = declaringclass;
539 steo->methodName = (java_lang_String *) javastring_new(m->name);
540 steo->fileName = filename;
541 steo->lineNumber = linenumber;
543 return (jobject) steo;
549 jint JVM_IHashCode(JNIEnv* env, jobject handle)
551 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
553 return (jint) ((ptrint) handle);
557 /* JVM_MonitorWait */
559 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
561 #if defined(ENABLE_THREADS)
565 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
567 /* exceptions_throw_illegalargumentexception("argument out of range"); */
568 exceptions_throw_illegalargumentexception();
572 #if defined(ENABLE_THREADS)
573 o = (java_handle_t *) handle;
575 lock_wait_for_object(o, ms, 0);
580 /* JVM_MonitorNotify */
582 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
584 #if defined(ENABLE_THREADS)
588 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
590 #if defined(ENABLE_THREADS)
591 o = (java_handle_t *) handle;
593 lock_notify_object(o);
598 /* JVM_MonitorNotifyAll */
600 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
602 #if defined(ENABLE_THREADS)
606 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
608 #if defined(ENABLE_THREADS)
609 o = (java_handle_t *) handle;
611 lock_notify_all_object(o);
618 jobject JVM_Clone(JNIEnv* env, jobject handle)
620 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
622 return (jobject) builtin_clone(env, (java_handle_t *) handle);
626 /* JVM_InitializeCompiler */
628 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
630 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
634 /* JVM_IsSilentCompiler */
636 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
638 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
644 /* JVM_CompileClass */
646 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
648 log_println("JVM_CompileClass: IMPLEMENT ME!");
654 /* JVM_CompileClasses */
656 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
658 log_println("JVM_CompileClasses: IMPLEMENT ME!");
664 /* JVM_CompilerCommand */
666 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
668 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
674 /* JVM_EnableCompiler */
676 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
678 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
679 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
683 /* JVM_DisableCompiler */
685 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
687 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
688 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
692 /* JVM_GetLastErrorString */
694 jint JVM_GetLastErrorString(char *buf, int len)
720 char *JVM_NativePath(char *path)
722 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
724 /* XXX is this correct? */
730 /* JVM_GetCallerClass */
732 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
736 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
738 c = stacktrace_get_caller_class(depth);
744 /* JVM_FindPrimitiveClass */
746 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
751 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
754 c = primitive_class_get_by_name(u);
756 return (jclass) LLNI_classinfo_wrap(c);
760 /* JVM_ResolveClass */
762 void JVM_ResolveClass(JNIEnv* env, jclass cls)
764 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
765 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
769 /* JVM_FindClassFromClassLoader */
771 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
777 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
779 /* As of now, OpenJDK does not call this function with throwError
782 assert(throwError == false);
784 u = utf_new_char(name);
785 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
787 c = load_class_from_classloader(u, cl);
793 if (!(c->state & CLASS_INITIALIZED))
794 if (!initialize_class(c))
797 return (jclass) LLNI_classinfo_wrap(c);
801 /* JVM_FindClassFromClass */
803 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
805 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
811 /* JVM_DefineClass */
813 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
815 log_println("JVM_DefineClass: IMPLEMENT ME!");
821 /* JVM_DefineClassWithSource */
823 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
829 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
832 u = utf_new_char(name);
836 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
838 /* XXX do something with source */
840 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
842 return (jclass) LLNI_classinfo_wrap(c);
846 /* JVM_FindLoadedClass */
848 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
854 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
856 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
858 u = javastring_toutf((java_handle_t *) name, true);
859 c = classcache_lookup(cl, u);
861 return (jclass) LLNI_classinfo_wrap(c);
865 /* JVM_GetClassName */
867 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
869 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
871 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
875 /* JVM_GetClassInterfaces */
877 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
880 java_handle_objectarray_t *oa;
882 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
884 c = LLNI_classinfo_unwrap(cls);
886 oa = class_get_interfaces(c);
888 return (jobjectArray) oa;
892 /* JVM_GetClassLoader */
894 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
899 TRACEJVMCALLS(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
901 c = LLNI_classinfo_unwrap(cls);
902 cl = class_get_classloader(c);
908 /* JVM_IsInterface */
910 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
914 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
916 c = LLNI_classinfo_unwrap(cls);
918 return class_is_interface(c);
922 /* JVM_GetClassSigners */
924 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
926 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
932 /* JVM_SetClassSigners */
934 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
937 java_handle_objectarray_t *hoa;
939 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
941 c = LLNI_classinfo_unwrap(cls);
943 hoa = (java_handle_objectarray_t *) signers;
945 /* This call is ignored for primitive types and arrays. Signers
946 are only set once, ClassLoader.java, and thus shouldn't be
947 called with an array. Only the bootstrap loader creates
950 if (class_is_primitive(c) || class_is_array(c))
953 LLNI_classinfo_field_set(c, signers, hoa);
957 /* JVM_GetProtectionDomain */
959 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
963 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
965 c = LLNI_classinfo_unwrap(cls);
968 exceptions_throw_nullpointerexception();
972 /* Primitive types do not have a protection domain. */
974 if (class_is_primitive(c))
977 return (jobject) c->protectiondomain;
981 /* JVM_SetProtectionDomain */
983 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
985 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
989 /* JVM_DoPrivileged */
991 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
996 java_handle_t *result;
999 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
1001 h = (java_handle_t *) action;
1002 LLNI_class_get(h, c);
1004 if (action == NULL) {
1005 exceptions_throw_nullpointerexception();
1009 /* lookup run() method (throw no exceptions) */
1011 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1014 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1015 exceptions_throw_internalerror("No run method");
1019 /* XXX It seems something with a privileged stack needs to be done
1022 result = vm_call_method(m, h);
1024 e = exceptions_get_exception();
1027 if ( builtin_instanceof(e, class_java_lang_Exception) &&
1028 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
1029 exceptions_clear_exception();
1030 exceptions_throw_privilegedactionexception(e);
1036 return (jobject) result;
1040 /* JVM_GetInheritedAccessControlContext */
1042 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1044 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1050 /* JVM_GetStackAccessControlContext */
1052 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1054 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
1056 /* XXX All stuff I tested so far works without that function. At
1057 some point we have to implement it, but I disable the output
1058 for now to make IcedTea happy. */
1064 /* JVM_IsArrayClass */
1066 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1070 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1072 c = LLNI_classinfo_unwrap(cls);
1074 return class_is_array(c);
1078 /* JVM_IsPrimitiveClass */
1080 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1084 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1086 c = LLNI_classinfo_unwrap(cls);
1088 return class_is_primitive(c);
1092 /* JVM_GetComponentType */
1094 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1096 classinfo *component;
1099 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1101 c = LLNI_classinfo_unwrap(cls);
1103 component = class_get_componenttype(c);
1105 return (jclass) LLNI_classinfo_wrap(component);
1109 /* JVM_GetClassModifiers */
1111 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1116 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1118 c = LLNI_classinfo_unwrap(cls);
1120 flags = class_get_modifiers(c, false);
1126 /* JVM_GetDeclaredClasses */
1128 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1131 java_handle_objectarray_t *oa;
1133 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1135 c = LLNI_classinfo_unwrap(ofClass);
1137 oa = class_get_declaredclasses(c, false);
1139 return (jobjectArray) oa;
1143 /* JVM_GetDeclaringClass */
1145 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1150 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1152 c = LLNI_classinfo_unwrap(ofClass);
1154 dc = class_get_declaringclass(c);
1156 return (jclass) LLNI_classinfo_wrap(dc);
1160 /* JVM_GetClassSignature */
1162 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1168 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1170 c = LLNI_classinfo_unwrap(cls);
1172 /* Get the signature of the class. */
1174 u = class_get_signature(c);
1179 /* Convert UTF-string to a Java-string. */
1181 s = javastring_new(u);
1187 /* JVM_GetClassAnnotations */
1189 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1191 classinfo *c = NULL; /* classinfo for 'cls' */
1192 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1194 TRACEJVMCALLS(("JVM_GetClassAnnotations: cls=%p", cls));
1197 exceptions_throw_nullpointerexception();
1201 c = LLNI_classinfo_unwrap(cls);
1203 /* get annotations: */
1204 annotations = class_get_annotations(c);
1206 return (jbyteArray)annotations;
1210 /* JVM_GetFieldAnnotations */
1212 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1214 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1215 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1217 TRACEJVMCALLS(("JVM_GetFieldAnnotations: field=%p", field));
1219 if (field == NULL) {
1220 exceptions_throw_nullpointerexception();
1224 rf = (java_lang_reflect_Field*)field;
1226 LLNI_field_get_ref(rf, annotations, ba);
1228 return (jbyteArray)ba;
1232 /* JVM_GetMethodAnnotations */
1234 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1236 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1237 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1239 TRACEJVMCALLS(("JVM_GetMethodAnnotations: method=%p", method));
1241 if (method == NULL) {
1242 exceptions_throw_nullpointerexception();
1246 rm = (java_lang_reflect_Method*)method;
1248 LLNI_field_get_ref(rm, annotations, ba);
1250 return (jbyteArray)ba;
1254 /* JVM_GetMethodDefaultAnnotationValue */
1256 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1258 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1259 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1261 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue: method=%p", method));
1263 if (method == NULL) {
1264 exceptions_throw_nullpointerexception();
1268 rm = (java_lang_reflect_Method*)method;
1270 LLNI_field_get_ref(rm, annotationDefault, ba);
1272 return (jbyteArray)ba;
1276 /* JVM_GetMethodParameterAnnotations */
1278 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1280 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1281 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1283 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations: method=%p", method));
1285 if (method == NULL) {
1286 exceptions_throw_nullpointerexception();
1290 rm = (java_lang_reflect_Method*)method;
1292 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1294 return (jbyteArray)ba;
1298 /* JVM_GetClassDeclaredFields */
1300 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1302 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1304 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1308 /* JVM_GetClassDeclaredMethods */
1310 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1312 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1314 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1318 /* JVM_GetClassDeclaredConstructors */
1320 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1322 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1324 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1328 /* JVM_GetClassAccessFlags */
1330 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1334 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1336 c = LLNI_classinfo_unwrap(cls);
1338 /* Primitive type classes have the correct access flags. */
1340 return c->flags & ACC_CLASS_REFLECT_MASK;
1344 /* JVM_GetClassConstantPool */
1346 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1348 #if defined(ENABLE_ANNOTATIONS)
1349 sun_reflect_ConstantPool *constantPool = NULL;
1350 /* constant pool object for the class refered by 'cls' */
1351 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1352 /* constantPoolOop field of the constant pool object */
1354 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1357 (sun_reflect_ConstantPool*)native_new_and_init(
1358 class_sun_reflect_ConstantPool);
1360 if (constantPool == NULL) {
1365 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1367 return (jobject)constantPool;
1369 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1375 /* JVM_ConstantPoolGetSize */
1377 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1379 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1381 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1383 c = LLNI_classinfo_unwrap(jcpool);
1389 /* JVM_ConstantPoolGetClassAt */
1391 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1393 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1394 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1395 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1397 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1399 c = LLNI_classinfo_unwrap(jcpool);
1401 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1404 exceptions_throw_illegalargumentexception();
1408 result = resolve_classref_eager(ref);
1410 return (jclass) LLNI_classinfo_wrap(result);
1414 /* JVM_ConstantPoolGetClassAtIfLoaded */
1416 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1418 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1419 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1420 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1422 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1424 c = LLNI_classinfo_unwrap(jcpool);
1426 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1429 exceptions_throw_illegalargumentexception();
1433 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1437 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1441 return (jclass) LLNI_classinfo_wrap(result);
1445 /* JVM_ConstantPoolGetMethodAt */
1447 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1449 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1450 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1452 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1454 cls = LLNI_classinfo_unwrap(jcpool);
1455 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1458 exceptions_throw_illegalargumentexception();
1462 /* XXX: is that right? or do I have to use resolve_method_*? */
1463 return (jobject)reflect_method_new(ref->p.method);
1467 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1469 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1471 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1472 classinfo *c = NULL; /* resolved declaring class of the method */
1473 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1475 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1477 cls = LLNI_classinfo_unwrap(jcpool);
1478 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1481 exceptions_throw_illegalargumentexception();
1485 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1489 if (c == NULL || !(c->state & CLASS_LOADED)) {
1493 return (jobject)reflect_method_new(ref->p.method);
1497 /* JVM_ConstantPoolGetFieldAt */
1499 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1501 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1502 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1504 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1506 cls = LLNI_classinfo_unwrap(jcpool);
1507 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1510 exceptions_throw_illegalargumentexception();
1514 return (jobject)reflect_field_new(ref->p.field);
1518 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1520 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1522 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1523 classinfo *c; /* resolved declaring class for the field */
1524 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1526 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1528 cls = LLNI_classinfo_unwrap(jcpool);
1529 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1532 exceptions_throw_illegalargumentexception();
1536 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1540 if (c == NULL || !(c->state & CLASS_LOADED)) {
1544 return (jobject)reflect_field_new(ref->p.field);
1548 /* JVM_ConstantPoolGetMemberRefInfoAt */
1550 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1552 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1554 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1560 /* JVM_ConstantPoolGetIntAt */
1562 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1564 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1565 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1567 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1569 cls = LLNI_classinfo_unwrap(jcpool);
1570 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1573 exceptions_throw_illegalargumentexception();
1581 /* JVM_ConstantPoolGetLongAt */
1583 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1585 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1586 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1588 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1590 cls = LLNI_classinfo_unwrap(jcpool);
1591 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1594 exceptions_throw_illegalargumentexception();
1602 /* JVM_ConstantPoolGetFloatAt */
1604 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1606 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1607 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1609 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1611 cls = LLNI_classinfo_unwrap(jcpool);
1612 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1615 exceptions_throw_illegalargumentexception();
1623 /* JVM_ConstantPoolGetDoubleAt */
1625 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1627 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1628 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1630 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1632 cls = LLNI_classinfo_unwrap(jcpool);
1633 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1636 exceptions_throw_illegalargumentexception();
1644 /* JVM_ConstantPoolGetStringAt */
1646 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1648 utf *ref; /* utf object for the string in constant pool at index 'index' */
1649 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1651 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1653 cls = LLNI_classinfo_unwrap(jcpool);
1654 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1657 exceptions_throw_illegalargumentexception();
1661 /* XXX: I hope literalstring_new is the right Function. */
1662 return (jstring)literalstring_new(ref);
1666 /* JVM_ConstantPoolGetUTF8At */
1668 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1670 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1671 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1673 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1675 cls = LLNI_classinfo_unwrap(jcpool);
1676 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1679 exceptions_throw_illegalargumentexception();
1683 /* XXX: I hope literalstring_new is the right Function. */
1684 return (jstring)literalstring_new(ref);
1688 /* JVM_DesiredAssertionStatus */
1690 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1692 #if defined(ENABLE_ASSERTION)
1693 assertion_name_t *item;
1698 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1700 c = LLNI_classinfo_unwrap(cls);
1702 if (c->classloader == NULL) {
1703 status = (jboolean)assertion_system_enabled;
1706 status = (jboolean)assertion_user_enabled;
1709 if (list_assertion_names != NULL) {
1710 item = (assertion_name_t *)list_first(list_assertion_names);
1711 while (item != NULL) {
1712 name = utf_new_char(item->name);
1713 if (name == c->packagename) {
1714 status = (jboolean)item->enabled;
1716 else if (name == c->name) {
1717 status = (jboolean)item->enabled;
1720 item = (assertion_name_t *)list_next(list_assertion_names, item);
1726 return (jboolean)false;
1731 /* JVM_AssertionStatusDirectives */
1733 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1736 java_lang_AssertionStatusDirectives *o;
1737 java_handle_objectarray_t *classes;
1738 java_handle_objectarray_t *packages;
1739 java_booleanarray_t *classEnabled;
1740 java_booleanarray_t *packageEnabled;
1741 #if defined(ENABLE_ASSERTION)
1742 assertion_name_t *item;
1747 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1749 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1754 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1759 #if defined(ENABLE_ASSERTION)
1760 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1762 classes = builtin_anewarray(0, class_java_lang_Object);
1764 if (classes == NULL)
1767 #if defined(ENABLE_ASSERTION)
1768 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1770 packages = builtin_anewarray(0, class_java_lang_Object);
1772 if (packages == NULL)
1775 #if defined(ENABLE_ASSERTION)
1776 classEnabled = builtin_newarray_boolean(assertion_class_count);
1778 classEnabled = builtin_newarray_boolean(0);
1780 if (classEnabled == NULL)
1783 #if defined(ENABLE_ASSERTION)
1784 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1786 packageEnabled = builtin_newarray_boolean(0);
1788 if (packageEnabled == NULL)
1791 #if defined(ENABLE_ASSERTION)
1792 /* initialize arrays */
1794 if (list_assertion_names != NULL) {
1798 item = (assertion_name_t *)list_first(list_assertion_names);
1799 while (item != NULL) {
1800 js = javastring_new_from_ascii(item->name);
1805 if (item->package == false) {
1806 classes->data[i] = js;
1807 classEnabled->data[i] = (jboolean) item->enabled;
1811 packages->data[j] = js;
1812 packageEnabled->data[j] = (jboolean) item->enabled;
1816 item = (assertion_name_t *)list_next(list_assertion_names, item);
1821 /* set instance fields */
1823 o->classes = classes;
1824 o->packages = packages;
1825 o->classEnabled = classEnabled;
1826 o->packageEnabled = packageEnabled;
1832 /* JVM_GetClassNameUTF */
1834 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1836 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1842 /* JVM_GetClassCPTypes */
1844 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1846 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1850 /* JVM_GetClassCPEntriesCount */
1852 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1854 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1860 /* JVM_GetClassFieldsCount */
1862 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1864 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1870 /* JVM_GetClassMethodsCount */
1872 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1874 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1880 /* JVM_GetMethodIxExceptionIndexes */
1882 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1884 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1888 /* JVM_GetMethodIxExceptionsCount */
1890 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1892 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1898 /* JVM_GetMethodIxByteCode */
1900 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1902 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1906 /* JVM_GetMethodIxByteCodeLength */
1908 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1910 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1916 /* JVM_GetMethodIxExceptionTableEntry */
1918 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1920 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1924 /* JVM_GetMethodIxExceptionTableLength */
1926 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1928 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1934 /* JVM_GetMethodIxModifiers */
1936 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1938 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1944 /* JVM_GetFieldIxModifiers */
1946 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1948 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1954 /* JVM_GetMethodIxLocalsCount */
1956 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1958 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1964 /* JVM_GetMethodIxArgsSize */
1966 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1968 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1974 /* JVM_GetMethodIxMaxStack */
1976 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1978 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1984 /* JVM_IsConstructorIx */
1986 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1988 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1994 /* JVM_GetMethodIxNameUTF */
1996 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1998 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
2004 /* JVM_GetMethodIxSignatureUTF */
2006 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
2008 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
2014 /* JVM_GetCPFieldNameUTF */
2016 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2018 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
2024 /* JVM_GetCPMethodNameUTF */
2026 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2028 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
2034 /* JVM_GetCPMethodSignatureUTF */
2036 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2038 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
2044 /* JVM_GetCPFieldSignatureUTF */
2046 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2048 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2054 /* JVM_GetCPClassNameUTF */
2056 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2058 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2064 /* JVM_GetCPFieldClassNameUTF */
2066 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2068 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2074 /* JVM_GetCPMethodClassNameUTF */
2076 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2078 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2084 /* JVM_GetCPFieldModifiers */
2086 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2088 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2094 /* JVM_GetCPMethodModifiers */
2096 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2098 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2104 /* JVM_ReleaseUTF */
2106 void JVM_ReleaseUTF(const char *utf)
2108 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2112 /* JVM_IsSameClassPackage */
2114 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2116 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2124 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2127 * JVM I/O error codes
2129 #define JVM_EEXIST -100
2131 jint JVM_Open(const char *fname, jint flags, jint mode)
2135 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2137 result = system_open(fname, flags, mode);
2155 jint JVM_Close(jint fd)
2157 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2159 return system_close(fd);
2165 jint JVM_Read(jint fd, char *buf, jint nbytes)
2167 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2169 return system_read(fd, buf, nbytes);
2175 jint JVM_Write(jint fd, char *buf, jint nbytes)
2177 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2179 return system_write(fd, buf, nbytes);
2185 jint JVM_Available(jint fd, jlong *pbytes)
2187 #if defined(FIONREAD)
2191 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2195 result = ioctl(fd, FIONREAD, &bytes);
2204 # error FIONREAD not defined
2211 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2213 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2215 return (jlong) system_lseek(fd, (off_t) offset, whence);
2221 jint JVM_SetLength(jint fd, jlong length)
2223 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2225 return system_ftruncate(fd, length);
2231 jint JVM_Sync(jint fd)
2233 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2235 return system_fsync(fd);
2239 /* JVM_StartThread */
2241 void JVM_StartThread(JNIEnv* env, jobject jthread)
2243 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2245 threads_thread_start((java_handle_t *) jthread);
2249 /* JVM_StopThread */
2251 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2253 log_println("JVM_StopThread: IMPLEMENT ME!");
2257 /* JVM_IsThreadAlive */
2259 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2265 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2267 h = (java_handle_t *) jthread;
2268 t = thread_get_thread(h);
2270 /* The threadobject is null when a thread is created in Java. The
2271 priority is set later during startup. */
2276 result = threads_thread_is_alive(t);
2282 /* JVM_SuspendThread */
2284 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2286 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2290 /* JVM_ResumeThread */
2292 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2294 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2298 /* JVM_SetThreadPriority */
2300 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2305 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2307 h = (java_handle_t *) jthread;
2308 t = thread_get_thread(h);
2310 /* The threadobject is null when a thread is created in Java. The
2311 priority is set later during startup. */
2316 threads_set_thread_priority(t->tid, prio);
2322 void JVM_Yield(JNIEnv *env, jclass threadClass)
2324 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2332 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2334 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2336 threads_sleep(millis, 0);
2340 /* JVM_CurrentThread */
2342 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2346 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2348 o = threads_get_current_object();
2354 /* JVM_CountStackFrames */
2356 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2358 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2366 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2371 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2373 h = (java_handle_t *) jthread;
2374 t = thread_get_thread(h);
2379 threads_thread_interrupt(t);
2383 /* JVM_IsInterrupted */
2385 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2390 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2392 h = (java_handle_t *) jthread;
2393 t = thread_get_thread(h);
2395 /* XXX do something with clear_interrupted */
2397 return threads_thread_has_been_interrupted(t);
2403 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2408 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2410 h = (java_handle_t *) obj;
2413 exceptions_throw_nullpointerexception();
2417 result = lock_is_held_by_current_thread(h);
2423 /* JVM_DumpAllStacks */
2425 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2427 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2431 /* JVM_CurrentLoadedClass */
2433 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2435 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2441 /* JVM_CurrentClassLoader */
2443 jobject JVM_CurrentClassLoader(JNIEnv *env)
2445 /* XXX if a method in a class in a trusted loader is in a
2446 doPrivileged, return NULL */
2448 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2454 /* JVM_GetClassContext */
2456 jobjectArray JVM_GetClassContext(JNIEnv *env)
2458 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2460 return (jobjectArray) stacktrace_getClassContext();
2464 /* JVM_ClassDepth */
2466 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2468 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2474 /* JVM_ClassLoaderDepth */
2476 jint JVM_ClassLoaderDepth(JNIEnv *env)
2478 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2484 /* JVM_GetSystemPackage */
2486 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2492 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2494 /* s = package_find(name); */
2495 u = javastring_toutf((java_handle_t *) name, false);
2497 result = package_find(u);
2500 s = javastring_new(result);
2508 /* JVM_GetSystemPackages */
2510 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2512 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2518 /* JVM_AllocateNewObject */
2520 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2522 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2528 /* JVM_AllocateNewArray */
2530 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2532 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2538 /* JVM_LatestUserDefinedLoader */
2540 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2544 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2546 cl = stacktrace_first_nonnull_classloader();
2548 return (jobject) cl;
2552 /* JVM_LoadClass0 */
2554 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2556 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2562 /* JVM_GetArrayLength */
2564 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2568 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2570 a = (java_handle_t *) arr;
2572 return array_length_get(a);
2576 /* JVM_GetArrayElement */
2578 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2583 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2585 a = (java_handle_t *) arr;
2587 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2588 /* exceptions_throw_illegalargumentexception(); */
2592 o = array_element_get(a, index);
2598 /* JVM_GetPrimitiveArrayElement */
2600 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2604 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2612 /* JVM_SetArrayElement */
2614 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2617 java_handle_t *value;
2619 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2621 a = (java_handle_t *) arr;
2622 value = (java_handle_t *) val;
2624 array_element_set(a, index, value);
2628 /* JVM_SetPrimitiveArrayElement */
2630 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2632 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2638 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2643 java_handle_objectarray_t *oa;
2645 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2647 if (eltClass == NULL) {
2648 exceptions_throw_nullpointerexception();
2652 /* NegativeArraySizeException is checked in builtin_newarray. */
2654 c = LLNI_classinfo_unwrap(eltClass);
2656 /* Create primitive or object array. */
2658 if (class_is_primitive(c)) {
2659 pc = primitive_arrayclass_get_by_name(c->name);
2661 /* void arrays are not allowed. */
2664 exceptions_throw_illegalargumentexception();
2668 a = builtin_newarray(length, pc);
2673 oa = builtin_anewarray(length, c);
2675 return (jobject) oa;
2680 /* JVM_NewMultiArray */
2682 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2685 java_handle_intarray_t *ia;
2691 java_handle_objectarray_t *a;
2693 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2695 if (eltClass == NULL) {
2696 exceptions_throw_nullpointerexception();
2700 /* NegativeArraySizeException is checked in builtin_newarray. */
2702 c = LLNI_classinfo_unwrap(eltClass);
2704 ia = (java_handle_intarray_t *) dim;
2706 length = array_length_get((java_handle_t *) ia);
2708 /* We check here for exceptions thrown in array_length_get,
2709 otherwise these exceptions get overwritten by the following
2710 IllegalArgumentException. */
2715 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2716 exceptions_throw_illegalargumentexception();
2720 /* XXX This is just a quick hack to get it working. */
2722 dims = MNEW(long, length);
2724 for (i = 0; i < length; i++) {
2725 value = LLNI_array_direct(ia, i);
2726 dims[i] = (long) value;
2729 /* Create an array-class if necessary. */
2731 if (class_is_primitive(c))
2732 ac = primitive_arrayclass_get_by_name(c->name);
2734 ac = class_array_of(c, true);
2739 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2745 /* JVM_InitializeSocketLibrary */
2747 jint JVM_InitializeSocketLibrary()
2749 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2757 jint JVM_Socket(jint domain, jint type, jint protocol)
2759 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2761 return system_socket(domain, type, protocol);
2765 /* JVM_SocketClose */
2767 jint JVM_SocketClose(jint fd)
2769 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2771 return system_close(fd);
2775 /* JVM_SocketShutdown */
2777 jint JVM_SocketShutdown(jint fd, jint howto)
2779 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2781 return system_shutdown(fd, howto);
2787 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2789 log_println("JVM_Recv: IMPLEMENT ME!");
2797 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2799 log_println("JVM_Send: IMPLEMENT ME!");
2807 jint JVM_Timeout(int fd, long timeout)
2809 log_println("JVM_Timeout: IMPLEMENT ME!");
2817 jint JVM_Listen(jint fd, jint count)
2819 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2821 return system_listen(fd, count);
2827 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2829 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2831 return system_connect(fd, him, len);
2837 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2839 log_println("JVM_Bind: IMPLEMENT ME!");
2847 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2849 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2851 return system_accept(fd, him, (socklen_t *) len);
2857 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2859 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2865 /* JVM_GetSockName */
2867 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2869 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2871 return system_getsockname(fd, him, (socklen_t *) len);
2877 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2879 log_println("JVM_SendTo: IMPLEMENT ME!");
2885 /* JVM_SocketAvailable */
2887 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2889 #if defined(FIONREAD)
2893 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2897 result = ioctl(fd, FIONREAD, &bytes);
2906 # error FIONREAD not defined
2911 /* JVM_GetSockOpt */
2913 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2915 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2917 return system_getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2921 /* JVM_SetSockOpt */
2923 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2925 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2927 return system_setsockopt(fd, level, optname, optval, optlen);
2931 /* JVM_GetHostName */
2933 int JVM_GetHostName(char *name, int namelen)
2935 TRACEJVMCALLS(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2937 return system_gethostname(name, namelen);
2941 /* JVM_GetHostByAddr */
2943 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2945 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2951 /* JVM_GetHostByName */
2953 struct hostent *JVM_GetHostByName(char* name)
2955 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2961 /* JVM_GetProtoByName */
2963 struct protoent *JVM_GetProtoByName(char* name)
2965 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2971 /* JVM_LoadLibrary */
2973 void *JVM_LoadLibrary(const char *name)
2977 TRACEJVMCALLS(("JVM_LoadLibrary(name=%s)", name));
2979 u = utf_new_char(name);
2981 return native_library_open(u);
2985 /* JVM_UnloadLibrary */
2987 void JVM_UnloadLibrary(void* handle)
2989 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2991 native_library_close(handle);
2995 /* JVM_FindLibraryEntry */
2997 void *JVM_FindLibraryEntry(void *handle, const char *name)
3001 TRACEJVMCALLS(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
3003 symbol = lt_dlsym(handle, name);
3011 jboolean JVM_IsNaN(jdouble a)
3013 log_println("JVM_IsNaN: IMPLEMENT ME!");
3019 /* JVM_IsSupportedJNIVersion */
3021 jboolean JVM_IsSupportedJNIVersion(jint version)
3023 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
3025 return jni_version_check(version);
3029 /* JVM_InternString */
3031 jstring JVM_InternString(JNIEnv *env, jstring str)
3033 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
3035 return (jstring) javastring_intern((java_handle_t *) str);
3039 /* JVM_RawMonitorCreate */
3041 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3045 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3047 o = NEW(java_object_t);
3049 lock_init_object_lock(o);
3055 /* JVM_RawMonitorDestroy */
3057 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3059 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3061 FREE(mon, java_object_t);
3065 /* JVM_RawMonitorEnter */
3067 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3069 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3071 (void) lock_monitor_enter((java_object_t *) mon);
3077 /* JVM_RawMonitorExit */
3079 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3081 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3083 (void) lock_monitor_exit((java_object_t *) mon);
3087 /* JVM_SetPrimitiveFieldValues */
3089 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3091 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3095 /* JVM_GetPrimitiveFieldValues */
3097 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3099 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3103 /* JVM_AccessVMBooleanFlag */
3105 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3107 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3113 /* JVM_AccessVMIntFlag */
3115 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3117 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3123 /* JVM_VMBreakPoint */
3125 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3127 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3131 /* JVM_GetClassFields */
3133 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3135 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3141 /* JVM_GetClassMethods */
3143 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3145 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3151 /* JVM_GetClassConstructors */
3153 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3155 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3161 /* JVM_GetClassField */
3163 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3165 log_println("JVM_GetClassField: IMPLEMENT ME!");
3171 /* JVM_GetClassMethod */
3173 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3175 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3181 /* JVM_GetClassConstructor */
3183 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3185 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3191 /* JVM_NewInstance */
3193 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3195 log_println("JVM_NewInstance: IMPLEMENT ME!");
3203 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3205 log_println("JVM_GetField: IMPLEMENT ME!");
3211 /* JVM_GetPrimitiveField */
3213 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3217 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3227 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3229 log_println("JVM_SetField: IMPLEMENT ME!");
3233 /* JVM_SetPrimitiveField */
3235 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3237 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3241 /* JVM_InvokeMethod */
3243 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3245 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3247 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
3251 /* JVM_NewInstanceFromConstructor */
3253 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
3255 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, c, args0));
3257 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
3261 /* JVM_SupportsCX8 */
3263 jboolean JVM_SupportsCX8()
3265 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3275 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3277 log_println("JVM_CX8Field: IMPLEMENT ME!");
3283 /* JVM_GetAllThreads */
3285 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3287 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3293 /* JVM_DumpThreads */
3295 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3297 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3303 /* JVM_GetManagement */
3305 void *JVM_GetManagement(jint version)
3307 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3309 /* TODO We current don't support the management interface. */
3315 /* JVM_InitAgentProperties */
3317 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3319 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3325 /* JVM_GetEnclosingMethodInfo */
3327 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3331 java_handle_objectarray_t *oa;
3333 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3335 c = LLNI_classinfo_unwrap(ofClass);
3337 if ((c == NULL) || class_is_primitive(c))
3340 m = class_get_enclosingmethod(c);
3345 oa = builtin_anewarray(3, class_java_lang_Object);
3350 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->class));
3351 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3352 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3354 return (jobjectArray) oa;
3358 /* JVM_GetThreadStateValues */
3360 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3362 java_handle_intarray_t *ia;
3364 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3365 env, javaThreadState));
3367 /* If new thread states are added in future JDK and VM versions,
3368 this should check if the JDK version is compatible with thread
3369 states supported by the VM. Return NULL if not compatible.
3371 This function must map the VM java_lang_Thread::ThreadStatus
3372 to the Java thread state that the JDK supports. */
3374 switch (javaThreadState) {
3375 case THREAD_STATE_NEW:
3376 ia = builtin_newarray_int(1);
3381 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3384 case THREAD_STATE_RUNNABLE:
3385 ia = builtin_newarray_int(1);
3390 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3393 case THREAD_STATE_BLOCKED:
3394 ia = builtin_newarray_int(1);
3399 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3402 case THREAD_STATE_WAITING:
3403 ia = builtin_newarray_int(2);
3408 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3409 /* XXX Implement parked stuff. */
3410 /* array_intarray_element_set(ia, 1, PARKED); */
3413 case THREAD_STATE_TIMED_WAITING:
3414 ia = builtin_newarray_int(3);
3419 /* XXX Not sure about that one. */
3420 /* array_intarray_element_set(ia, 0, SLEEPING); */
3421 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3422 /* XXX Implement parked stuff. */
3423 /* array_intarray_element_set(ia, 2, PARKED); */
3426 case THREAD_STATE_TERMINATED:
3427 ia = builtin_newarray_int(1);
3432 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3436 /* Unknown state - probably incompatible JDK version */
3440 return (jintArray) ia;
3444 /* JVM_GetThreadStateNames */
3446 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3448 java_handle_intarray_t *ia;
3449 java_handle_objectarray_t *oa;
3452 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3453 env, javaThreadState, values));
3455 ia = (java_handle_intarray_t *) values;
3457 /* If new thread states are added in future JDK and VM versions,
3458 this should check if the JDK version is compatible with thread
3459 states supported by the VM. Return NULL if not compatible.
3461 This function must map the VM java_lang_Thread::ThreadStatus
3462 to the Java thread state that the JDK supports. */
3464 if (values == NULL) {
3465 exceptions_throw_nullpointerexception();
3469 switch (javaThreadState) {
3470 case THREAD_STATE_NEW:
3471 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3473 oa = builtin_anewarray(1, class_java_lang_String);
3478 s = javastring_new(utf_new_char("NEW"));
3483 array_objectarray_element_set(oa, 0, s);
3486 case THREAD_STATE_RUNNABLE:
3487 oa = builtin_anewarray(1, class_java_lang_String);
3492 s = javastring_new(utf_new_char("RUNNABLE"));
3497 array_objectarray_element_set(oa, 0, s);
3500 case THREAD_STATE_BLOCKED:
3501 oa = builtin_anewarray(1, class_java_lang_String);
3506 s = javastring_new(utf_new_char("BLOCKED"));
3511 array_objectarray_element_set(oa, 0, s);
3514 case THREAD_STATE_WAITING:
3515 oa = builtin_anewarray(2, class_java_lang_String);
3520 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3521 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3526 array_objectarray_element_set(oa, 0, s);
3527 /* array_objectarray_element_set(oa, 1, s); */
3530 case THREAD_STATE_TIMED_WAITING:
3531 oa = builtin_anewarray(3, class_java_lang_String);
3536 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3537 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3538 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3543 /* array_objectarray_element_set(oa, 0, s); */
3544 array_objectarray_element_set(oa, 0, s);
3545 /* array_objectarray_element_set(oa, 2, s); */
3548 case THREAD_STATE_TERMINATED:
3549 oa = builtin_anewarray(1, class_java_lang_String);
3554 s = javastring_new(utf_new_char("TERMINATED"));
3559 array_objectarray_element_set(oa, 0, s);
3563 /* Unknown state - probably incompatible JDK version */
3567 return (jobjectArray) oa;
3571 /* JVM_GetVersionInfo */
3573 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3575 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3579 /* OS: JVM_RegisterSignal */
3581 void *JVM_RegisterSignal(jint sig, void *handler)
3583 functionptr newHandler;
3585 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3587 if (handler == (void *) 2)
3588 newHandler = (functionptr) signal_thread_handler;
3590 newHandler = (functionptr) (uintptr_t) handler;
3597 /* These signals are already used by the VM. */
3601 /* This signal is used by the VM to dump thread stacks unless
3602 ReduceSignalUsage is set, in which case the user is allowed
3603 to set his own _native_ handler for this signal; thus, in
3604 either case, we do not allow JVM_RegisterSignal to change
3614 signal_register_signal(sig, newHandler, 0);
3616 /* XXX Should return old handler. */
3622 /* OS: JVM_RaiseSignal */
3624 jboolean JVM_RaiseSignal(jint sig)
3626 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3632 /* OS: JVM_FindSignal */
3634 jint JVM_FindSignal(const char *name)
3636 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3638 #if defined(__LINUX__)
3639 if (strcmp(name, "HUP") == 0)
3642 if (strcmp(name, "INT") == 0)
3645 if (strcmp(name, "TERM") == 0)
3648 # error not implemented for this OS
3656 * These are local overrides for various environment variables in Emacs.
3657 * Please do not remove this and leave it at the end of the file, where
3658 * Emacs will automagically detect them.
3659 * ---------------------------------------------------------------------
3662 * indent-tabs-mode: t