1 /* src/native/vm/sun/jvm.c - HotSpot JVM interface functions
3 Copyright (C) 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
41 #if defined(HAVE_SYS_IOCTL_H)
42 #define BSD_COMP /* Get FIONREAD on Solaris2 */
43 #include <sys/ioctl.h>
46 #include <sys/socket.h>
48 #include <sys/types.h>
52 #include "mm/memory.h"
54 #include "native/jni.h"
55 #include "native/llni.h"
56 #include "native/native.h"
58 #include "native/include/java_lang_AssertionStatusDirectives.h"
59 #include "native/include/java_lang_String.h" /* required by j.l.CL */
60 #include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
61 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
62 #include "native/include/java_lang_StackTraceElement.h"
63 #include "native/include/java_lang_Throwable.h"
64 #include "native/include/java_security_ProtectionDomain.h"
65 #include "native/include/java_lang_Integer.h"
66 #include "native/include/java_lang_Long.h"
67 #include "native/include/java_lang_Short.h"
68 #include "native/include/java_lang_Byte.h"
69 #include "native/include/java_lang_Character.h"
70 #include "native/include/java_lang_Boolean.h"
71 #include "native/include/java_lang_Float.h"
72 #include "native/include/java_lang_Double.h"
74 #if defined(ENABLE_ANNOTATIONS)
75 #include "native/include/sun_reflect_ConstantPool.h"
78 #include "native/vm/java_lang_Class.h"
79 #include "native/vm/java_lang_ClassLoader.h"
80 #include "native/vm/java_lang_Runtime.h"
81 #include "native/vm/java_lang_Thread.h"
82 #include "native/vm/java_lang_reflect_Constructor.h"
83 #include "native/vm/java_lang_reflect_Method.h"
84 #include "native/vm/reflect.h"
86 #include "threads/lock-common.h"
87 #include "threads/threads-common.h"
89 #include "toolbox/logging.h"
90 #include "toolbox/list.h"
94 #if defined(ENABLE_ASSERTION)
95 #include "vm/assertion.h"
98 #include "vm/builtin.h"
99 #include "vm/exceptions.h"
100 #include "vm/global.h"
101 #include "vm/initialize.h"
102 #include "vm/package.h"
103 #include "vm/primitive.h"
104 #include "vm/properties.h"
105 #include "vm/resolve.h"
106 #include "vm/signallocal.h"
107 #include "vm/stringlocal.h"
110 #include "vm/jit/stacktrace.h"
112 #include "vmcore/classcache.h"
113 #include "vmcore/options.h"
114 #include "vmcore/system.h"
117 /* debugging macros ***********************************************************/
121 # define TRACEJVMCALLS(...) \
123 if (opt_TraceJVMCalls) { \
124 log_println(__VA_ARGS__); \
128 # define PRINTJVMWARNINGS(...)
130 /* if (opt_PrintJVMWarnings) { \ */
131 /* log_println(__VA_ARGS__); \ */
137 # define TRACEJVMCALLS(...)
138 # define PRINTJVMWARNINGS(...)
144 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
145 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
146 /* and build number (xx) */
147 unsigned int update_version : 8; /* Update release version (uu) */
148 unsigned int special_update_version : 8; /* Special update release version (c) */
149 unsigned int reserved1 : 16;
150 unsigned int reserved2;
152 /* The following bits represents JVM supports that JDK has dependency on.
153 * JDK can use these bits to determine which JVM version
154 * and support it has to maintain runtime compatibility.
156 * When a new bit is added in a minor or update release, make sure
157 * the new bit is also added in the main/baseline.
159 unsigned int is_attachable : 1;
167 * A structure used to a capture exception table entry in a Java method.
174 } JVM_ExceptionTableEntryType;
177 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
179 if ((intptr_t) count <= 0)
182 return vsnprintf(str, count, fmt, args);
186 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
192 len = jio_vsnprintf(str, count, fmt, ap);
199 int jio_fprintf(FILE* f, const char *fmt, ...)
201 log_println("jio_fprintf: IMPLEMENT ME!");
205 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
207 log_println("jio_vfprintf: IMPLEMENT ME!");
211 int jio_printf(const char *fmt, ...)
213 log_println("jio_printf: IMPLEMENT ME!");
217 /* JVM_GetInterfaceVersion */
219 jint JVM_GetInterfaceVersion()
221 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
223 #define JVM_INTERFACE_VERSION 4
225 return JVM_INTERFACE_VERSION;
229 /* JVM_CurrentTimeMillis */
231 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
234 log_println("JVM_CurrentTimeMillis");
236 return (jlong) builtin_currenttimemillis();
242 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
245 log_println("JVM_NanoTime");
247 return (jlong) builtin_nanotime();
253 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
258 s = (java_handle_t *) src;
259 d = (java_handle_t *) dst;
262 log_println("JVM_ArrayCopy: src=%p, src_pos=%d, dst=%p, dst_pos=%d, length=%d", src, src_pos, dst, dst_pos, length);
265 builtin_arraycopy(s, src_pos, d, dst_pos, length);
269 /* JVM_InitProperties */
271 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
275 TRACEJVMCALLS("JVM_InitProperties(env=%p, properties=%p)", env, properties);
277 h = (java_handle_t *) properties;
279 properties_system_add_all(h);
287 void JVM_Exit(jint code)
289 log_println("JVM_Exit: IMPLEMENT ME!");
295 void JVM_Halt(jint code)
298 log_println("JVM_Halt: code=%d", code);
305 /* JVM_OnExit(void (*func)) */
307 void JVM_OnExit(void (*func)(void))
309 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
317 TRACEJVMCALLS("JVM_GC()");
323 /* JVM_MaxObjectInspectionAge */
325 jlong JVM_MaxObjectInspectionAge(void)
327 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
331 /* JVM_TraceInstructions */
333 void JVM_TraceInstructions(jboolean on)
335 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
339 /* JVM_TraceMethodCalls */
341 void JVM_TraceMethodCalls(jboolean on)
343 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
347 /* JVM_TotalMemory */
349 jlong JVM_TotalMemory(void)
351 TRACEJVMCALLS("JVM_TotalMemory()");
353 return gc_get_heap_size();
359 jlong JVM_FreeMemory(void)
361 TRACEJVMCALLS("JVM_FreeMemory()");
363 return gc_get_free_bytes();
369 jlong JVM_MaxMemory(void)
371 TRACEJVMCALLS("JVM_MaxMemory()");
373 return gc_get_max_heap_size();
377 /* JVM_ActiveProcessorCount */
379 jint JVM_ActiveProcessorCount(void)
381 TRACEJVMCALLS("JVM_ActiveProcessorCount()");
383 return system_processors_online();
387 /* JVM_FillInStackTrace */
389 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
391 java_lang_Throwable *o;
392 java_handle_bytearray_t *ba;
394 TRACEJVMCALLS("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver);
396 o = (java_lang_Throwable *) receiver;
398 ba = stacktrace_get();
403 LLNI_field_set_ref(o, backtrace, ba);
407 /* JVM_PrintStackTrace */
409 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
411 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
415 /* JVM_GetStackTraceDepth */
417 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
419 java_lang_Throwable *t;
420 java_handle_bytearray_t *ba;
424 TRACEJVMCALLS("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable);
426 if (throwable == NULL) {
427 exceptions_throw_nullpointerexception();
431 t = (java_lang_Throwable *) throwable;
433 LLNI_field_get_ref(t, backtrace, ba);
438 /* We need a critical section here as the stacktrace structure is
439 mapped onto a Java byte-array. */
443 st = (stacktrace_t *) LLNI_array_data(ba);
453 /* JVM_GetStackTraceElement */
455 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
457 java_lang_Throwable *t;
458 java_handle_bytearray_t *ba;
460 stacktrace_entry_t *ste;
464 java_lang_StackTraceElement *o;
465 java_lang_String *declaringclass;
466 java_lang_String *filename;
469 TRACEJVMCALLS("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index);
471 t = (java_lang_Throwable *) throwable;
473 LLNI_field_get_ref(t, backtrace, ba);
475 /* FIXME critical section */
477 st = (stacktrace_t *) LLNI_array_data(ba);
479 if ((index < 0) || (index >= st->length)) {
480 /* XXX This should be an IndexOutOfBoundsException (check this
483 exceptions_throw_arrayindexoutofboundsexception();
487 /* Get the stacktrace entry. */
489 ste = &(st->entries[index]);
491 /* Get the codeinfo, methodinfo and classinfo. */
497 /* allocate a new StackTraceElement */
499 o = (java_lang_StackTraceElement *)
500 builtin_new(class_java_lang_StackTraceElement);
507 if (!(m->flags & ACC_NATIVE)) {
508 if (c->sourcefile != NULL)
509 filename = (java_lang_String *) javastring_new(c->sourcefile);
516 /* get line number */
518 if (m->flags & ACC_NATIVE) {
522 /* FIXME The linenumbertable_linenumber_for_pc could change
523 the methodinfo pointer when hitting an inlined method. */
525 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
526 linenumber = (linenumber == 0) ? -1 : linenumber;
529 /* get declaring class name */
531 declaringclass = _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(c));
533 /* fill the java.lang.StackTraceElement element */
535 /* FIXME critical section */
537 o->declaringClass = declaringclass;
538 o->methodName = (java_lang_String *) javastring_new(m->name);
539 o->fileName = filename;
540 o->lineNumber = linenumber;
548 jint JVM_IHashCode(JNIEnv* env, jobject handle)
550 TRACEJVMCALLS("JVM_IHashCode(env=%p, jobject=%p)", env, handle);
552 return (jint) ((ptrint) handle);
556 /* JVM_MonitorWait */
558 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
560 #if defined(ENABLE_THREADS)
564 TRACEJVMCALLS("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms);
566 /* exceptions_throw_illegalargumentexception("argument out of range"); */
567 exceptions_throw_illegalargumentexception();
571 #if defined(ENABLE_THREADS)
572 o = (java_handle_t *) handle;
574 lock_wait_for_object(o, ms, 0);
579 /* JVM_MonitorNotify */
581 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
583 #if defined(ENABLE_THREADS)
587 TRACEJVMCALLS("JVM_MonitorNotify(env=%p, handle=%p)", env, handle);
589 #if defined(ENABLE_THREADS)
590 o = (java_handle_t *) handle;
592 lock_notify_object(o);
597 /* JVM_MonitorNotifyAll */
599 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
601 #if defined(ENABLE_THREADS)
605 TRACEJVMCALLS("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle);
607 #if defined(ENABLE_THREADS)
608 o = (java_handle_t *) handle;
610 lock_notify_all_object(o);
617 jobject JVM_Clone(JNIEnv* env, jobject handle)
620 log_println("JVM_Clone: handle=%p", 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!");
642 /* JVM_CompileClass */
644 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
646 log_println("JVM_CompileClass: IMPLEMENT ME!");
650 /* JVM_CompileClasses */
652 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
654 log_println("JVM_CompileClasses: IMPLEMENT ME!");
658 /* JVM_CompilerCommand */
660 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
662 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
666 /* JVM_EnableCompiler */
668 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
670 TRACEJVMCALLS("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls);
671 PRINTJVMWARNINGS("JVM_EnableCompiler not supported");
675 /* JVM_DisableCompiler */
677 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
679 TRACEJVMCALLS("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls);
680 PRINTJVMWARNINGS("JVM_DisableCompiler not supported");
684 /* JVM_GetLastErrorString */
686 jint JVM_GetLastErrorString(char *buf, int len)
712 char *JVM_NativePath(char *path)
714 TRACEJVMCALLS("JVM_NativePath(path=%s)", path);
716 /* XXX is this correct? */
722 /* JVM_GetCallerClass */
724 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
726 java_handle_objectarray_t *oa;
728 TRACEJVMCALLS("JVM_GetCallerClass(env=%p, depth=%d)", env, depth);
730 oa = stacktrace_getClassContext();
735 if (oa->header.size < depth)
738 return (jclass) oa->data[depth - 1];
743 /* JVM_FindPrimitiveClass */
745 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
750 TRACEJVMCALLS("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s);
753 c = primitive_class_get_by_name(u);
755 return (jclass) LLNI_classinfo_wrap(c);
759 /* JVM_ResolveClass */
761 void JVM_ResolveClass(JNIEnv* env, jclass cls)
763 TRACEJVMCALLS("JVM_ResolveClass(env=%p, cls=%p)", env, cls);
764 PRINTJVMWARNINGS("JVM_ResolveClass not implemented");
768 /* JVM_FindClassFromClassLoader */
770 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
776 TRACEJVMCALLS("JVM_FindClassFromClassLoader: name=%s, init=%d, loader=%p, throwError=%d", name, init, loader, throwError);
778 u = utf_new_char(name);
779 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
781 c = load_class_from_classloader(u, cl);
787 if (!(c->state & CLASS_INITIALIZED))
788 if (!initialize_class(c))
791 return (jclass) LLNI_classinfo_wrap(c);
795 /* JVM_FindClassFromClass */
797 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
799 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
803 /* JVM_DefineClass */
805 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
807 log_println("JVM_DefineClass: IMPLEMENT ME!");
811 /* JVM_DefineClassWithSource */
813 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
819 TRACEJVMCALLS("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source);
822 u = utf_new_char(name);
826 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
828 /* XXX do something with source */
830 c = class_define(u, cl, len, (const uint8_t *) buf, (java_handle_t *) pd);
832 return (jclass) LLNI_classinfo_wrap(c);
836 /* JVM_FindLoadedClass */
838 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
844 TRACEJVMCALLS("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name);
846 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
848 u = javastring_toutf((java_handle_t *) name, true);
849 c = classcache_lookup(cl, u);
851 return (jclass) LLNI_classinfo_wrap(c);
855 /* JVM_GetClassName */
857 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
860 log_println("JVM_GetClassName: cls=%p", cls);
862 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
866 /* JVM_GetClassInterfaces */
868 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
871 java_handle_objectarray_t *oa;
873 TRACEJVMCALLS("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls);
875 c = LLNI_classinfo_unwrap(cls);
877 oa = class_get_interfaces(c);
879 return (jobjectArray) oa;
883 /* JVM_GetClassLoader */
885 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
890 TRACEJVMCALLS("JVM_GetClassLoader(env=%p, cls=%p)", env, cls);
892 c = LLNI_classinfo_unwrap(cls);
893 cl = class_get_classloader(c);
899 /* JVM_IsInterface */
901 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
906 log_println("JVM_IsInterface: cls=%p", cls);
909 c = LLNI_classinfo_unwrap(cls);
911 return class_is_interface(c);
915 /* JVM_GetClassSigners */
917 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
919 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
923 /* JVM_SetClassSigners */
925 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
928 java_handle_objectarray_t *hoa;
930 TRACEJVMCALLS("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers);
932 c = LLNI_classinfo_unwrap(cls);
934 hoa = (java_handle_objectarray_t *) signers;
936 /* This call is ignored for primitive types and arrays. Signers
937 are only set once, ClassLoader.java, and thus shouldn't be
938 called with an array. Only the bootstrap loader creates
941 if (class_is_primitive(c) || class_is_array(c))
944 LLNI_classinfo_field_set(c, signers, hoa);
948 /* JVM_GetProtectionDomain */
950 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
954 TRACEJVMCALLS("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls);
956 c = LLNI_classinfo_unwrap(cls);
959 exceptions_throw_nullpointerexception();
963 /* Primitive types do not have a protection domain. */
965 if (class_is_primitive(c))
968 return (jobject) c->protectiondomain;
972 /* JVM_SetProtectionDomain */
974 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
976 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
980 /* JVM_DoPrivileged */
982 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
987 java_handle_t *result;
991 log_println("JVM_DoPrivileged: action=%p, context=%p, wrapException=%d", action, context, wrapException);
994 o = (java_handle_t *) action;
997 if (action == NULL) {
998 exceptions_throw_nullpointerexception();
1002 /* lookup run() method (throw no exceptions) */
1004 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1007 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1008 exceptions_throw_internalerror("No run method");
1012 /* XXX It seems something with a privileged stack needs to be done
1015 result = vm_call_method(m, o);
1017 e = exceptions_get_and_clear_exception();
1020 exceptions_throw_privilegedactionexception(e);
1024 return (jobject) result;
1028 /* JVM_GetInheritedAccessControlContext */
1030 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1032 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1036 /* JVM_GetStackAccessControlContext */
1038 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1040 TRACEJVMCALLS("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls);
1042 /* XXX All stuff I tested so far works without that function. At
1043 some point we have to implement it, but I disable the output
1044 for now to make IcedTea happy. */
1050 /* JVM_IsArrayClass */
1052 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1055 log_println("JVM_IsArrayClass: cls=%p", cls);
1057 return class_is_array(LLNI_classinfo_unwrap(cls));
1061 /* JVM_IsPrimitiveClass */
1063 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1067 c = LLNI_classinfo_unwrap(cls);
1070 log_println("JVM_IsPrimitiveClass(cls=%p)", cls);
1073 return class_is_primitive(c);
1077 /* JVM_GetComponentType */
1079 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1081 classinfo *component;
1084 TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
1086 c = LLNI_classinfo_unwrap(cls);
1088 component = class_get_componenttype(c);
1090 return (jclass) LLNI_classinfo_wrap(component);
1094 /* JVM_GetClassModifiers */
1096 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1101 TRACEJVMCALLS("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls);
1103 c = LLNI_classinfo_unwrap(cls);
1105 flags = class_get_modifiers(c, false);
1111 /* JVM_GetDeclaredClasses */
1113 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1116 java_handle_objectarray_t *oa;
1118 TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
1120 c = LLNI_classinfo_unwrap(ofClass);
1122 oa = class_get_declaredclasses(c, false);
1124 return (jobjectArray) oa;
1128 /* JVM_GetDeclaringClass */
1130 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1135 TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
1137 c = LLNI_classinfo_unwrap(ofClass);
1139 dc = class_get_declaringclass(c);
1141 return (jclass) LLNI_classinfo_wrap(dc);
1145 /* JVM_GetClassSignature */
1147 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1153 TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
1155 c = LLNI_classinfo_unwrap(cls);
1157 /* Get the signature of the class. */
1159 u = class_get_signature(c);
1164 /* Convert UTF-string to a Java-string. */
1166 s = javastring_new(u);
1172 /* JVM_GetClassAnnotations */
1174 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1176 classinfo *c = NULL; /* classinfo for 'cls' */
1177 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1179 TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
1182 exceptions_throw_nullpointerexception();
1186 c = LLNI_classinfo_unwrap(cls);
1188 /* get annotations: */
1189 annotations = class_get_annotations(c);
1191 return (jbyteArray)annotations;
1195 /* JVM_GetFieldAnnotations */
1197 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1199 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1200 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1202 TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
1204 if (field == NULL) {
1205 exceptions_throw_nullpointerexception();
1209 rf = (java_lang_reflect_Field*)field;
1211 LLNI_field_get_ref(rf, annotations, ba);
1213 return (jbyteArray)ba;
1217 /* JVM_GetMethodAnnotations */
1219 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1221 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1222 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1224 TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
1226 if (method == NULL) {
1227 exceptions_throw_nullpointerexception();
1231 rm = (java_lang_reflect_Method*)method;
1233 LLNI_field_get_ref(rm, annotations, ba);
1235 return (jbyteArray)ba;
1239 /* JVM_GetMethodDefaultAnnotationValue */
1241 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1243 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1244 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1246 TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
1248 if (method == NULL) {
1249 exceptions_throw_nullpointerexception();
1253 rm = (java_lang_reflect_Method*)method;
1255 LLNI_field_get_ref(rm, annotationDefault, ba);
1257 return (jbyteArray)ba;
1261 /* JVM_GetMethodParameterAnnotations */
1263 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1265 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1266 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1268 TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
1270 if (method == NULL) {
1271 exceptions_throw_nullpointerexception();
1275 rm = (java_lang_reflect_Method*)method;
1277 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1279 return (jbyteArray)ba;
1283 /* JVM_GetClassDeclaredFields */
1285 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1288 log_println("JVM_GetClassDeclaredFields: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1290 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1294 /* JVM_GetClassDeclaredMethods */
1296 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1299 log_println("JVM_GetClassDeclaredMethods: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1301 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1305 /* JVM_GetClassDeclaredConstructors */
1307 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1310 log_println("JVM_GetClassDeclaredConstructors: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1312 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1316 /* JVM_GetClassAccessFlags */
1318 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1322 TRACEJVMCALLS("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls);
1324 c = LLNI_classinfo_unwrap(cls);
1326 /* Primitive type classes have the correct access flags. */
1328 return c->flags & ACC_CLASS_REFLECT_MASK;
1332 /* JVM_GetClassConstantPool */
1334 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1336 #if defined(ENABLE_ANNOTATIONS)
1337 sun_reflect_ConstantPool *constantPool = NULL;
1338 /* constant pool object for the class refered by 'cls' */
1339 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1340 /* constantPoolOop field of the constant pool object */
1342 TRACEJVMCALLS("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls);
1345 (sun_reflect_ConstantPool*)native_new_and_init(
1346 class_sun_reflect_ConstantPool);
1348 if (constantPool == NULL) {
1353 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1355 return (jobject)constantPool;
1357 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1363 /* JVM_ConstantPoolGetSize */
1365 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1367 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1369 TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
1371 c = LLNI_classinfo_unwrap(jcpool);
1377 /* JVM_ConstantPoolGetClassAt */
1379 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1381 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1382 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1383 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1385 TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
1387 c = LLNI_classinfo_unwrap(jcpool);
1389 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1392 exceptions_throw_illegalargumentexception();
1396 result = resolve_classref_eager(ref);
1398 return (jclass) LLNI_classinfo_wrap(result);
1402 /* JVM_ConstantPoolGetClassAtIfLoaded */
1404 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1406 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1407 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1408 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1410 TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
1412 c = LLNI_classinfo_unwrap(jcpool);
1414 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1417 exceptions_throw_illegalargumentexception();
1421 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1425 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1429 return (jclass) LLNI_classinfo_wrap(result);
1433 /* JVM_ConstantPoolGetMethodAt */
1435 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1437 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1438 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1440 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
1442 cls = LLNI_classinfo_unwrap(jcpool);
1443 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1446 exceptions_throw_illegalargumentexception();
1450 /* XXX: is that right? or do I have to use resolve_method_*? */
1451 return (jobject)reflect_method_new(ref->p.method);
1455 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1457 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1459 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1460 classinfo *c = NULL; /* resolved declaring class of the method */
1461 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1463 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1465 cls = LLNI_classinfo_unwrap(jcpool);
1466 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1469 exceptions_throw_illegalargumentexception();
1473 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1477 if (c == NULL || !(c->state & CLASS_LOADED)) {
1481 return (jobject)reflect_method_new(ref->p.method);
1485 /* JVM_ConstantPoolGetFieldAt */
1487 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1489 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1490 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1492 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
1494 cls = LLNI_classinfo_unwrap(jcpool);
1495 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1498 exceptions_throw_illegalargumentexception();
1502 return (jobject)reflect_field_new(ref->p.field);
1506 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1508 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1510 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1511 classinfo *c; /* resolved declaring class for the field */
1512 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1514 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1516 cls = LLNI_classinfo_unwrap(jcpool);
1517 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1520 exceptions_throw_illegalargumentexception();
1524 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1528 if (c == NULL || !(c->state & CLASS_LOADED)) {
1532 return (jobject)reflect_field_new(ref->p.field);
1536 /* JVM_ConstantPoolGetMemberRefInfoAt */
1538 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1540 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1542 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1548 /* JVM_ConstantPoolGetIntAt */
1550 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1552 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1553 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1555 TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
1557 cls = LLNI_classinfo_unwrap(jcpool);
1558 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1561 exceptions_throw_illegalargumentexception();
1569 /* JVM_ConstantPoolGetLongAt */
1571 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1573 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1574 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1576 TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
1578 cls = LLNI_classinfo_unwrap(jcpool);
1579 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1582 exceptions_throw_illegalargumentexception();
1590 /* JVM_ConstantPoolGetFloatAt */
1592 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1594 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1595 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1597 TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
1599 cls = LLNI_classinfo_unwrap(jcpool);
1600 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1603 exceptions_throw_illegalargumentexception();
1611 /* JVM_ConstantPoolGetDoubleAt */
1613 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1615 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1616 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1618 TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
1620 cls = LLNI_classinfo_unwrap(jcpool);
1621 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1624 exceptions_throw_illegalargumentexception();
1632 /* JVM_ConstantPoolGetStringAt */
1634 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1636 utf *ref; /* utf object for the string in constant pool at index 'index' */
1637 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1639 TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
1641 cls = LLNI_classinfo_unwrap(jcpool);
1642 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1645 exceptions_throw_illegalargumentexception();
1649 /* XXX: I hope literalstring_new is the right Function. */
1650 return (jstring)literalstring_new(ref);
1654 /* JVM_ConstantPoolGetUTF8At */
1656 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1658 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1659 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1661 TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
1663 cls = LLNI_classinfo_unwrap(jcpool);
1664 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1667 exceptions_throw_illegalargumentexception();
1671 /* XXX: I hope literalstring_new is the right Function. */
1672 return (jstring)literalstring_new(ref);
1676 /* JVM_DesiredAssertionStatus */
1678 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1680 #if defined(ENABLE_ASSERTION)
1681 assertion_name_t *item;
1686 TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
1688 c = LLNI_classinfo_unwrap(cls);
1690 if (c->classloader == NULL) {
1691 status = (jboolean)assertion_system_enabled;
1694 status = (jboolean)assertion_user_enabled;
1697 if (list_assertion_names != NULL) {
1698 item = (assertion_name_t *)list_first(list_assertion_names);
1699 while (item != NULL) {
1700 name = utf_new_char(item->name);
1701 if (name == c->packagename) {
1702 status = (jboolean)item->enabled;
1704 else if (name == c->name) {
1705 status = (jboolean)item->enabled;
1708 item = (assertion_name_t *)list_next(list_assertion_names, item);
1714 return (jboolean)false;
1719 /* JVM_AssertionStatusDirectives */
1721 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1724 java_lang_AssertionStatusDirectives *o;
1725 java_handle_objectarray_t *classes;
1726 java_handle_objectarray_t *packages;
1727 java_booleanarray_t *classEnabled;
1728 java_booleanarray_t *packageEnabled;
1729 #if defined(ENABLE_ASSERTION)
1730 assertion_name_t *item;
1735 TRACEJVMCALLS("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused);
1737 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1742 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1747 #if defined(ENABLE_ASSERTION)
1748 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1750 classes = builtin_anewarray(0, class_java_lang_Object);
1752 if (classes == NULL)
1755 #if defined(ENABLE_ASSERTION)
1756 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1758 packages = builtin_anewarray(0, class_java_lang_Object);
1760 if (packages == NULL)
1763 #if defined(ENABLE_ASSERTION)
1764 classEnabled = builtin_newarray_boolean(assertion_class_count);
1766 classEnabled = builtin_newarray_boolean(0);
1768 if (classEnabled == NULL)
1771 #if defined(ENABLE_ASSERTION)
1772 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1774 packageEnabled = builtin_newarray_boolean(0);
1776 if (packageEnabled == NULL)
1779 #if defined(ENABLE_ASSERTION)
1780 /* initialize arrays */
1782 if (list_assertion_names != NULL) {
1786 item = (assertion_name_t *)list_first(list_assertion_names);
1787 while (item != NULL) {
1788 js = javastring_new_from_ascii(item->name);
1793 if (item->package == false) {
1794 classes->data[i] = js;
1795 classEnabled->data[i] = (jboolean) item->enabled;
1799 packages->data[j] = js;
1800 packageEnabled->data[j] = (jboolean) item->enabled;
1804 item = (assertion_name_t *)list_next(list_assertion_names, item);
1809 /* set instance fields */
1811 o->classes = classes;
1812 o->packages = packages;
1813 o->classEnabled = classEnabled;
1814 o->packageEnabled = packageEnabled;
1820 /* JVM_GetClassNameUTF */
1822 const char* JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1824 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1828 /* JVM_GetClassCPTypes */
1830 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1832 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1836 /* JVM_GetClassCPEntriesCount */
1838 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1840 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1844 /* JVM_GetClassFieldsCount */
1846 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1848 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1852 /* JVM_GetClassMethodsCount */
1854 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1856 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1860 /* JVM_GetMethodIxExceptionIndexes */
1862 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1864 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1868 /* JVM_GetMethodIxExceptionsCount */
1870 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1872 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1876 /* JVM_GetMethodIxByteCode */
1878 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1880 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1884 /* JVM_GetMethodIxByteCodeLength */
1886 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1888 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1892 /* JVM_GetMethodIxExceptionTableEntry */
1894 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1896 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1900 /* JVM_GetMethodIxExceptionTableLength */
1902 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1904 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1908 /* JVM_GetMethodIxModifiers */
1910 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1912 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1916 /* JVM_GetFieldIxModifiers */
1918 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1920 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1924 /* JVM_GetMethodIxLocalsCount */
1926 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1928 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1932 /* JVM_GetMethodIxArgsSize */
1934 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1936 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1940 /* JVM_GetMethodIxMaxStack */
1942 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1944 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1948 /* JVM_IsConstructorIx */
1950 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1952 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1956 /* JVM_GetMethodIxNameUTF */
1958 const char* JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1960 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1964 /* JVM_GetMethodIxSignatureUTF */
1966 const char* JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1968 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1972 /* JVM_GetCPFieldNameUTF */
1974 const char* JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1976 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1980 /* JVM_GetCPMethodNameUTF */
1982 const char* JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1984 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1988 /* JVM_GetCPMethodSignatureUTF */
1990 const char* JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1992 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1996 /* JVM_GetCPFieldSignatureUTF */
1998 const char* JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2000 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2004 /* JVM_GetCPClassNameUTF */
2006 const char* JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2008 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2012 /* JVM_GetCPFieldClassNameUTF */
2014 const char* JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2016 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2020 /* JVM_GetCPMethodClassNameUTF */
2022 const char* JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2024 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2028 /* JVM_GetCPFieldModifiers */
2030 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2032 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2036 /* JVM_GetCPMethodModifiers */
2038 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2040 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2044 /* JVM_ReleaseUTF */
2046 void JVM_ReleaseUTF(const char *utf)
2048 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2052 /* JVM_IsSameClassPackage */
2054 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2056 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2062 jint JVM_Open(const char *fname, jint flags, jint mode)
2067 log_println("JVM_Open: fname=%s, flags=%d, mode=%d", fname, flags, mode);
2070 result = open(fname, flags, mode);
2078 /* XXX don't know what to do here */
2079 /* return JVM_EEXIST; */
2090 jint JVM_Close(jint fd)
2093 log_println("JVM_Close: fd=%d", fd);
2101 jint JVM_Read(jint fd, char *buf, jint nbytes)
2104 log_println("JVM_Read: fd=%d, buf=%p, nbytes=%d", fd, buf, nbytes);
2106 return read(fd, buf, nbytes);
2112 jint JVM_Write(jint fd, char *buf, jint nbytes)
2115 log_println("JVM_Write: fd=%d, buf=%s, nbytes=%d", fd, buf, nbytes);
2117 return write(fd, buf, nbytes);
2123 jint JVM_Available(jint fd, jlong *pbytes)
2125 #if defined(FIONREAD)
2128 TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
2132 if (ioctl(fd, FIONREAD, &bytes) < 0)
2139 # error FIONREAD not defined
2146 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2148 TRACEJVMCALLS("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence);
2150 return (jlong) lseek(fd, (off_t) offset, whence);
2156 jint JVM_SetLength(jint fd, jlong length)
2158 TRACEJVMCALLS("JVM_SetLength(fd=%d, length=%ld)", length);
2160 return ftruncate(fd, length);
2166 jint JVM_Sync(jint fd)
2168 TRACEJVMCALLS("JVM_Sync(fd=%d)", fd);
2174 /* JVM_StartThread */
2176 void JVM_StartThread(JNIEnv* env, jobject jthread)
2179 log_println("JVM_StartThread: jthread=%p", jthread);
2181 _Jv_java_lang_Thread_start((java_lang_Thread *) jthread, 0);
2185 /* JVM_StopThread */
2187 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2189 log_println("JVM_StopThread: IMPLEMENT ME!");
2193 /* JVM_IsThreadAlive */
2195 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2201 TRACEJVMCALLS("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread);
2203 /* XXX this is just a quick hack */
2205 for (t = threads_list_first(); t != NULL; t = threads_list_next(t)) {
2206 LLNI_equals(t->object, jthread, equal);
2212 /* The threadobject is null when a thread is created in Java. The
2213 priority is set later during startup. */
2218 result = threads_thread_is_alive(t);
2224 /* JVM_SuspendThread */
2226 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2228 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2232 /* JVM_ResumeThread */
2234 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2236 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2240 /* JVM_SetThreadPriority */
2242 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2245 log_println("JVM_SetThreadPriority: jthread=%p, prio=%d", jthread, prio);
2247 _Jv_java_lang_Thread_setPriority((java_lang_Thread *) jthread, prio);
2253 void JVM_Yield(JNIEnv *env, jclass threadClass)
2255 TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
2263 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2266 log_println("JVM_Sleep: threadClass=%p, millis=%ld", threadClass, millis);
2268 _Jv_java_lang_Thread_sleep(millis);
2272 /* JVM_CurrentThread */
2274 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2277 log_println("JVM_CurrentThread: threadClass=%p", threadClass);
2279 return (jobject) _Jv_java_lang_Thread_currentThread();
2283 /* JVM_CountStackFrames */
2285 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2287 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2293 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2295 log_println("JVM_Interrupt: IMPLEMENT ME!");
2299 /* JVM_IsInterrupted */
2301 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2304 log_println("JVM_IsInterrupted: jthread=%p, clear_interrupted=%d", jthread, clear_interrupted);
2306 /* XXX do something with clear_interrupted */
2307 return _Jv_java_lang_Thread_isInterrupted((java_lang_Thread *) jthread);
2313 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2318 TRACEJVMCALLS("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj);
2320 h = (java_handle_t *) obj;
2323 exceptions_throw_nullpointerexception();
2327 result = lock_is_held_by_current_thread(h);
2333 /* JVM_DumpAllStacks */
2335 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2337 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2341 /* JVM_CurrentLoadedClass */
2343 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2345 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2349 /* JVM_CurrentClassLoader */
2351 jobject JVM_CurrentClassLoader(JNIEnv *env)
2353 /* XXX if a method in a class in a trusted loader is in a
2354 doPrivileged, return NULL */
2356 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2360 /* JVM_GetClassContext */
2362 jobjectArray JVM_GetClassContext(JNIEnv *env)
2365 log_println("JVM_GetClassContext");
2367 return (jobjectArray) stacktrace_getClassContext();
2371 /* JVM_ClassDepth */
2373 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2375 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2379 /* JVM_ClassLoaderDepth */
2381 jint JVM_ClassLoaderDepth(JNIEnv *env)
2383 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2387 /* JVM_GetSystemPackage */
2389 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2395 TRACEJVMCALLS("JVM_GetSystemPackage(env=%p, name=%p)", env, name);
2397 /* s = package_find(name); */
2398 u = javastring_toutf(name, false);
2399 result = package_find(u);
2401 s = javastring_new(result);
2409 /* JVM_GetSystemPackages */
2411 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2413 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2417 /* JVM_AllocateNewObject */
2419 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2421 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2425 /* JVM_AllocateNewArray */
2427 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2429 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2433 /* JVM_LatestUserDefinedLoader */
2435 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2439 TRACEJVMCALLS("JVM_LatestUserDefinedLoader(env=%p)", env);
2441 cl = stacktrace_first_nonnull_classloader();
2443 return (jobject) cl;
2447 /* JVM_LoadClass0 */
2449 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2451 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2455 /* JVM_GetArrayLength */
2457 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2461 TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
2463 a = (java_handle_t *) arr;
2465 return array_length_get(a);
2469 /* JVM_GetArrayElement */
2471 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2476 TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
2478 a = (java_handle_t *) arr;
2480 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2481 /* exceptions_throw_illegalargumentexception(); */
2485 o = array_element_get(a, index);
2491 /* JVM_GetPrimitiveArrayElement */
2493 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2495 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2499 /* JVM_SetArrayElement */
2501 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2504 java_handle_t *value;
2506 TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
2508 a = (java_handle_t *) arr;
2509 value = (java_handle_t *) val;
2511 array_element_set(a, index, value);
2515 /* JVM_SetPrimitiveArrayElement */
2517 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2519 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2525 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2530 java_handle_objectarray_t *oa;
2532 TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
2534 if (eltClass == NULL) {
2535 exceptions_throw_nullpointerexception();
2539 /* NegativeArraySizeException is checked in builtin_newarray. */
2541 c = LLNI_classinfo_unwrap(eltClass);
2543 /* create primitive or object array */
2545 if (class_is_primitive(c)) {
2546 pc = primitive_arrayclass_get_by_name(c->name);
2547 a = builtin_newarray(length, pc);
2552 oa = builtin_anewarray(length, c);
2554 return (jobject) oa;
2559 /* JVM_NewMultiArray */
2561 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2564 java_handle_intarray_t *ia;
2570 java_handle_objectarray_t *a;
2572 TRACEJVMCALLS("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim);
2574 if (eltClass == NULL) {
2575 exceptions_throw_nullpointerexception();
2579 /* NegativeArraySizeException is checked in builtin_newarray. */
2581 c = LLNI_classinfo_unwrap(eltClass);
2583 /* XXX This is just a quick hack to get it working. */
2585 ia = (java_handle_intarray_t *) dim;
2587 length = array_length_get(ia);
2589 dims = MNEW(long, length);
2591 for (i = 0; i < length; i++) {
2592 value = LLNI_array_direct(ia, i);
2593 dims[i] = (long) value;
2596 /* Create an array-class if necessary. */
2598 if (class_is_primitive(c))
2599 ac = primitive_arrayclass_get_by_name(c->name);
2601 ac = class_array_of(c, true);
2606 a = builtin_multianewarray(length, ac, dims);
2612 /* JVM_InitializeSocketLibrary */
2614 jint JVM_InitializeSocketLibrary()
2616 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2622 jint JVM_Socket(jint domain, jint type, jint protocol)
2624 TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
2626 return socket(domain, type, protocol);
2630 /* JVM_SocketClose */
2632 jint JVM_SocketClose(jint fd)
2634 TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
2640 /* JVM_SocketShutdown */
2642 jint JVM_SocketShutdown(jint fd, jint howto)
2644 TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
2646 return shutdown(fd, howto);
2652 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2654 log_println("JVM_Recv: IMPLEMENT ME!");
2660 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2662 log_println("JVM_Send: IMPLEMENT ME!");
2668 jint JVM_Timeout(int fd, long timeout)
2670 log_println("JVM_Timeout: IMPLEMENT ME!");
2676 jint JVM_Listen(jint fd, jint count)
2678 TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
2680 return listen(fd, count);
2686 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2688 TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
2690 return connect(fd, him, len);
2696 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2698 log_println("JVM_Bind: IMPLEMENT ME!");
2704 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2706 TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
2708 return accept(fd, him, (socklen_t *) len);
2714 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2716 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2720 /* JVM_GetSockName */
2722 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2724 TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
2726 return getsockname(fd, him, (socklen_t *) len);
2732 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2734 log_println("JVM_SendTo: IMPLEMENT ME!");
2738 /* JVM_SocketAvailable */
2740 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2742 #if defined(FIONREAD)
2745 TRACEJVMCALLS("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes);
2749 if (ioctl(fd, FIONREAD, &bytes) < 0)
2756 # error FIONREAD not defined
2761 /* JVM_GetSockOpt */
2763 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2765 #if defined(HAVE_GETSOCKOPT)
2766 TRACEJVMCALLS("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen);
2768 return getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2770 # error getsockopt not available
2775 /* JVM_SetSockOpt */
2777 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2779 #if defined(HAVE_SETSOCKOPT)
2780 TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
2782 return setsockopt(fd, level, optname, optval, optlen);
2784 # error setsockopt not available
2789 /* JVM_GetHostName */
2791 int JVM_GetHostName(char* name, int namelen)
2793 TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
2795 return gethostname(name, namelen);
2799 /* JVM_GetHostByAddr */
2801 struct hostent* JVM_GetHostByAddr(const char* name, int len, int type)
2803 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2807 /* JVM_GetHostByName */
2809 struct hostent* JVM_GetHostByName(char* name)
2811 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2815 /* JVM_GetProtoByName */
2817 struct protoent* JVM_GetProtoByName(char* name)
2819 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2823 /* JVM_LoadLibrary */
2825 void *JVM_LoadLibrary(const char *name)
2829 TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
2831 u = utf_new_char(name);
2833 return native_library_open(u);
2837 /* JVM_UnloadLibrary */
2839 void JVM_UnloadLibrary(void* handle)
2841 log_println("JVM_UnloadLibrary: IMPLEMENT ME!");
2845 /* JVM_FindLibraryEntry */
2847 void *JVM_FindLibraryEntry(void *handle, const char *name)
2851 TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
2853 symbol = lt_dlsym(handle, name);
2861 jboolean JVM_IsNaN(jdouble a)
2863 log_println("JVM_IsNaN: IMPLEMENT ME!");
2867 /* JVM_IsSupportedJNIVersion */
2869 jboolean JVM_IsSupportedJNIVersion(jint version)
2871 TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
2873 return jni_version_check(version);
2877 /* JVM_InternString */
2879 jstring JVM_InternString(JNIEnv *env, jstring str)
2881 TRACEJVMCALLS("JVM_InternString(env=%p, str=%p)", env, str);
2883 return (jstring) javastring_intern((java_handle_t *) str);
2887 /* JVM_RawMonitorCreate */
2889 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2894 log_println("JVM_RawMonitorCreate");
2897 o = NEW(java_object_t);
2899 lock_init_object_lock(o);
2905 /* JVM_RawMonitorDestroy */
2907 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
2910 log_println("JVM_RawMonitorDestroy: mon=%p", mon);
2912 FREE(mon, java_object_t);
2916 /* JVM_RawMonitorEnter */
2918 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
2921 log_println("JVM_RawMonitorEnter: mon=%p", mon);
2923 (void) lock_monitor_enter((java_object_t *) mon);
2929 /* JVM_RawMonitorExit */
2931 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
2934 log_println("JVM_RawMonitorExit: mon=%p", mon);
2936 (void) lock_monitor_exit((java_object_t *) mon);
2940 /* JVM_SetPrimitiveFieldValues */
2942 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2944 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
2948 /* JVM_GetPrimitiveFieldValues */
2950 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2952 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
2956 /* JVM_AccessVMBooleanFlag */
2958 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
2960 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
2964 /* JVM_AccessVMIntFlag */
2966 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
2968 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
2972 /* JVM_VMBreakPoint */
2974 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
2976 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
2980 /* JVM_GetClassFields */
2982 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
2984 log_println("JVM_GetClassFields: IMPLEMENT ME!");
2988 /* JVM_GetClassMethods */
2990 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
2992 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
2996 /* JVM_GetClassConstructors */
2998 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3000 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3004 /* JVM_GetClassField */
3006 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3008 log_println("JVM_GetClassField: IMPLEMENT ME!");
3012 /* JVM_GetClassMethod */
3014 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3016 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3020 /* JVM_GetClassConstructor */
3022 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3024 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3028 /* JVM_NewInstance */
3030 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3032 log_println("JVM_NewInstance: IMPLEMENT ME!");
3038 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3040 log_println("JVM_GetField: IMPLEMENT ME!");
3044 /* JVM_GetPrimitiveField */
3046 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3048 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3054 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3056 log_println("JVM_SetField: IMPLEMENT ME!");
3060 /* JVM_SetPrimitiveField */
3062 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3064 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3068 /* JVM_InvokeMethod */
3070 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3073 log_println("JVM_InvokeMethod: method=%p, obj=%p, args0=%p", method, obj, args0);
3075 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
3079 /* JVM_NewInstanceFromConstructor */
3081 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
3084 log_println("JVM_NewInstanceFromConstructor: c=%p, args0=%p", c, args0);
3086 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
3090 /* JVM_SupportsCX8 */
3092 jboolean JVM_SupportsCX8()
3094 TRACEJVMCALLS("JVM_SupportsCX8()");
3104 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3106 log_println("JVM_CX8Field: IMPLEMENT ME!");
3110 /* JVM_GetAllThreads */
3112 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3114 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3118 /* JVM_DumpThreads */
3120 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3122 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3126 /* JVM_GetManagement */
3128 void* JVM_GetManagement(jint version)
3130 log_println("JVM_GetManagement: IMPLEMENT ME!");
3134 /* JVM_InitAgentProperties */
3136 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3138 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3142 /* JVM_GetEnclosingMethodInfo */
3144 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3148 java_handle_objectarray_t *oa;
3150 TRACEJVMCALLS("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass);
3152 c = LLNI_classinfo_unwrap(ofClass);
3154 if ((c == NULL) || class_is_primitive(c))
3157 m = class_get_enclosingmethod(c);
3162 oa = builtin_anewarray(3, class_java_lang_Object);
3167 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->class));
3168 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3169 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3171 return (jobjectArray) oa;
3175 /* JVM_GetThreadStateValues */
3177 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3179 java_handle_intarray_t *ia;
3181 TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3182 env, javaThreadState);
3184 /* If new thread states are added in future JDK and VM versions,
3185 this should check if the JDK version is compatible with thread
3186 states supported by the VM. Return NULL if not compatible.
3188 This function must map the VM java_lang_Thread::ThreadStatus
3189 to the Java thread state that the JDK supports. */
3191 switch (javaThreadState) {
3192 case THREAD_STATE_NEW:
3193 ia = builtin_newarray_int(1);
3198 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3201 case THREAD_STATE_RUNNABLE:
3202 ia = builtin_newarray_int(1);
3207 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3210 case THREAD_STATE_BLOCKED:
3211 ia = builtin_newarray_int(1);
3216 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3219 case THREAD_STATE_WAITING:
3220 ia = builtin_newarray_int(2);
3225 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3226 /* XXX Implement parked stuff. */
3227 /* array_intarray_element_set(ia, 1, PARKED); */
3230 case THREAD_STATE_TIMED_WAITING:
3231 ia = builtin_newarray_int(3);
3236 /* XXX Not sure about that one. */
3237 /* array_intarray_element_set(ia, 0, SLEEPING); */
3238 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3239 /* XXX Implement parked stuff. */
3240 /* array_intarray_element_set(ia, 2, PARKED); */
3243 case THREAD_STATE_TERMINATED:
3244 ia = builtin_newarray_int(1);
3249 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3253 /* Unknown state - probably incompatible JDK version */
3257 return (jintArray) ia;
3261 /* JVM_GetThreadStateNames */
3263 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3265 java_handle_intarray_t *ia;
3266 java_handle_objectarray_t *oa;
3269 TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3270 env, javaThreadState, values);
3272 ia = (java_handle_intarray_t *) values;
3274 /* If new thread states are added in future JDK and VM versions,
3275 this should check if the JDK version is compatible with thread
3276 states supported by the VM. Return NULL if not compatible.
3278 This function must map the VM java_lang_Thread::ThreadStatus
3279 to the Java thread state that the JDK supports. */
3281 if (values == NULL) {
3282 exceptions_throw_nullpointerexception();
3286 switch (javaThreadState) {
3287 case THREAD_STATE_NEW:
3288 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3290 oa = builtin_anewarray(1, class_java_lang_String);
3295 s = javastring_new(utf_new_char("NEW"));
3300 array_objectarray_element_set(oa, 0, s);
3303 case THREAD_STATE_RUNNABLE:
3304 oa = builtin_anewarray(1, class_java_lang_String);
3309 s = javastring_new(utf_new_char("RUNNABLE"));
3314 array_objectarray_element_set(oa, 0, s);
3317 case THREAD_STATE_BLOCKED:
3318 oa = builtin_anewarray(1, class_java_lang_String);
3323 s = javastring_new(utf_new_char("BLOCKED"));
3328 array_objectarray_element_set(oa, 0, s);
3331 case THREAD_STATE_WAITING:
3332 oa = builtin_anewarray(2, class_java_lang_String);
3337 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3338 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3343 array_objectarray_element_set(oa, 0, s);
3344 /* array_objectarray_element_set(oa, 1, s); */
3347 case THREAD_STATE_TIMED_WAITING:
3348 oa = builtin_anewarray(3, class_java_lang_String);
3353 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3354 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3355 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3360 /* array_objectarray_element_set(oa, 0, s); */
3361 array_objectarray_element_set(oa, 0, s);
3362 /* array_objectarray_element_set(oa, 2, s); */
3365 case THREAD_STATE_TERMINATED:
3366 oa = builtin_anewarray(1, class_java_lang_String);
3371 s = javastring_new(utf_new_char("TERMINATED"));
3376 array_objectarray_element_set(oa, 0, s);
3380 /* Unknown state - probably incompatible JDK version */
3384 return (jobjectArray) oa;
3388 /* JVM_GetVersionInfo */
3390 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3392 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3396 /* OS: JVM_RegisterSignal */
3398 void *JVM_RegisterSignal(jint sig, void *handler)
3400 functionptr newHandler;
3402 TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
3404 if (handler == (void *) 2)
3405 newHandler = (functionptr) signal_thread_handler;
3407 newHandler = (functionptr) (uintptr_t) handler;
3414 /* These signals are already used by the VM. */
3418 /* This signal is used by the VM to dump thread stacks unless
3419 ReduceSignalUsage is set, in which case the user is allowed
3420 to set his own _native_ handler for this signal; thus, in
3421 either case, we do not allow JVM_RegisterSignal to change
3431 signal_register_signal(sig, newHandler, 0);
3433 /* XXX Should return old handler. */
3439 /* OS: JVM_RaiseSignal */
3441 jboolean JVM_RaiseSignal(jint sig)
3443 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3448 /* OS: JVM_FindSignal */
3450 jint JVM_FindSignal(const char *name)
3452 TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
3454 #if defined(__LINUX__)
3455 if (strcmp(name, "HUP") == 0)
3458 if (strcmp(name, "INT") == 0)
3461 if (strcmp(name, "TERM") == 0)
3464 # error not implemented for this OS
3472 * These are local overrides for various environment variables in Emacs.
3473 * Please do not remove this and leave it at the end of the file, where
3474 * Emacs will automagically detect them.
3475 * ---------------------------------------------------------------------
3478 * indent-tabs-mode: t