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;
395 log_println("JVM_FillInStackTrace: receiver=%p", receiver);
398 o = (java_lang_Throwable *) receiver;
400 ba = stacktrace_fillInStackTrace();
405 o->backtrace = (java_lang_Object *) ba;
409 /* JVM_PrintStackTrace */
411 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
413 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
417 /* JVM_GetStackTraceDepth */
419 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
421 java_lang_Throwable *o;
422 java_handle_bytearray_t *ba;
423 stacktracebuffer *stb;
425 TRACEJVMCALLS("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable);
427 if (throwable == NULL) {
428 exceptions_throw_nullpointerexception();
432 o = (java_lang_Throwable *) throwable;
433 ba = (java_handle_bytearray_t *) o->backtrace;
438 stb = (stacktracebuffer *) LLNI_array_data(ba);
444 /* JVM_GetStackTraceElement */
446 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
448 java_lang_Throwable *t;
449 java_handle_bytearray_t *ba;
450 stacktracebuffer *stb;
451 stacktrace_entry *ste;
452 java_lang_StackTraceElement *o;
453 java_lang_String *declaringclass;
454 java_lang_String *filename;
458 log_println("JVM_GetStackTraceElement: throwable=%p, index=%d", throwable, index);
461 t = (java_lang_Throwable *) throwable;
462 ba = (java_handle_bytearray_t *) t->backtrace;
463 stb = (stacktracebuffer *) LLNI_array_data(ba);
465 if ((index < 0) || (index >= stb->used)) {
466 /* XXX This should be an IndexOutOfBoundsException (check this
469 exceptions_throw_arrayindexoutofboundsexception();
473 ste = &(stb->entries[index]);
475 /* allocate a new StackTraceElement */
477 o = (java_lang_StackTraceElement *)
478 builtin_new(class_java_lang_StackTraceElement);
485 if (!(ste->method->flags & ACC_NATIVE)) {
486 if (ste->method->class->sourcefile)
487 filename = (java_lang_String *) javastring_new(ste->method->class->sourcefile);
494 /* get line number */
496 if (ste->method->flags & ACC_NATIVE)
499 linenumber = (ste->linenumber == 0) ? -1 : ste->linenumber;
501 /* get declaring class name */
504 _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(ste->method->class));
506 /* fill the java.lang.StackTraceElement element */
508 o->declaringClass = declaringclass;
509 o->methodName = (java_lang_String *) javastring_new(ste->method->name);
510 o->fileName = filename;
511 o->lineNumber = linenumber;
519 jint JVM_IHashCode(JNIEnv* env, jobject handle)
522 log_println("JVM_IHashCode: jobject=%p", handle);
524 return (jint) ((ptrint) handle);
528 /* JVM_MonitorWait */
530 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
532 #if defined(ENABLE_THREADS)
536 TRACEJVMCALLS("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms);
538 /* exceptions_throw_illegalargumentexception("argument out of range"); */
539 exceptions_throw_illegalargumentexception();
543 #if defined(ENABLE_THREADS)
544 o = (java_handle_t *) handle;
546 lock_wait_for_object(o, ms, 0);
551 /* JVM_MonitorNotify */
553 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
555 #if defined(ENABLE_THREADS)
559 TRACEJVMCALLS("JVM_MonitorNotify(env=%p, handle=%p)", env, handle);
561 #if defined(ENABLE_THREADS)
562 o = (java_handle_t *) handle;
564 lock_notify_object(o);
569 /* JVM_MonitorNotifyAll */
571 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
573 #if defined(ENABLE_THREADS)
577 TRACEJVMCALLS("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle);
579 #if defined(ENABLE_THREADS)
580 o = (java_handle_t *) handle;
582 lock_notify_all_object(o);
589 jobject JVM_Clone(JNIEnv* env, jobject handle)
592 log_println("JVM_Clone: handle=%p", handle);
594 return (jobject) builtin_clone(env, (java_handle_t *) handle);
598 /* JVM_InitializeCompiler */
600 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
602 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
606 /* JVM_IsSilentCompiler */
608 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
610 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
614 /* JVM_CompileClass */
616 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
618 log_println("JVM_CompileClass: IMPLEMENT ME!");
622 /* JVM_CompileClasses */
624 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
626 log_println("JVM_CompileClasses: IMPLEMENT ME!");
630 /* JVM_CompilerCommand */
632 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
634 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
638 /* JVM_EnableCompiler */
640 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
642 TRACEJVMCALLS("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls);
643 PRINTJVMWARNINGS("JVM_EnableCompiler not supported");
647 /* JVM_DisableCompiler */
649 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
651 TRACEJVMCALLS("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls);
652 PRINTJVMWARNINGS("JVM_DisableCompiler not supported");
656 /* JVM_GetLastErrorString */
658 jint JVM_GetLastErrorString(char *buf, int len)
684 char *JVM_NativePath(char *path)
686 TRACEJVMCALLS("JVM_NativePath(path=%s)", path);
688 /* XXX is this correct? */
694 /* JVM_GetCallerClass */
696 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
698 java_handle_objectarray_t *oa;
700 TRACEJVMCALLS("JVM_GetCallerClass(env=%p, depth=%d)", env, depth);
702 oa = stacktrace_getClassContext();
707 if (oa->header.size < depth)
710 return (jclass) oa->data[depth - 1];
715 /* JVM_FindPrimitiveClass */
717 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
722 TRACEJVMCALLS("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s);
725 c = primitive_class_get_by_name(u);
727 return (jclass) LLNI_classinfo_wrap(c);
731 /* JVM_ResolveClass */
733 void JVM_ResolveClass(JNIEnv* env, jclass cls)
735 TRACEJVMCALLS("JVM_ResolveClass(env=%p, cls=%p)", env, cls);
736 PRINTJVMWARNINGS("JVM_ResolveClass not implemented");
740 /* JVM_FindClassFromClassLoader */
742 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
748 TRACEJVMCALLS("JVM_FindClassFromClassLoader: name=%s, init=%d, loader=%p, throwError=%d", name, init, loader, throwError);
750 u = utf_new_char(name);
751 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
753 c = load_class_from_classloader(u, cl);
759 if (!(c->state & CLASS_INITIALIZED))
760 if (!initialize_class(c))
763 return (jclass) LLNI_classinfo_wrap(c);
767 /* JVM_FindClassFromClass */
769 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
771 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
775 /* JVM_DefineClass */
777 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
779 log_println("JVM_DefineClass: IMPLEMENT ME!");
783 /* JVM_DefineClassWithSource */
785 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
791 TRACEJVMCALLS("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source);
794 u = utf_new_char(name);
798 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
800 /* XXX do something with source */
802 c = class_define(u, cl, len, (const uint8_t *) buf, (java_handle_t *) pd);
804 return (jclass) LLNI_classinfo_wrap(c);
808 /* JVM_FindLoadedClass */
810 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
816 TRACEJVMCALLS("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name);
818 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
820 u = javastring_toutf((java_handle_t *) name, true);
821 c = classcache_lookup(cl, u);
823 return (jclass) LLNI_classinfo_wrap(c);
827 /* JVM_GetClassName */
829 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
832 log_println("JVM_GetClassName: cls=%p", cls);
834 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
838 /* JVM_GetClassInterfaces */
840 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
843 java_handle_objectarray_t *oa;
845 TRACEJVMCALLS("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls);
847 c = LLNI_classinfo_unwrap(cls);
849 oa = class_get_interfaces(c);
851 return (jobjectArray) oa;
855 /* JVM_GetClassLoader */
857 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
862 TRACEJVMCALLS("JVM_GetClassLoader(env=%p, cls=%p)", env, cls);
864 c = LLNI_classinfo_unwrap(cls);
865 cl = class_get_classloader(c);
871 /* JVM_IsInterface */
873 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
878 log_println("JVM_IsInterface: cls=%p", cls);
881 c = LLNI_classinfo_unwrap(cls);
883 return class_is_interface(c);
887 /* JVM_GetClassSigners */
889 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
891 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
895 /* JVM_SetClassSigners */
897 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
900 java_handle_objectarray_t *hoa;
902 TRACEJVMCALLS("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers);
904 c = LLNI_classinfo_unwrap(cls);
906 hoa = (java_handle_objectarray_t *) signers;
908 /* This call is ignored for primitive types and arrays. Signers
909 are only set once, ClassLoader.java, and thus shouldn't be
910 called with an array. Only the bootstrap loader creates
913 if (class_is_primitive(c) || class_is_array(c))
916 LLNI_classinfo_field_set(c, signers, hoa);
920 /* JVM_GetProtectionDomain */
922 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
926 TRACEJVMCALLS("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls);
928 c = LLNI_classinfo_unwrap(cls);
931 exceptions_throw_nullpointerexception();
935 /* Primitive types do not have a protection domain. */
937 if (class_is_primitive(c))
940 return (jobject) c->protectiondomain;
944 /* JVM_SetProtectionDomain */
946 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
948 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
952 /* JVM_DoPrivileged */
954 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
959 java_handle_t *result;
963 log_println("JVM_DoPrivileged: action=%p, context=%p, wrapException=%d", action, context, wrapException);
966 o = (java_handle_t *) action;
969 if (action == NULL) {
970 exceptions_throw_nullpointerexception();
974 /* lookup run() method (throw no exceptions) */
976 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
979 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
980 exceptions_throw_internalerror("No run method");
984 /* XXX It seems something with a privileged stack needs to be done
987 result = vm_call_method(m, o);
989 e = exceptions_get_and_clear_exception();
992 exceptions_throw_privilegedactionexception(e);
996 return (jobject) result;
1000 /* JVM_GetInheritedAccessControlContext */
1002 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1004 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1008 /* JVM_GetStackAccessControlContext */
1010 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1012 TRACEJVMCALLS("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls);
1014 /* XXX All stuff I tested so far works without that function. At
1015 some point we have to implement it, but I disable the output
1016 for now to make IcedTea happy. */
1022 /* JVM_IsArrayClass */
1024 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1027 log_println("JVM_IsArrayClass: cls=%p", cls);
1029 return class_is_array(LLNI_classinfo_unwrap(cls));
1033 /* JVM_IsPrimitiveClass */
1035 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1039 c = LLNI_classinfo_unwrap(cls);
1042 log_println("JVM_IsPrimitiveClass(cls=%p)", cls);
1045 return class_is_primitive(c);
1049 /* JVM_GetComponentType */
1051 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1053 classinfo *component;
1056 TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
1058 c = LLNI_classinfo_unwrap(cls);
1060 component = class_get_componenttype(c);
1062 return (jclass) LLNI_classinfo_wrap(component);
1066 /* JVM_GetClassModifiers */
1068 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1073 TRACEJVMCALLS("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls);
1075 c = LLNI_classinfo_unwrap(cls);
1077 flags = class_get_modifiers(c, false);
1083 /* JVM_GetDeclaredClasses */
1085 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1088 java_handle_objectarray_t *oa;
1090 TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
1092 c = LLNI_classinfo_unwrap(ofClass);
1094 oa = class_get_declaredclasses(c, false);
1096 return (jobjectArray) oa;
1100 /* JVM_GetDeclaringClass */
1102 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1107 TRACEJVMCALLS("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass);
1109 c = LLNI_classinfo_unwrap(ofClass);
1111 dc = class_get_declaringclass(c);
1113 return (jclass) LLNI_classinfo_wrap(dc);
1117 /* JVM_GetClassSignature */
1119 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1125 TRACEJVMCALLS("JVM_GetClassSignature(env=%p, cls=%p)", env, cls);
1127 c = LLNI_classinfo_unwrap(cls);
1129 /* Get the signature of the class. */
1131 u = class_get_signature(c);
1136 /* Convert UTF-string to a Java-string. */
1138 s = javastring_new(u);
1144 /* JVM_GetClassAnnotations */
1146 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1148 classinfo *c = NULL; /* classinfo for 'cls' */
1149 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1151 TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
1154 exceptions_throw_nullpointerexception();
1158 c = LLNI_classinfo_unwrap(cls);
1160 /* get annotations: */
1161 annotations = class_get_annotations(c);
1163 return (jbyteArray)annotations;
1167 /* JVM_GetFieldAnnotations */
1169 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1171 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1172 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1174 TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
1176 if (field == NULL) {
1177 exceptions_throw_nullpointerexception();
1181 rf = (java_lang_reflect_Field*)field;
1183 LLNI_field_get_ref(rf, annotations, ba);
1185 return (jbyteArray)ba;
1189 /* JVM_GetMethodAnnotations */
1191 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1193 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1194 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1196 TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
1198 if (method == NULL) {
1199 exceptions_throw_nullpointerexception();
1203 rm = (java_lang_reflect_Method*)method;
1205 LLNI_field_get_ref(rm, annotations, ba);
1207 return (jbyteArray)ba;
1211 /* JVM_GetMethodDefaultAnnotationValue */
1213 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1215 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1216 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1218 TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
1220 if (method == NULL) {
1221 exceptions_throw_nullpointerexception();
1225 rm = (java_lang_reflect_Method*)method;
1227 LLNI_field_get_ref(rm, annotationDefault, ba);
1229 return (jbyteArray)ba;
1233 /* JVM_GetMethodParameterAnnotations */
1235 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1237 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1238 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1240 TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
1242 if (method == NULL) {
1243 exceptions_throw_nullpointerexception();
1247 rm = (java_lang_reflect_Method*)method;
1249 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1251 return (jbyteArray)ba;
1255 /* JVM_GetClassDeclaredFields */
1257 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1260 log_println("JVM_GetClassDeclaredFields: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1262 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1266 /* JVM_GetClassDeclaredMethods */
1268 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1271 log_println("JVM_GetClassDeclaredMethods: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1273 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1277 /* JVM_GetClassDeclaredConstructors */
1279 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1282 log_println("JVM_GetClassDeclaredConstructors: ofClass=%p, publicOnly=%d", ofClass, publicOnly);
1284 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1288 /* JVM_GetClassAccessFlags */
1290 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1294 TRACEJVMCALLS("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls);
1296 c = LLNI_classinfo_unwrap(cls);
1298 /* Primitive type classes have the correct access flags. */
1300 return c->flags & ACC_CLASS_REFLECT_MASK;
1304 /* JVM_GetClassConstantPool */
1306 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1308 #if defined(ENABLE_ANNOTATIONS)
1309 sun_reflect_ConstantPool *constantPool = NULL;
1310 /* constant pool object for the class refered by 'cls' */
1311 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1312 /* constantPoolOop field of the constant pool object */
1314 TRACEJVMCALLS("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls);
1317 (sun_reflect_ConstantPool*)native_new_and_init(
1318 class_sun_reflect_ConstantPool);
1320 if (constantPool == NULL) {
1325 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1327 return (jobject)constantPool;
1329 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1335 /* JVM_ConstantPoolGetSize */
1337 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1339 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1341 TRACEJVMCALLS("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool);
1343 c = LLNI_classinfo_unwrap(jcpool);
1349 /* JVM_ConstantPoolGetClassAt */
1351 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1353 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1354 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1355 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1357 TRACEJVMCALLS("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index);
1359 c = LLNI_classinfo_unwrap(jcpool);
1361 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1364 exceptions_throw_illegalargumentexception();
1368 result = resolve_classref_eager(ref);
1370 return (jclass) LLNI_classinfo_wrap(result);
1374 /* JVM_ConstantPoolGetClassAtIfLoaded */
1376 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1378 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1379 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1380 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1382 TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index);
1384 c = LLNI_classinfo_unwrap(jcpool);
1386 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1389 exceptions_throw_illegalargumentexception();
1393 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1397 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1401 return (jclass) LLNI_classinfo_wrap(result);
1405 /* JVM_ConstantPoolGetMethodAt */
1407 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1409 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1410 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1412 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
1414 cls = LLNI_classinfo_unwrap(jcpool);
1415 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1418 exceptions_throw_illegalargumentexception();
1422 /* XXX: is that right? or do I have to use resolve_method_*? */
1423 return (jobject)reflect_method_new(ref->p.method);
1427 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1429 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1431 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1432 classinfo *c = NULL; /* resolved declaring class of the method */
1433 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1435 TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1437 cls = LLNI_classinfo_unwrap(jcpool);
1438 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1441 exceptions_throw_illegalargumentexception();
1445 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1449 if (c == NULL || !(c->state & CLASS_LOADED)) {
1453 return (jobject)reflect_method_new(ref->p.method);
1457 /* JVM_ConstantPoolGetFieldAt */
1459 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1461 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1462 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1464 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
1466 cls = LLNI_classinfo_unwrap(jcpool);
1467 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1470 exceptions_throw_illegalargumentexception();
1474 return (jobject)reflect_field_new(ref->p.field);
1478 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1480 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1482 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1483 classinfo *c; /* resolved declaring class for the field */
1484 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1486 TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
1488 cls = LLNI_classinfo_unwrap(jcpool);
1489 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1492 exceptions_throw_illegalargumentexception();
1496 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1500 if (c == NULL || !(c->state & CLASS_LOADED)) {
1504 return (jobject)reflect_field_new(ref->p.field);
1508 /* JVM_ConstantPoolGetMemberRefInfoAt */
1510 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1512 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1514 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1520 /* JVM_ConstantPoolGetIntAt */
1522 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1524 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1525 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1527 TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
1529 cls = LLNI_classinfo_unwrap(jcpool);
1530 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1533 exceptions_throw_illegalargumentexception();
1541 /* JVM_ConstantPoolGetLongAt */
1543 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1545 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1546 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1548 TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
1550 cls = LLNI_classinfo_unwrap(jcpool);
1551 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1554 exceptions_throw_illegalargumentexception();
1562 /* JVM_ConstantPoolGetFloatAt */
1564 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1566 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1567 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1569 TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
1571 cls = LLNI_classinfo_unwrap(jcpool);
1572 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1575 exceptions_throw_illegalargumentexception();
1583 /* JVM_ConstantPoolGetDoubleAt */
1585 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1587 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1588 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1590 TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
1592 cls = LLNI_classinfo_unwrap(jcpool);
1593 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1596 exceptions_throw_illegalargumentexception();
1604 /* JVM_ConstantPoolGetStringAt */
1606 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1608 utf *ref; /* utf object for the string in constant pool at index 'index' */
1609 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1611 TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
1613 cls = LLNI_classinfo_unwrap(jcpool);
1614 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1617 exceptions_throw_illegalargumentexception();
1621 /* XXX: I hope literalstring_new is the right Function. */
1622 return (jstring)literalstring_new(ref);
1626 /* JVM_ConstantPoolGetUTF8At */
1628 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1630 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1631 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1633 TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
1635 cls = LLNI_classinfo_unwrap(jcpool);
1636 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1639 exceptions_throw_illegalargumentexception();
1643 /* XXX: I hope literalstring_new is the right Function. */
1644 return (jstring)literalstring_new(ref);
1648 /* JVM_DesiredAssertionStatus */
1650 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1652 #if defined(ENABLE_ASSERTION)
1653 assertion_name_t *item;
1658 TRACEJVMCALLS("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls);
1660 c = LLNI_classinfo_unwrap(cls);
1662 if (c->classloader == NULL) {
1663 status = (jboolean)assertion_system_enabled;
1666 status = (jboolean)assertion_user_enabled;
1669 if (list_assertion_names != NULL) {
1670 item = (assertion_name_t *)list_first(list_assertion_names);
1671 while (item != NULL) {
1672 name = utf_new_char(item->name);
1673 if (name == c->packagename) {
1674 status = (jboolean)item->enabled;
1676 else if (name == c->name) {
1677 status = (jboolean)item->enabled;
1680 item = (assertion_name_t *)list_next(list_assertion_names, item);
1686 return (jboolean)false;
1691 /* JVM_AssertionStatusDirectives */
1693 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1696 java_lang_AssertionStatusDirectives *o;
1697 java_handle_objectarray_t *classes;
1698 java_handle_objectarray_t *packages;
1699 java_booleanarray_t *classEnabled;
1700 java_booleanarray_t *packageEnabled;
1701 #if defined(ENABLE_ASSERTION)
1702 assertion_name_t *item;
1707 TRACEJVMCALLS("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused);
1709 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1714 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1719 #if defined(ENABLE_ASSERTION)
1720 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1722 classes = builtin_anewarray(0, class_java_lang_Object);
1724 if (classes == NULL)
1727 #if defined(ENABLE_ASSERTION)
1728 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1730 packages = builtin_anewarray(0, class_java_lang_Object);
1732 if (packages == NULL)
1735 #if defined(ENABLE_ASSERTION)
1736 classEnabled = builtin_newarray_boolean(assertion_class_count);
1738 classEnabled = builtin_newarray_boolean(0);
1740 if (classEnabled == NULL)
1743 #if defined(ENABLE_ASSERTION)
1744 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1746 packageEnabled = builtin_newarray_boolean(0);
1748 if (packageEnabled == NULL)
1751 #if defined(ENABLE_ASSERTION)
1752 /* initialize arrays */
1754 if (list_assertion_names != NULL) {
1758 item = (assertion_name_t *)list_first(list_assertion_names);
1759 while (item != NULL) {
1760 js = javastring_new_from_ascii(item->name);
1765 if (item->package == false) {
1766 classes->data[i] = js;
1767 classEnabled->data[i] = (jboolean) item->enabled;
1771 packages->data[j] = js;
1772 packageEnabled->data[j] = (jboolean) item->enabled;
1776 item = (assertion_name_t *)list_next(list_assertion_names, item);
1781 /* set instance fields */
1783 o->classes = classes;
1784 o->packages = packages;
1785 o->classEnabled = classEnabled;
1786 o->packageEnabled = packageEnabled;
1792 /* JVM_GetClassNameUTF */
1794 const char* JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1796 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1800 /* JVM_GetClassCPTypes */
1802 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1804 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1808 /* JVM_GetClassCPEntriesCount */
1810 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1812 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1816 /* JVM_GetClassFieldsCount */
1818 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1820 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1824 /* JVM_GetClassMethodsCount */
1826 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1828 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1832 /* JVM_GetMethodIxExceptionIndexes */
1834 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1836 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1840 /* JVM_GetMethodIxExceptionsCount */
1842 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1844 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1848 /* JVM_GetMethodIxByteCode */
1850 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1852 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1856 /* JVM_GetMethodIxByteCodeLength */
1858 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1860 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1864 /* JVM_GetMethodIxExceptionTableEntry */
1866 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1868 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1872 /* JVM_GetMethodIxExceptionTableLength */
1874 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1876 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1880 /* JVM_GetMethodIxModifiers */
1882 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1884 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1888 /* JVM_GetFieldIxModifiers */
1890 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1892 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1896 /* JVM_GetMethodIxLocalsCount */
1898 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1900 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1904 /* JVM_GetMethodIxArgsSize */
1906 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1908 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1912 /* JVM_GetMethodIxMaxStack */
1914 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1916 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1920 /* JVM_IsConstructorIx */
1922 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1924 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1928 /* JVM_GetMethodIxNameUTF */
1930 const char* JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1932 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1936 /* JVM_GetMethodIxSignatureUTF */
1938 const char* JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1940 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1944 /* JVM_GetCPFieldNameUTF */
1946 const char* JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1948 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1952 /* JVM_GetCPMethodNameUTF */
1954 const char* JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1956 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1960 /* JVM_GetCPMethodSignatureUTF */
1962 const char* JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1964 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1968 /* JVM_GetCPFieldSignatureUTF */
1970 const char* JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1972 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1976 /* JVM_GetCPClassNameUTF */
1978 const char* JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1980 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
1984 /* JVM_GetCPFieldClassNameUTF */
1986 const char* JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1988 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
1992 /* JVM_GetCPMethodClassNameUTF */
1994 const char* JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1996 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2000 /* JVM_GetCPFieldModifiers */
2002 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2004 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2008 /* JVM_GetCPMethodModifiers */
2010 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2012 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2016 /* JVM_ReleaseUTF */
2018 void JVM_ReleaseUTF(const char *utf)
2020 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2024 /* JVM_IsSameClassPackage */
2026 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2028 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2034 jint JVM_Open(const char *fname, jint flags, jint mode)
2039 log_println("JVM_Open: fname=%s, flags=%d, mode=%d", fname, flags, mode);
2042 result = open(fname, flags, mode);
2050 /* XXX don't know what to do here */
2051 /* return JVM_EEXIST; */
2062 jint JVM_Close(jint fd)
2065 log_println("JVM_Close: fd=%d", fd);
2073 jint JVM_Read(jint fd, char *buf, jint nbytes)
2076 log_println("JVM_Read: fd=%d, buf=%p, nbytes=%d", fd, buf, nbytes);
2078 return read(fd, buf, nbytes);
2084 jint JVM_Write(jint fd, char *buf, jint nbytes)
2087 log_println("JVM_Write: fd=%d, buf=%s, nbytes=%d", fd, buf, nbytes);
2089 return write(fd, buf, nbytes);
2095 jint JVM_Available(jint fd, jlong *pbytes)
2097 #if defined(FIONREAD)
2100 TRACEJVMCALLS("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes);
2104 if (ioctl(fd, FIONREAD, &bytes) < 0)
2111 # error FIONREAD not defined
2118 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2120 TRACEJVMCALLS("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence);
2122 return (jlong) lseek(fd, (off_t) offset, whence);
2128 jint JVM_SetLength(jint fd, jlong length)
2130 TRACEJVMCALLS("JVM_SetLength(fd=%d, length=%ld)", length);
2132 return ftruncate(fd, length);
2138 jint JVM_Sync(jint fd)
2140 TRACEJVMCALLS("JVM_Sync(fd=%d)", fd);
2146 /* JVM_StartThread */
2148 void JVM_StartThread(JNIEnv* env, jobject jthread)
2151 log_println("JVM_StartThread: jthread=%p", jthread);
2153 _Jv_java_lang_Thread_start((java_lang_Thread *) jthread, 0);
2157 /* JVM_StopThread */
2159 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2161 log_println("JVM_StopThread: IMPLEMENT ME!");
2165 /* JVM_IsThreadAlive */
2167 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2173 TRACEJVMCALLS("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread);
2175 /* XXX this is just a quick hack */
2177 for (t = threads_list_first(); t != NULL; t = threads_list_next(t)) {
2178 LLNI_equals(t->object, jthread, equal);
2184 /* The threadobject is null when a thread is created in Java. The
2185 priority is set later during startup. */
2190 result = threads_thread_is_alive(t);
2196 /* JVM_SuspendThread */
2198 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2200 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2204 /* JVM_ResumeThread */
2206 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2208 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2212 /* JVM_SetThreadPriority */
2214 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2217 log_println("JVM_SetThreadPriority: jthread=%p, prio=%d", jthread, prio);
2219 _Jv_java_lang_Thread_setPriority((java_lang_Thread *) jthread, prio);
2225 void JVM_Yield(JNIEnv *env, jclass threadClass)
2227 TRACEJVMCALLS("JVM_Yield(env=%p, threadClass=%p)", env, threadClass);
2235 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2238 log_println("JVM_Sleep: threadClass=%p, millis=%ld", threadClass, millis);
2240 _Jv_java_lang_Thread_sleep(millis);
2244 /* JVM_CurrentThread */
2246 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2249 log_println("JVM_CurrentThread: threadClass=%p", threadClass);
2251 return (jobject) _Jv_java_lang_Thread_currentThread();
2255 /* JVM_CountStackFrames */
2257 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2259 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2265 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2267 log_println("JVM_Interrupt: IMPLEMENT ME!");
2271 /* JVM_IsInterrupted */
2273 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2276 log_println("JVM_IsInterrupted: jthread=%p, clear_interrupted=%d", jthread, clear_interrupted);
2278 /* XXX do something with clear_interrupted */
2279 return _Jv_java_lang_Thread_isInterrupted((java_lang_Thread *) jthread);
2285 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2290 TRACEJVMCALLS("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj);
2292 h = (java_handle_t *) obj;
2295 exceptions_throw_nullpointerexception();
2299 result = lock_is_held_by_current_thread(h);
2305 /* JVM_DumpAllStacks */
2307 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2309 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2313 /* JVM_CurrentLoadedClass */
2315 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2317 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2321 /* JVM_CurrentClassLoader */
2323 jobject JVM_CurrentClassLoader(JNIEnv *env)
2325 /* XXX if a method in a class in a trusted loader is in a
2326 doPrivileged, return NULL */
2328 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2332 /* JVM_GetClassContext */
2334 jobjectArray JVM_GetClassContext(JNIEnv *env)
2337 log_println("JVM_GetClassContext");
2339 return (jobjectArray) stacktrace_getClassContext();
2343 /* JVM_ClassDepth */
2345 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2347 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2351 /* JVM_ClassLoaderDepth */
2353 jint JVM_ClassLoaderDepth(JNIEnv *env)
2355 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2359 /* JVM_GetSystemPackage */
2361 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2367 TRACEJVMCALLS("JVM_GetSystemPackage(env=%p, name=%p)", env, name);
2369 /* s = package_find(name); */
2370 u = javastring_toutf(name, false);
2371 result = package_find(u);
2373 s = javastring_new(result);
2381 /* JVM_GetSystemPackages */
2383 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2385 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2389 /* JVM_AllocateNewObject */
2391 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2393 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2397 /* JVM_AllocateNewArray */
2399 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2401 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2405 /* JVM_LatestUserDefinedLoader */
2407 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2409 log_println("JVM_LatestUserDefinedLoader: IMPLEMENT ME!");
2413 /* JVM_LoadClass0 */
2415 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2417 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2421 /* JVM_GetArrayLength */
2423 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2427 TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
2429 a = (java_handle_t *) arr;
2431 return array_length_get(a);
2435 /* JVM_GetArrayElement */
2437 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2442 TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
2444 a = (java_handle_t *) arr;
2446 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2447 /* exceptions_throw_illegalargumentexception(); */
2451 o = array_element_get(a, index);
2457 /* JVM_GetPrimitiveArrayElement */
2459 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2461 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2465 /* JVM_SetArrayElement */
2467 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2470 java_handle_t *value;
2472 TRACEJVMCALLS("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val);
2474 a = (java_handle_t *) arr;
2475 value = (java_handle_t *) val;
2477 array_element_set(a, index, value);
2481 /* JVM_SetPrimitiveArrayElement */
2483 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2485 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2491 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2496 java_handle_objectarray_t *oa;
2498 TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
2500 if (eltClass == NULL) {
2501 exceptions_throw_nullpointerexception();
2505 /* NegativeArraySizeException is checked in builtin_newarray. */
2507 c = LLNI_classinfo_unwrap(eltClass);
2509 /* create primitive or object array */
2511 if (class_is_primitive(c)) {
2512 pc = primitive_arrayclass_get_by_name(c->name);
2513 a = builtin_newarray(length, pc);
2518 oa = builtin_anewarray(length, c);
2520 return (jobject) oa;
2525 /* JVM_NewMultiArray */
2527 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2530 java_handle_intarray_t *ia;
2536 java_handle_objectarray_t *a;
2538 TRACEJVMCALLS("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim);
2540 if (eltClass == NULL) {
2541 exceptions_throw_nullpointerexception();
2545 /* NegativeArraySizeException is checked in builtin_newarray. */
2547 c = LLNI_classinfo_unwrap(eltClass);
2549 /* XXX This is just a quick hack to get it working. */
2551 ia = (java_handle_intarray_t *) dim;
2553 length = array_length_get(ia);
2555 dims = MNEW(long, length);
2557 for (i = 0; i < length; i++) {
2558 value = LLNI_array_direct(ia, i);
2559 dims[i] = (long) value;
2562 /* Create an array-class if necessary. */
2564 if (class_is_primitive(c))
2565 ac = primitive_arrayclass_get_by_name(c->name);
2567 ac = class_array_of(c, true);
2572 a = builtin_multianewarray(length, ac, dims);
2578 /* JVM_InitializeSocketLibrary */
2580 jint JVM_InitializeSocketLibrary()
2582 log_println("JVM_InitializeSocketLibrary: IMPLEMENT ME!");
2588 jint JVM_Socket(jint domain, jint type, jint protocol)
2590 TRACEJVMCALLS("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol);
2592 return socket(domain, type, protocol);
2596 /* JVM_SocketClose */
2598 jint JVM_SocketClose(jint fd)
2600 TRACEJVMCALLS("JVM_SocketClose(fd=%d)", fd);
2606 /* JVM_SocketShutdown */
2608 jint JVM_SocketShutdown(jint fd, jint howto)
2610 TRACEJVMCALLS("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto);
2612 return shutdown(fd, howto);
2618 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2620 log_println("JVM_Recv: IMPLEMENT ME!");
2626 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2628 log_println("JVM_Send: IMPLEMENT ME!");
2634 jint JVM_Timeout(int fd, long timeout)
2636 log_println("JVM_Timeout: IMPLEMENT ME!");
2642 jint JVM_Listen(jint fd, jint count)
2644 TRACEJVMCALLS("JVM_Listen(fd=%d, count=%d)", fd, count);
2646 return listen(fd, count);
2652 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2654 TRACEJVMCALLS("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len);
2656 return connect(fd, him, len);
2662 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2664 log_println("JVM_Bind: IMPLEMENT ME!");
2670 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2672 TRACEJVMCALLS("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len);
2674 return accept(fd, him, (socklen_t *) len);
2680 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2682 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2686 /* JVM_GetSockName */
2688 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2690 TRACEJVMCALLS("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len);
2692 return getsockname(fd, him, (socklen_t *) len);
2698 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2700 log_println("JVM_SendTo: IMPLEMENT ME!");
2704 /* JVM_SocketAvailable */
2706 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2708 #if defined(FIONREAD)
2711 TRACEJVMCALLS("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes);
2715 if (ioctl(fd, FIONREAD, &bytes) < 0)
2722 # error FIONREAD not defined
2727 /* JVM_GetSockOpt */
2729 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2731 #if defined(HAVE_GETSOCKOPT)
2732 TRACEJVMCALLS("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen);
2734 return getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2736 # error getsockopt not available
2741 /* JVM_SetSockOpt */
2743 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2745 #if defined(HAVE_SETSOCKOPT)
2746 TRACEJVMCALLS("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen);
2748 return setsockopt(fd, level, optname, optval, optlen);
2750 # error setsockopt not available
2755 /* JVM_GetHostName */
2757 int JVM_GetHostName(char* name, int namelen)
2759 TRACEJVMCALLS("JVM_GetHostName(name=%s, namelen=%d)", name, namelen);
2761 return gethostname(name, namelen);
2765 /* JVM_GetHostByAddr */
2767 struct hostent* JVM_GetHostByAddr(const char* name, int len, int type)
2769 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2773 /* JVM_GetHostByName */
2775 struct hostent* JVM_GetHostByName(char* name)
2777 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2781 /* JVM_GetProtoByName */
2783 struct protoent* JVM_GetProtoByName(char* name)
2785 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2789 /* JVM_LoadLibrary */
2791 void *JVM_LoadLibrary(const char *name)
2795 TRACEJVMCALLS("JVM_LoadLibrary(name=%s)", name);
2797 u = utf_new_char(name);
2799 return native_library_open(u);
2803 /* JVM_UnloadLibrary */
2805 void JVM_UnloadLibrary(void* handle)
2807 log_println("JVM_UnloadLibrary: IMPLEMENT ME!");
2811 /* JVM_FindLibraryEntry */
2813 void *JVM_FindLibraryEntry(void *handle, const char *name)
2817 TRACEJVMCALLS("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name);
2819 symbol = lt_dlsym(handle, name);
2827 jboolean JVM_IsNaN(jdouble a)
2829 log_println("JVM_IsNaN: IMPLEMENT ME!");
2833 /* JVM_IsSupportedJNIVersion */
2835 jboolean JVM_IsSupportedJNIVersion(jint version)
2837 TRACEJVMCALLS("JVM_IsSupportedJNIVersion(version=%d)", version);
2839 return jni_version_check(version);
2843 /* JVM_InternString */
2845 jstring JVM_InternString(JNIEnv *env, jstring str)
2847 TRACEJVMCALLS("JVM_InternString(env=%p, str=%p)", env, str);
2849 return (jstring) javastring_intern((java_handle_t *) str);
2853 /* JVM_RawMonitorCreate */
2855 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2860 log_println("JVM_RawMonitorCreate");
2863 o = NEW(java_object_t);
2865 lock_init_object_lock(o);
2871 /* JVM_RawMonitorDestroy */
2873 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
2876 log_println("JVM_RawMonitorDestroy: mon=%p", mon);
2878 FREE(mon, java_object_t);
2882 /* JVM_RawMonitorEnter */
2884 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
2887 log_println("JVM_RawMonitorEnter: mon=%p", mon);
2889 (void) lock_monitor_enter((java_object_t *) mon);
2895 /* JVM_RawMonitorExit */
2897 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
2900 log_println("JVM_RawMonitorExit: mon=%p", mon);
2902 (void) lock_monitor_exit((java_object_t *) mon);
2906 /* JVM_SetPrimitiveFieldValues */
2908 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2910 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
2914 /* JVM_GetPrimitiveFieldValues */
2916 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
2918 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
2922 /* JVM_AccessVMBooleanFlag */
2924 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
2926 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
2930 /* JVM_AccessVMIntFlag */
2932 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
2934 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
2938 /* JVM_VMBreakPoint */
2940 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
2942 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
2946 /* JVM_GetClassFields */
2948 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
2950 log_println("JVM_GetClassFields: IMPLEMENT ME!");
2954 /* JVM_GetClassMethods */
2956 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
2958 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
2962 /* JVM_GetClassConstructors */
2964 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
2966 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
2970 /* JVM_GetClassField */
2972 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
2974 log_println("JVM_GetClassField: IMPLEMENT ME!");
2978 /* JVM_GetClassMethod */
2980 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
2982 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
2986 /* JVM_GetClassConstructor */
2988 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
2990 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
2994 /* JVM_NewInstance */
2996 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
2998 log_println("JVM_NewInstance: IMPLEMENT ME!");
3004 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3006 log_println("JVM_GetField: IMPLEMENT ME!");
3010 /* JVM_GetPrimitiveField */
3012 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3014 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3020 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3022 log_println("JVM_SetField: IMPLEMENT ME!");
3026 /* JVM_SetPrimitiveField */
3028 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3030 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3034 /* JVM_InvokeMethod */
3036 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3039 log_println("JVM_InvokeMethod: method=%p, obj=%p, args0=%p", method, obj, args0);
3041 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
3045 /* JVM_NewInstanceFromConstructor */
3047 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
3050 log_println("JVM_NewInstanceFromConstructor: c=%p, args0=%p", c, args0);
3052 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
3056 /* JVM_SupportsCX8 */
3058 jboolean JVM_SupportsCX8()
3060 TRACEJVMCALLS("JVM_SupportsCX8()");
3070 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3072 log_println("JVM_CX8Field: IMPLEMENT ME!");
3076 /* JVM_GetAllThreads */
3078 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3080 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3084 /* JVM_DumpThreads */
3086 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3088 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3092 /* JVM_GetManagement */
3094 void* JVM_GetManagement(jint version)
3096 log_println("JVM_GetManagement: IMPLEMENT ME!");
3100 /* JVM_InitAgentProperties */
3102 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3104 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3108 /* JVM_GetEnclosingMethodInfo */
3110 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3112 log_println("JVM_GetEnclosingMethodInfo: IMPLEMENT ME!");
3116 /* JVM_GetThreadStateValues */
3118 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3120 java_handle_intarray_t *ia;
3122 TRACEJVMCALLS("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3123 env, javaThreadState);
3125 /* If new thread states are added in future JDK and VM versions,
3126 this should check if the JDK version is compatible with thread
3127 states supported by the VM. Return NULL if not compatible.
3129 This function must map the VM java_lang_Thread::ThreadStatus
3130 to the Java thread state that the JDK supports. */
3132 switch (javaThreadState) {
3133 case THREAD_STATE_NEW:
3134 ia = builtin_newarray_int(1);
3139 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3142 case THREAD_STATE_RUNNABLE:
3143 ia = builtin_newarray_int(1);
3148 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3151 case THREAD_STATE_BLOCKED:
3152 ia = builtin_newarray_int(1);
3157 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3160 case THREAD_STATE_WAITING:
3161 ia = builtin_newarray_int(2);
3166 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3167 /* XXX Implement parked stuff. */
3168 /* array_intarray_element_set(ia, 1, PARKED); */
3171 case THREAD_STATE_TIMED_WAITING:
3172 ia = builtin_newarray_int(3);
3177 /* XXX Not sure about that one. */
3178 /* array_intarray_element_set(ia, 0, SLEEPING); */
3179 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3180 /* XXX Implement parked stuff. */
3181 /* array_intarray_element_set(ia, 2, PARKED); */
3184 case THREAD_STATE_TERMINATED:
3185 ia = builtin_newarray_int(1);
3190 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3194 /* Unknown state - probably incompatible JDK version */
3198 return (jintArray) ia;
3202 /* JVM_GetThreadStateNames */
3204 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3206 java_handle_intarray_t *ia;
3207 java_handle_objectarray_t *oa;
3210 TRACEJVMCALLS("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3211 env, javaThreadState, values);
3213 ia = (java_handle_intarray_t *) values;
3215 /* If new thread states are added in future JDK and VM versions,
3216 this should check if the JDK version is compatible with thread
3217 states supported by the VM. Return NULL if not compatible.
3219 This function must map the VM java_lang_Thread::ThreadStatus
3220 to the Java thread state that the JDK supports. */
3222 if (values == NULL) {
3223 exceptions_throw_nullpointerexception();
3227 switch (javaThreadState) {
3228 case THREAD_STATE_NEW:
3229 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3231 oa = builtin_anewarray(1, class_java_lang_String);
3236 s = javastring_new(utf_new_char("NEW"));
3241 array_objectarray_element_set(oa, 0, s);
3244 case THREAD_STATE_RUNNABLE:
3245 oa = builtin_anewarray(1, class_java_lang_String);
3250 s = javastring_new(utf_new_char("RUNNABLE"));
3255 array_objectarray_element_set(oa, 0, s);
3258 case THREAD_STATE_BLOCKED:
3259 oa = builtin_anewarray(1, class_java_lang_String);
3264 s = javastring_new(utf_new_char("BLOCKED"));
3269 array_objectarray_element_set(oa, 0, s);
3272 case THREAD_STATE_WAITING:
3273 oa = builtin_anewarray(2, class_java_lang_String);
3278 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3279 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3284 array_objectarray_element_set(oa, 0, s);
3285 /* array_objectarray_element_set(oa, 1, s); */
3288 case THREAD_STATE_TIMED_WAITING:
3289 oa = builtin_anewarray(3, class_java_lang_String);
3294 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3295 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3296 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3301 /* array_objectarray_element_set(oa, 0, s); */
3302 array_objectarray_element_set(oa, 0, s);
3303 /* array_objectarray_element_set(oa, 2, s); */
3306 case THREAD_STATE_TERMINATED:
3307 oa = builtin_anewarray(1, class_java_lang_String);
3312 s = javastring_new(utf_new_char("TERMINATED"));
3317 array_objectarray_element_set(oa, 0, s);
3321 /* Unknown state - probably incompatible JDK version */
3325 return (jobjectArray) oa;
3329 /* JVM_GetVersionInfo */
3331 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3333 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3337 /* OS: JVM_RegisterSignal */
3339 void *JVM_RegisterSignal(jint sig, void *handler)
3341 functionptr newHandler;
3343 TRACEJVMCALLS("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler);
3345 if (handler == (void *) 2)
3346 newHandler = (functionptr) signal_thread_handler;
3348 newHandler = (functionptr) (uintptr_t) handler;
3355 /* These signals are already used by the VM. */
3359 /* This signal is used by the VM to dump thread stacks unless
3360 ReduceSignalUsage is set, in which case the user is allowed
3361 to set his own _native_ handler for this signal; thus, in
3362 either case, we do not allow JVM_RegisterSignal to change
3372 signal_register_signal(sig, newHandler, 0);
3374 /* XXX Should return old handler. */
3380 /* OS: JVM_RaiseSignal */
3382 jboolean JVM_RaiseSignal(jint sig)
3384 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3389 /* OS: JVM_FindSignal */
3391 jint JVM_FindSignal(const char *name)
3393 TRACEJVMCALLS("JVM_FindSignal(name=%s)", name);
3395 #if defined(__LINUX__)
3396 if (strcmp(name, "HUP") == 0)
3399 if (strcmp(name, "INT") == 0)
3402 if (strcmp(name, "TERM") == 0)
3405 # error not implemented for this OS
3413 * These are local overrides for various environment variables in Emacs.
3414 * Please do not remove this and leave it at the end of the file, where
3415 * Emacs will automagically detect them.
3416 * ---------------------------------------------------------------------
3419 * indent-tabs-mode: t