1 /* src/native/vm/sun/jvm.c - HotSpot JVM interface functions
3 Copyright (C) 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
36 #if defined(HAVE_SYS_IOCTL_H)
37 #define BSD_COMP /* Get FIONREAD on Solaris2 */
38 #include <sys/ioctl.h>
41 #include <sys/socket.h>
43 #include <sys/types.h>
47 #include "mm/memory.h"
49 #include "native/jni.h"
50 #include "native/llni.h"
51 #include "native/native.h"
53 #include "native/include/java_lang_AssertionStatusDirectives.h"
54 #include "native/include/java_lang_String.h" /* required by j.l.CL */
55 #include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
56 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
57 #include "native/include/java_lang_StackTraceElement.h"
58 #include "native/include/java_lang_Throwable.h"
59 #include "native/include/java_security_ProtectionDomain.h"
61 #if defined(ENABLE_ANNOTATIONS)
62 #include "native/include/sun_reflect_ConstantPool.h"
65 #include "native/vm/java_lang_Class.h"
66 #include "native/vm/reflect.h"
68 #include "native/vm/sun/hpi.h"
70 #include "threads/lock-common.h"
71 #include "threads/thread.h"
73 #include "toolbox/logging.h"
74 #include "toolbox/list.h"
78 #if defined(ENABLE_ASSERTION)
79 #include "vm/assertion.h"
82 #include "vm/builtin.h"
83 #include "vm/exceptions.h"
84 #include "vm/global.h"
85 #include "vm/initialize.h"
86 #include "vm/package.h"
87 #include "vm/primitive.h"
88 #include "vm/properties.h"
89 #include "vm/resolve.h"
90 #include "vm/signallocal.h"
91 #include "vm/stringlocal.h"
94 #include "vm/jit/stacktrace.h"
96 #include "vmcore/classcache.h"
97 #include "vmcore/options.h"
98 #include "vmcore/system.h"
101 /* debugging macros ***********************************************************/
105 # define TRACEJVMCALLS(x) \
107 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
112 # define TRACEJVMCALLSENTER(x) \
114 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
120 # define TRACEJVMCALLSEXIT(x) \
122 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
128 # define TRACEJVMCALLSVERBOSE(x) \
130 if (opt_TraceJVMCallsVerbose) { \
135 # define PRINTJVMWARNINGS(x)
137 /* if (opt_PrintJVMWarnings) { \ */
138 /* log_println x; \ */
144 # define TRACEJVMCALLS(x)
145 # define TRACEJVMCALLSENTER(x)
146 # define TRACEJVMCALLSEXIT(x)
147 # define TRACEJVMCALLSVERBOSE(x)
148 # define PRINTJVMWARNINGS(x)
154 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
155 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
156 /* and build number (xx) */
157 unsigned int update_version : 8; /* Update release version (uu) */
158 unsigned int special_update_version : 8; /* Special update release version (c) */
159 unsigned int reserved1 : 16;
160 unsigned int reserved2;
162 /* The following bits represents JVM supports that JDK has dependency on.
163 * JDK can use these bits to determine which JVM version
164 * and support it has to maintain runtime compatibility.
166 * When a new bit is added in a minor or update release, make sure
167 * the new bit is also added in the main/baseline.
169 unsigned int is_attachable : 1;
177 * A structure used to a capture exception table entry in a Java method.
184 } JVM_ExceptionTableEntryType;
187 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
189 if ((intptr_t) count <= 0)
192 return vsnprintf(str, count, fmt, args);
196 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
202 len = jio_vsnprintf(str, count, fmt, ap);
209 int jio_fprintf(FILE* f, const char *fmt, ...)
211 log_println("jio_fprintf: IMPLEMENT ME!");
217 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
219 log_println("jio_vfprintf: IMPLEMENT ME!");
225 int jio_printf(const char *fmt, ...)
227 log_println("jio_printf: IMPLEMENT ME!");
233 /* JVM_GetInterfaceVersion */
235 jint JVM_GetInterfaceVersion()
237 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
239 #define JVM_INTERFACE_VERSION 4
241 return JVM_INTERFACE_VERSION;
245 /* JVM_CurrentTimeMillis */
247 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
249 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
251 return (jlong) builtin_currenttimemillis();
257 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
259 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
261 return (jlong) builtin_nanotime();
267 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
272 s = (java_handle_t *) src;
273 d = (java_handle_t *) dst;
275 TRACEJVMCALLSVERBOSE(("JVM_ArrayCopy(env=%p, ignored=%p, src=%p, src_pos=%d, dst=%p, dst_pos=%d, length=%d)", env, ignored, src, src_pos, dst, dst_pos, length));
277 builtin_arraycopy(s, src_pos, d, dst_pos, length);
281 /* JVM_InitProperties */
283 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
288 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
290 h = (java_handle_t *) properties;
292 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
293 sun.nio.MaxDirectMemorySize property. Do this after setting
294 user properties to prevent people from setting the value with a
295 -D option, as requested. */
297 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
298 properties_add("sun.nio.MaxDirectMemorySize", buf);
300 /* Add all properties. */
302 properties_system_add_all(h);
310 void JVM_Exit(jint code)
312 log_println("JVM_Exit: IMPLEMENT ME!");
318 void JVM_Halt(jint code)
320 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
327 /* JVM_OnExit(void (*func)) */
329 void JVM_OnExit(void (*func)(void))
331 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
339 TRACEJVMCALLS(("JVM_GC()"));
345 /* JVM_MaxObjectInspectionAge */
347 jlong JVM_MaxObjectInspectionAge(void)
349 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
355 /* JVM_TraceInstructions */
357 void JVM_TraceInstructions(jboolean on)
359 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
363 /* JVM_TraceMethodCalls */
365 void JVM_TraceMethodCalls(jboolean on)
367 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
371 /* JVM_TotalMemory */
373 jlong JVM_TotalMemory(void)
375 TRACEJVMCALLS(("JVM_TotalMemory()"));
377 return gc_get_heap_size();
383 jlong JVM_FreeMemory(void)
385 TRACEJVMCALLS(("JVM_FreeMemory()"));
387 return gc_get_free_bytes();
393 jlong JVM_MaxMemory(void)
395 TRACEJVMCALLS(("JVM_MaxMemory()"));
397 return gc_get_max_heap_size();
401 /* JVM_ActiveProcessorCount */
403 jint JVM_ActiveProcessorCount(void)
405 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
407 return system_processors_online();
411 /* JVM_FillInStackTrace */
413 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
415 java_lang_Throwable *o;
416 java_handle_bytearray_t *ba;
418 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
420 o = (java_lang_Throwable *) receiver;
422 ba = stacktrace_get_current();
427 LLNI_field_set_ref(o, backtrace, (java_lang_Object *) ba);
431 /* JVM_PrintStackTrace */
433 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
435 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
439 /* JVM_GetStackTraceDepth */
441 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
443 java_lang_Throwable *to;
445 java_handle_bytearray_t *ba;
449 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
451 if (throwable == NULL) {
452 exceptions_throw_nullpointerexception();
456 to = (java_lang_Throwable *) throwable;
458 LLNI_field_get_ref(to, backtrace, o);
460 ba = (java_handle_bytearray_t *) o;
465 /* We need a critical section here as the stacktrace structure is
466 mapped onto a Java byte-array. */
470 st = (stacktrace_t *) LLNI_array_data(ba);
480 /* JVM_GetStackTraceElement */
482 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
484 java_lang_Throwable *to;
486 java_handle_bytearray_t *ba;
488 stacktrace_entry_t *ste;
492 java_lang_StackTraceElement *steo;
493 java_lang_String *declaringclass;
494 java_lang_String *filename;
497 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
499 to = (java_lang_Throwable *) throwable;
501 LLNI_field_get_ref(to, backtrace, o);
503 ba = (java_handle_bytearray_t *) o;
505 /* FIXME critical section */
507 st = (stacktrace_t *) LLNI_array_data(ba);
509 if ((index < 0) || (index >= st->length)) {
510 /* XXX This should be an IndexOutOfBoundsException (check this
513 exceptions_throw_arrayindexoutofboundsexception();
517 /* Get the stacktrace entry. */
519 ste = &(st->entries[index]);
521 /* Get the codeinfo, methodinfo and classinfo. */
527 /* allocate a new StackTraceElement */
529 steo = (java_lang_StackTraceElement *)
530 builtin_new(class_java_lang_StackTraceElement);
537 if (!(m->flags & ACC_NATIVE)) {
538 if (c->sourcefile != NULL)
539 filename = (java_lang_String *) javastring_new(c->sourcefile);
546 /* get line number */
548 if (m->flags & ACC_NATIVE) {
552 /* FIXME The linenumbertable_linenumber_for_pc could change
553 the methodinfo pointer when hitting an inlined method. */
555 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
556 linenumber = (linenumber == 0) ? -1 : linenumber;
559 /* get declaring class name */
561 declaringclass = _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(c));
563 /* fill the java.lang.StackTraceElement element */
565 /* FIXME critical section */
567 steo->declaringClass = declaringclass;
568 steo->methodName = (java_lang_String *) javastring_new(m->name);
569 steo->fileName = filename;
570 steo->lineNumber = linenumber;
572 return (jobject) steo;
578 jint JVM_IHashCode(JNIEnv* env, jobject handle)
580 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
582 return (jint) ((ptrint) handle);
586 /* JVM_MonitorWait */
588 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
590 #if defined(ENABLE_THREADS)
594 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
596 /* exceptions_throw_illegalargumentexception("argument out of range"); */
597 exceptions_throw_illegalargumentexception();
601 #if defined(ENABLE_THREADS)
602 o = (java_handle_t *) handle;
604 lock_wait_for_object(o, ms, 0);
609 /* JVM_MonitorNotify */
611 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
613 #if defined(ENABLE_THREADS)
617 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
619 #if defined(ENABLE_THREADS)
620 o = (java_handle_t *) handle;
622 lock_notify_object(o);
627 /* JVM_MonitorNotifyAll */
629 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
631 #if defined(ENABLE_THREADS)
635 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
637 #if defined(ENABLE_THREADS)
638 o = (java_handle_t *) handle;
640 lock_notify_all_object(o);
647 jobject JVM_Clone(JNIEnv* env, jobject handle)
649 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
651 return (jobject) builtin_clone(env, (java_handle_t *) handle);
655 /* JVM_InitializeCompiler */
657 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
659 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
663 /* JVM_IsSilentCompiler */
665 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
667 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
673 /* JVM_CompileClass */
675 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
677 log_println("JVM_CompileClass: IMPLEMENT ME!");
683 /* JVM_CompileClasses */
685 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
687 log_println("JVM_CompileClasses: IMPLEMENT ME!");
693 /* JVM_CompilerCommand */
695 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
697 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
703 /* JVM_EnableCompiler */
705 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
707 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
708 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
712 /* JVM_DisableCompiler */
714 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
716 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
717 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
721 /* JVM_GetLastErrorString */
723 jint JVM_GetLastErrorString(char *buf, int len)
725 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
727 return hpi_system->GetLastErrorString(buf, len);
733 char *JVM_NativePath(char *path)
735 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
737 return hpi_file->NativePath(path);
741 /* JVM_GetCallerClass */
743 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
747 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
749 c = stacktrace_get_caller_class(depth);
755 /* JVM_FindPrimitiveClass */
757 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
762 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
765 c = primitive_class_get_by_name(u);
767 return (jclass) LLNI_classinfo_wrap(c);
771 /* JVM_ResolveClass */
773 void JVM_ResolveClass(JNIEnv* env, jclass cls)
775 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
776 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
780 /* JVM_FindClassFromClassLoader */
782 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
788 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
790 /* As of now, OpenJDK does not call this function with throwError
793 assert(throwError == false);
795 u = utf_new_char(name);
796 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
798 c = load_class_from_classloader(u, cl);
804 if (!(c->state & CLASS_INITIALIZED))
805 if (!initialize_class(c))
808 return (jclass) LLNI_classinfo_wrap(c);
812 /* JVM_FindClassFromClass */
814 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
816 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
822 /* JVM_DefineClass */
824 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
826 log_println("JVM_DefineClass: IMPLEMENT ME!");
832 /* JVM_DefineClassWithSource */
834 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
840 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
843 u = utf_new_char(name);
847 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
849 /* XXX do something with source */
851 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
853 return (jclass) LLNI_classinfo_wrap(c);
857 /* JVM_FindLoadedClass */
859 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
865 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
867 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
869 u = javastring_toutf((java_handle_t *) name, true);
870 c = classcache_lookup(cl, u);
872 return (jclass) LLNI_classinfo_wrap(c);
876 /* JVM_GetClassName */
878 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
880 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
882 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
886 /* JVM_GetClassInterfaces */
888 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
891 java_handle_objectarray_t *oa;
893 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
895 c = LLNI_classinfo_unwrap(cls);
897 oa = class_get_interfaces(c);
899 return (jobjectArray) oa;
903 /* JVM_GetClassLoader */
905 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
910 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
912 c = LLNI_classinfo_unwrap(cls);
913 cl = class_get_classloader(c);
915 TRACEJVMCALLSEXIT(("->%p", cl));
921 /* JVM_IsInterface */
923 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
927 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
929 c = LLNI_classinfo_unwrap(cls);
931 return class_is_interface(c);
935 /* JVM_GetClassSigners */
937 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
939 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
945 /* JVM_SetClassSigners */
947 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
950 java_handle_objectarray_t *hoa;
952 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
954 c = LLNI_classinfo_unwrap(cls);
956 hoa = (java_handle_objectarray_t *) signers;
958 /* This call is ignored for primitive types and arrays. Signers
959 are only set once, ClassLoader.java, and thus shouldn't be
960 called with an array. Only the bootstrap loader creates
963 if (class_is_primitive(c) || class_is_array(c))
966 LLNI_classinfo_field_set(c, signers, hoa);
970 /* JVM_GetProtectionDomain */
972 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
976 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
978 c = LLNI_classinfo_unwrap(cls);
981 exceptions_throw_nullpointerexception();
985 /* Primitive types do not have a protection domain. */
987 if (class_is_primitive(c))
990 return (jobject) c->protectiondomain;
994 /* JVM_SetProtectionDomain */
996 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
998 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
1002 /* JVM_DoPrivileged */
1004 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
1009 java_handle_t *result;
1012 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
1014 h = (java_handle_t *) action;
1015 LLNI_class_get(h, c);
1017 if (action == NULL) {
1018 exceptions_throw_nullpointerexception();
1022 /* lookup run() method (throw no exceptions) */
1024 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1027 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1028 exceptions_throw_internalerror("No run method");
1032 /* XXX It seems something with a privileged stack needs to be done
1035 result = vm_call_method(m, h);
1037 e = exceptions_get_exception();
1040 if ( builtin_instanceof(e, class_java_lang_Exception) &&
1041 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
1042 exceptions_clear_exception();
1043 exceptions_throw_privilegedactionexception(e);
1049 return (jobject) result;
1053 /* JVM_GetInheritedAccessControlContext */
1055 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1057 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1063 /* JVM_GetStackAccessControlContext */
1065 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1067 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
1069 /* XXX All stuff I tested so far works without that function. At
1070 some point we have to implement it, but I disable the output
1071 for now to make IcedTea happy. */
1077 /* JVM_IsArrayClass */
1079 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1083 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1085 c = LLNI_classinfo_unwrap(cls);
1087 return class_is_array(c);
1091 /* JVM_IsPrimitiveClass */
1093 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1097 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1099 c = LLNI_classinfo_unwrap(cls);
1101 return class_is_primitive(c);
1105 /* JVM_GetComponentType */
1107 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1109 classinfo *component;
1112 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1114 c = LLNI_classinfo_unwrap(cls);
1116 component = class_get_componenttype(c);
1118 return (jclass) LLNI_classinfo_wrap(component);
1122 /* JVM_GetClassModifiers */
1124 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1129 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1131 c = LLNI_classinfo_unwrap(cls);
1133 flags = class_get_modifiers(c, false);
1139 /* JVM_GetDeclaredClasses */
1141 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1144 java_handle_objectarray_t *oa;
1146 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1148 c = LLNI_classinfo_unwrap(ofClass);
1150 oa = class_get_declaredclasses(c, false);
1152 return (jobjectArray) oa;
1156 /* JVM_GetDeclaringClass */
1158 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1163 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1165 c = LLNI_classinfo_unwrap(ofClass);
1167 dc = class_get_declaringclass(c);
1169 return (jclass) LLNI_classinfo_wrap(dc);
1173 /* JVM_GetClassSignature */
1175 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1181 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1183 c = LLNI_classinfo_unwrap(cls);
1185 /* Get the signature of the class. */
1187 u = class_get_signature(c);
1192 /* Convert UTF-string to a Java-string. */
1194 s = javastring_new(u);
1200 /* JVM_GetClassAnnotations */
1202 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1204 classinfo *c = NULL; /* classinfo for 'cls' */
1205 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1207 TRACEJVMCALLS(("JVM_GetClassAnnotations: cls=%p", cls));
1210 exceptions_throw_nullpointerexception();
1214 c = LLNI_classinfo_unwrap(cls);
1216 /* get annotations: */
1217 annotations = class_get_annotations(c);
1219 return (jbyteArray)annotations;
1223 /* JVM_GetFieldAnnotations */
1225 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1227 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1228 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1230 TRACEJVMCALLS(("JVM_GetFieldAnnotations: field=%p", field));
1232 if (field == NULL) {
1233 exceptions_throw_nullpointerexception();
1237 rf = (java_lang_reflect_Field*)field;
1239 LLNI_field_get_ref(rf, annotations, ba);
1241 return (jbyteArray)ba;
1245 /* JVM_GetMethodAnnotations */
1247 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1249 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1250 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1252 TRACEJVMCALLS(("JVM_GetMethodAnnotations: method=%p", method));
1254 if (method == NULL) {
1255 exceptions_throw_nullpointerexception();
1259 rm = (java_lang_reflect_Method*)method;
1261 LLNI_field_get_ref(rm, annotations, ba);
1263 return (jbyteArray)ba;
1267 /* JVM_GetMethodDefaultAnnotationValue */
1269 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1271 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1272 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1274 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue: method=%p", method));
1276 if (method == NULL) {
1277 exceptions_throw_nullpointerexception();
1281 rm = (java_lang_reflect_Method*)method;
1283 LLNI_field_get_ref(rm, annotationDefault, ba);
1285 return (jbyteArray)ba;
1289 /* JVM_GetMethodParameterAnnotations */
1291 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1293 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1294 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1296 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations: method=%p", method));
1298 if (method == NULL) {
1299 exceptions_throw_nullpointerexception();
1303 rm = (java_lang_reflect_Method*)method;
1305 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1307 return (jbyteArray)ba;
1311 /* JVM_GetClassDeclaredFields */
1313 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1315 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1317 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1321 /* JVM_GetClassDeclaredMethods */
1323 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1325 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1327 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1331 /* JVM_GetClassDeclaredConstructors */
1333 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1335 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1337 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1341 /* JVM_GetClassAccessFlags */
1343 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1347 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1349 c = LLNI_classinfo_unwrap(cls);
1351 /* Primitive type classes have the correct access flags. */
1353 return c->flags & ACC_CLASS_REFLECT_MASK;
1357 /* JVM_GetClassConstantPool */
1359 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1361 #if defined(ENABLE_ANNOTATIONS)
1362 sun_reflect_ConstantPool *constantPool = NULL;
1363 /* constant pool object for the class refered by 'cls' */
1364 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1365 /* constantPoolOop field of the constant pool object */
1367 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1370 (sun_reflect_ConstantPool*)native_new_and_init(
1371 class_sun_reflect_ConstantPool);
1373 if (constantPool == NULL) {
1378 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1380 return (jobject)constantPool;
1382 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1388 /* JVM_ConstantPoolGetSize */
1390 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1392 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1394 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1396 c = LLNI_classinfo_unwrap(jcpool);
1402 /* JVM_ConstantPoolGetClassAt */
1404 jclass JVM_ConstantPoolGetClassAt(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_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1412 c = LLNI_classinfo_unwrap(jcpool);
1414 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1417 exceptions_throw_illegalargumentexception();
1421 result = resolve_classref_eager(ref);
1423 return (jclass) LLNI_classinfo_wrap(result);
1427 /* JVM_ConstantPoolGetClassAtIfLoaded */
1429 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1431 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1432 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1433 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1435 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1437 c = LLNI_classinfo_unwrap(jcpool);
1439 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1442 exceptions_throw_illegalargumentexception();
1446 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1450 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1454 return (jclass) LLNI_classinfo_wrap(result);
1458 /* JVM_ConstantPoolGetMethodAt */
1460 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1462 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1463 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1465 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1467 cls = LLNI_classinfo_unwrap(jcpool);
1468 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1471 exceptions_throw_illegalargumentexception();
1475 /* XXX: is that right? or do I have to use resolve_method_*? */
1476 return (jobject)reflect_method_new(ref->p.method);
1480 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1482 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1484 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1485 classinfo *c = NULL; /* resolved declaring class of the method */
1486 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1488 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1490 cls = LLNI_classinfo_unwrap(jcpool);
1491 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1494 exceptions_throw_illegalargumentexception();
1498 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1502 if (c == NULL || !(c->state & CLASS_LOADED)) {
1506 return (jobject)reflect_method_new(ref->p.method);
1510 /* JVM_ConstantPoolGetFieldAt */
1512 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1514 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1515 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1517 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1519 cls = LLNI_classinfo_unwrap(jcpool);
1520 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1523 exceptions_throw_illegalargumentexception();
1527 return (jobject)reflect_field_new(ref->p.field);
1531 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1533 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1535 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1536 classinfo *c; /* resolved declaring class for the field */
1537 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1539 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1541 cls = LLNI_classinfo_unwrap(jcpool);
1542 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1545 exceptions_throw_illegalargumentexception();
1549 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1553 if (c == NULL || !(c->state & CLASS_LOADED)) {
1557 return (jobject)reflect_field_new(ref->p.field);
1561 /* JVM_ConstantPoolGetMemberRefInfoAt */
1563 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1565 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1567 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1573 /* JVM_ConstantPoolGetIntAt */
1575 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1577 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1578 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1580 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1582 cls = LLNI_classinfo_unwrap(jcpool);
1583 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1586 exceptions_throw_illegalargumentexception();
1594 /* JVM_ConstantPoolGetLongAt */
1596 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1598 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1599 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1601 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1603 cls = LLNI_classinfo_unwrap(jcpool);
1604 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1607 exceptions_throw_illegalargumentexception();
1615 /* JVM_ConstantPoolGetFloatAt */
1617 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1619 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1620 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1622 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1624 cls = LLNI_classinfo_unwrap(jcpool);
1625 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1628 exceptions_throw_illegalargumentexception();
1636 /* JVM_ConstantPoolGetDoubleAt */
1638 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1640 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1641 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1643 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1645 cls = LLNI_classinfo_unwrap(jcpool);
1646 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1649 exceptions_throw_illegalargumentexception();
1657 /* JVM_ConstantPoolGetStringAt */
1659 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1661 utf *ref; /* utf object for the string in constant pool at index 'index' */
1662 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1664 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1666 cls = LLNI_classinfo_unwrap(jcpool);
1667 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1670 exceptions_throw_illegalargumentexception();
1674 /* XXX: I hope literalstring_new is the right Function. */
1675 return (jstring)literalstring_new(ref);
1679 /* JVM_ConstantPoolGetUTF8At */
1681 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1683 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1684 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1686 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1688 cls = LLNI_classinfo_unwrap(jcpool);
1689 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1692 exceptions_throw_illegalargumentexception();
1696 /* XXX: I hope literalstring_new is the right Function. */
1697 return (jstring)literalstring_new(ref);
1701 /* JVM_DesiredAssertionStatus */
1703 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1705 #if defined(ENABLE_ASSERTION)
1706 assertion_name_t *item;
1711 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1713 c = LLNI_classinfo_unwrap(cls);
1715 if (c->classloader == NULL) {
1716 status = (jboolean)assertion_system_enabled;
1719 status = (jboolean)assertion_user_enabled;
1722 if (list_assertion_names != NULL) {
1723 item = (assertion_name_t *)list_first(list_assertion_names);
1724 while (item != NULL) {
1725 name = utf_new_char(item->name);
1726 if (name == c->packagename) {
1727 status = (jboolean)item->enabled;
1729 else if (name == c->name) {
1730 status = (jboolean)item->enabled;
1733 item = (assertion_name_t *)list_next(list_assertion_names, item);
1739 return (jboolean)false;
1744 /* JVM_AssertionStatusDirectives */
1746 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1749 java_lang_AssertionStatusDirectives *o;
1750 java_handle_objectarray_t *classes;
1751 java_handle_objectarray_t *packages;
1752 java_booleanarray_t *classEnabled;
1753 java_booleanarray_t *packageEnabled;
1754 #if defined(ENABLE_ASSERTION)
1755 assertion_name_t *item;
1760 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1762 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1767 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1772 #if defined(ENABLE_ASSERTION)
1773 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1775 classes = builtin_anewarray(0, class_java_lang_Object);
1777 if (classes == NULL)
1780 #if defined(ENABLE_ASSERTION)
1781 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1783 packages = builtin_anewarray(0, class_java_lang_Object);
1785 if (packages == NULL)
1788 #if defined(ENABLE_ASSERTION)
1789 classEnabled = builtin_newarray_boolean(assertion_class_count);
1791 classEnabled = builtin_newarray_boolean(0);
1793 if (classEnabled == NULL)
1796 #if defined(ENABLE_ASSERTION)
1797 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1799 packageEnabled = builtin_newarray_boolean(0);
1801 if (packageEnabled == NULL)
1804 #if defined(ENABLE_ASSERTION)
1805 /* initialize arrays */
1807 if (list_assertion_names != NULL) {
1811 item = (assertion_name_t *)list_first(list_assertion_names);
1812 while (item != NULL) {
1813 js = javastring_new_from_ascii(item->name);
1818 if (item->package == false) {
1819 classes->data[i] = js;
1820 classEnabled->data[i] = (jboolean) item->enabled;
1824 packages->data[j] = js;
1825 packageEnabled->data[j] = (jboolean) item->enabled;
1829 item = (assertion_name_t *)list_next(list_assertion_names, item);
1834 /* set instance fields */
1836 o->classes = classes;
1837 o->packages = packages;
1838 o->classEnabled = classEnabled;
1839 o->packageEnabled = packageEnabled;
1845 /* JVM_GetClassNameUTF */
1847 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1849 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1855 /* JVM_GetClassCPTypes */
1857 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1859 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1863 /* JVM_GetClassCPEntriesCount */
1865 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1867 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1873 /* JVM_GetClassFieldsCount */
1875 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1877 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1883 /* JVM_GetClassMethodsCount */
1885 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1887 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1893 /* JVM_GetMethodIxExceptionIndexes */
1895 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1897 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1901 /* JVM_GetMethodIxExceptionsCount */
1903 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1905 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1911 /* JVM_GetMethodIxByteCode */
1913 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1915 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1919 /* JVM_GetMethodIxByteCodeLength */
1921 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1923 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1929 /* JVM_GetMethodIxExceptionTableEntry */
1931 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1933 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1937 /* JVM_GetMethodIxExceptionTableLength */
1939 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1941 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1947 /* JVM_GetMethodIxModifiers */
1949 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1951 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1957 /* JVM_GetFieldIxModifiers */
1959 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1961 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1967 /* JVM_GetMethodIxLocalsCount */
1969 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1971 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1977 /* JVM_GetMethodIxArgsSize */
1979 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1981 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1987 /* JVM_GetMethodIxMaxStack */
1989 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1991 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1997 /* JVM_IsConstructorIx */
1999 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
2001 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
2007 /* JVM_GetMethodIxNameUTF */
2009 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
2011 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
2017 /* JVM_GetMethodIxSignatureUTF */
2019 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
2021 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
2027 /* JVM_GetCPFieldNameUTF */
2029 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2031 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
2037 /* JVM_GetCPMethodNameUTF */
2039 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2041 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
2047 /* JVM_GetCPMethodSignatureUTF */
2049 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2051 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
2057 /* JVM_GetCPFieldSignatureUTF */
2059 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2061 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2067 /* JVM_GetCPClassNameUTF */
2069 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2071 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2077 /* JVM_GetCPFieldClassNameUTF */
2079 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2081 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2087 /* JVM_GetCPMethodClassNameUTF */
2089 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2091 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2097 /* JVM_GetCPFieldModifiers */
2099 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2101 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2107 /* JVM_GetCPMethodModifiers */
2109 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2111 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2117 /* JVM_ReleaseUTF */
2119 void JVM_ReleaseUTF(const char *utf)
2121 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2125 /* JVM_IsSameClassPackage */
2127 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2129 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2137 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2140 * JVM I/O error codes
2142 #define JVM_EEXIST -100
2144 jint JVM_Open(const char *fname, jint flags, jint mode)
2148 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2150 result = hpi_file->Open(fname, flags, mode);
2168 jint JVM_Close(jint fd)
2170 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2172 return hpi_file->Close(fd);
2178 jint JVM_Read(jint fd, char *buf, jint nbytes)
2180 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2182 return (jint) hpi_file->Read(fd, buf, nbytes);
2188 jint JVM_Write(jint fd, char *buf, jint nbytes)
2190 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2192 return (jint) hpi_file->Write(fd, buf, nbytes);
2198 jint JVM_Available(jint fd, jlong *pbytes)
2200 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2202 return hpi_file->Available(fd, pbytes);
2208 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2210 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2212 return hpi_file->Seek(fd, (off_t) offset, whence);
2218 jint JVM_SetLength(jint fd, jlong length)
2220 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2222 return hpi_file->SetLength(fd, length);
2228 jint JVM_Sync(jint fd)
2230 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2232 return hpi_file->Sync(fd);
2236 /* JVM_StartThread */
2238 void JVM_StartThread(JNIEnv* env, jobject jthread)
2240 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2242 threads_thread_start((java_handle_t *) jthread);
2246 /* JVM_StopThread */
2248 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2250 log_println("JVM_StopThread: IMPLEMENT ME!");
2254 /* JVM_IsThreadAlive */
2256 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2262 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2264 h = (java_handle_t *) jthread;
2265 t = thread_get_thread(h);
2267 /* The threadobject is null when a thread is created in Java. The
2268 priority is set later during startup. */
2273 result = threads_thread_is_alive(t);
2279 /* JVM_SuspendThread */
2281 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2283 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2287 /* JVM_ResumeThread */
2289 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2291 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2295 /* JVM_SetThreadPriority */
2297 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2302 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2304 h = (java_handle_t *) jthread;
2305 t = thread_get_thread(h);
2307 /* The threadobject is null when a thread is created in Java. The
2308 priority is set later during startup. */
2313 threads_set_thread_priority(t->tid, prio);
2319 void JVM_Yield(JNIEnv *env, jclass threadClass)
2321 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2329 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2331 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2333 threads_sleep(millis, 0);
2337 /* JVM_CurrentThread */
2339 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2343 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2345 o = thread_get_current_object();
2351 /* JVM_CountStackFrames */
2353 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2355 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2363 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2368 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2370 h = (java_handle_t *) jthread;
2371 t = thread_get_thread(h);
2376 threads_thread_interrupt(t);
2380 /* JVM_IsInterrupted */
2382 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2387 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2389 h = (java_handle_t *) jthread;
2390 t = thread_get_thread(h);
2392 /* XXX do something with clear_interrupted */
2394 return thread_is_interrupted(t);
2400 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2405 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2407 h = (java_handle_t *) obj;
2410 exceptions_throw_nullpointerexception();
2414 result = lock_is_held_by_current_thread(h);
2420 /* JVM_DumpAllStacks */
2422 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2424 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2428 /* JVM_CurrentLoadedClass */
2430 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2432 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2438 /* JVM_CurrentClassLoader */
2440 jobject JVM_CurrentClassLoader(JNIEnv *env)
2442 /* XXX if a method in a class in a trusted loader is in a
2443 doPrivileged, return NULL */
2445 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2451 /* JVM_GetClassContext */
2453 jobjectArray JVM_GetClassContext(JNIEnv *env)
2455 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2457 return (jobjectArray) stacktrace_getClassContext();
2461 /* JVM_ClassDepth */
2463 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2465 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2471 /* JVM_ClassLoaderDepth */
2473 jint JVM_ClassLoaderDepth(JNIEnv *env)
2475 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2481 /* JVM_GetSystemPackage */
2483 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2489 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2491 /* s = package_find(name); */
2492 u = javastring_toutf((java_handle_t *) name, false);
2494 result = package_find(u);
2497 s = javastring_new(result);
2505 /* JVM_GetSystemPackages */
2507 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2509 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2515 /* JVM_AllocateNewObject */
2517 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2519 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2525 /* JVM_AllocateNewArray */
2527 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2529 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2535 /* JVM_LatestUserDefinedLoader */
2537 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2541 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2543 cl = stacktrace_first_nonnull_classloader();
2545 return (jobject) cl;
2549 /* JVM_LoadClass0 */
2551 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2553 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2559 /* JVM_GetArrayLength */
2561 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2565 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2567 a = (java_handle_t *) arr;
2569 return array_length_get(a);
2573 /* JVM_GetArrayElement */
2575 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2580 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2582 a = (java_handle_t *) arr;
2584 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2585 /* exceptions_throw_illegalargumentexception(); */
2589 o = array_element_get(a, index);
2595 /* JVM_GetPrimitiveArrayElement */
2597 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2601 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2609 /* JVM_SetArrayElement */
2611 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2614 java_handle_t *value;
2616 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2618 a = (java_handle_t *) arr;
2619 value = (java_handle_t *) val;
2621 array_element_set(a, index, value);
2625 /* JVM_SetPrimitiveArrayElement */
2627 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2629 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2635 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2640 java_handle_objectarray_t *oa;
2642 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2644 if (eltClass == NULL) {
2645 exceptions_throw_nullpointerexception();
2649 /* NegativeArraySizeException is checked in builtin_newarray. */
2651 c = LLNI_classinfo_unwrap(eltClass);
2653 /* Create primitive or object array. */
2655 if (class_is_primitive(c)) {
2656 pc = primitive_arrayclass_get_by_name(c->name);
2658 /* void arrays are not allowed. */
2661 exceptions_throw_illegalargumentexception();
2665 a = builtin_newarray(length, pc);
2670 oa = builtin_anewarray(length, c);
2672 return (jobject) oa;
2677 /* JVM_NewMultiArray */
2679 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2682 java_handle_intarray_t *ia;
2688 java_handle_objectarray_t *a;
2690 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2692 if (eltClass == NULL) {
2693 exceptions_throw_nullpointerexception();
2697 /* NegativeArraySizeException is checked in builtin_newarray. */
2699 c = LLNI_classinfo_unwrap(eltClass);
2701 ia = (java_handle_intarray_t *) dim;
2703 length = array_length_get((java_handle_t *) ia);
2705 /* We check here for exceptions thrown in array_length_get,
2706 otherwise these exceptions get overwritten by the following
2707 IllegalArgumentException. */
2712 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2713 exceptions_throw_illegalargumentexception();
2717 /* XXX This is just a quick hack to get it working. */
2719 dims = MNEW(long, length);
2721 for (i = 0; i < length; i++) {
2722 value = LLNI_array_direct(ia, i);
2723 dims[i] = (long) value;
2726 /* Create an array-class if necessary. */
2728 if (class_is_primitive(c))
2729 ac = primitive_arrayclass_get_by_name(c->name);
2731 ac = class_array_of(c, true);
2736 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2742 /* JVM_InitializeSocketLibrary */
2744 jint JVM_InitializeSocketLibrary()
2746 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2748 return hpi_initialize_socket_library();
2754 jint JVM_Socket(jint domain, jint type, jint protocol)
2756 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2758 return system_socket(domain, type, protocol);
2762 /* JVM_SocketClose */
2764 jint JVM_SocketClose(jint fd)
2766 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2768 return system_close(fd);
2772 /* JVM_SocketShutdown */
2774 jint JVM_SocketShutdown(jint fd, jint howto)
2776 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2778 return system_shutdown(fd, howto);
2784 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2786 log_println("JVM_Recv: IMPLEMENT ME!");
2794 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2796 log_println("JVM_Send: IMPLEMENT ME!");
2804 jint JVM_Timeout(int fd, long timeout)
2806 log_println("JVM_Timeout: IMPLEMENT ME!");
2814 jint JVM_Listen(jint fd, jint count)
2816 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2818 return system_listen(fd, count);
2824 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2826 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2828 return system_connect(fd, him, len);
2834 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2836 log_println("JVM_Bind: IMPLEMENT ME!");
2844 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2846 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2848 return system_accept(fd, him, (socklen_t *) len);
2854 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2856 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2862 /* JVM_GetSockName */
2864 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2866 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2868 return system_getsockname(fd, him, (socklen_t *) len);
2874 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2876 log_println("JVM_SendTo: IMPLEMENT ME!");
2882 /* JVM_SocketAvailable */
2884 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2886 #if defined(FIONREAD)
2890 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2894 result = ioctl(fd, FIONREAD, &bytes);
2903 # error FIONREAD not defined
2908 /* JVM_GetSockOpt */
2910 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2912 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2914 return system_getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2918 /* JVM_SetSockOpt */
2920 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2922 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2924 return system_setsockopt(fd, level, optname, optval, optlen);
2928 /* JVM_GetHostName */
2930 int JVM_GetHostName(char *name, int namelen)
2932 TRACEJVMCALLS(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2934 return system_gethostname(name, namelen);
2938 /* JVM_GetHostByAddr */
2940 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2942 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2948 /* JVM_GetHostByName */
2950 struct hostent *JVM_GetHostByName(char* name)
2952 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2958 /* JVM_GetProtoByName */
2960 struct protoent *JVM_GetProtoByName(char* name)
2962 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2968 /* JVM_LoadLibrary */
2970 void *JVM_LoadLibrary(const char *name)
2974 TRACEJVMCALLS(("JVM_LoadLibrary(name=%s)", name));
2976 u = utf_new_char(name);
2978 return native_library_open(u);
2982 /* JVM_UnloadLibrary */
2984 void JVM_UnloadLibrary(void* handle)
2986 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2988 native_library_close(handle);
2992 /* JVM_FindLibraryEntry */
2994 void *JVM_FindLibraryEntry(void *handle, const char *name)
2998 TRACEJVMCALLS(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
3000 symbol = lt_dlsym(handle, name);
3008 jboolean JVM_IsNaN(jdouble a)
3010 log_println("JVM_IsNaN: IMPLEMENT ME!");
3016 /* JVM_IsSupportedJNIVersion */
3018 jboolean JVM_IsSupportedJNIVersion(jint version)
3020 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
3022 return jni_version_check(version);
3026 /* JVM_InternString */
3028 jstring JVM_InternString(JNIEnv *env, jstring str)
3030 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
3032 return (jstring) javastring_intern((java_handle_t *) str);
3036 /* JVM_RawMonitorCreate */
3038 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3042 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3044 o = NEW(java_object_t);
3046 lock_init_object_lock(o);
3052 /* JVM_RawMonitorDestroy */
3054 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3056 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3058 FREE(mon, java_object_t);
3062 /* JVM_RawMonitorEnter */
3064 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3066 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3068 (void) lock_monitor_enter((java_object_t *) mon);
3074 /* JVM_RawMonitorExit */
3076 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3078 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3080 (void) lock_monitor_exit((java_object_t *) mon);
3084 /* JVM_SetPrimitiveFieldValues */
3086 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3088 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3092 /* JVM_GetPrimitiveFieldValues */
3094 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3096 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3100 /* JVM_AccessVMBooleanFlag */
3102 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3104 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3110 /* JVM_AccessVMIntFlag */
3112 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3114 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3120 /* JVM_VMBreakPoint */
3122 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3124 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3128 /* JVM_GetClassFields */
3130 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3132 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3138 /* JVM_GetClassMethods */
3140 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3142 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3148 /* JVM_GetClassConstructors */
3150 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3152 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3158 /* JVM_GetClassField */
3160 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3162 log_println("JVM_GetClassField: IMPLEMENT ME!");
3168 /* JVM_GetClassMethod */
3170 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3172 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3178 /* JVM_GetClassConstructor */
3180 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3182 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3188 /* JVM_NewInstance */
3190 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3192 log_println("JVM_NewInstance: IMPLEMENT ME!");
3200 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3202 log_println("JVM_GetField: IMPLEMENT ME!");
3208 /* JVM_GetPrimitiveField */
3210 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3214 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3224 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3226 log_println("JVM_SetField: IMPLEMENT ME!");
3230 /* JVM_SetPrimitiveField */
3232 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3234 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3238 /* JVM_InvokeMethod */
3240 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3242 java_lang_reflect_Method *rm;
3249 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3251 rm = (java_lang_reflect_Method *) method;
3253 LLNI_field_get_cls(rm, clazz, c);
3254 LLNI_field_get_val(rm, slot, slot);
3255 LLNI_field_get_val(rm, override, override);
3257 m = &(c->methods[slot]);
3259 ro = reflect_method_invoke(m, (java_handle_t *) obj, (java_handle_objectarray_t *) args0, override);
3261 return (jobject) ro;
3265 /* JVM_NewInstanceFromConstructor */
3267 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3269 java_lang_reflect_Constructor *rc;
3276 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3278 rc = (java_lang_reflect_Constructor *) con;
3280 LLNI_field_get_cls(rc, clazz, c);
3281 LLNI_field_get_val(rc, slot, slot);
3282 LLNI_field_get_val(rc, override, override);
3284 m = &(c->methods[slot]);
3286 o = reflect_constructor_newinstance(m, (java_handle_objectarray_t *) args0, override);
3292 /* JVM_SupportsCX8 */
3294 jboolean JVM_SupportsCX8()
3296 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3306 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3308 log_println("JVM_CX8Field: IMPLEMENT ME!");
3314 /* JVM_GetAllThreads */
3316 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3318 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3324 /* JVM_DumpThreads */
3326 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3328 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3334 /* JVM_GetManagement */
3336 void *JVM_GetManagement(jint version)
3338 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3340 /* TODO We current don't support the management interface. */
3346 /* JVM_InitAgentProperties */
3348 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3350 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3356 /* JVM_GetEnclosingMethodInfo */
3358 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3362 java_handle_objectarray_t *oa;
3364 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3366 c = LLNI_classinfo_unwrap(ofClass);
3368 if ((c == NULL) || class_is_primitive(c))
3371 m = class_get_enclosingmethod(c);
3376 oa = builtin_anewarray(3, class_java_lang_Object);
3381 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->class));
3382 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3383 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3385 return (jobjectArray) oa;
3389 /* JVM_GetThreadStateValues */
3391 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3393 java_handle_intarray_t *ia;
3395 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3396 env, javaThreadState));
3398 /* If new thread states are added in future JDK and VM versions,
3399 this should check if the JDK version is compatible with thread
3400 states supported by the VM. Return NULL if not compatible.
3402 This function must map the VM java_lang_Thread::ThreadStatus
3403 to the Java thread state that the JDK supports. */
3405 switch (javaThreadState) {
3406 case THREAD_STATE_NEW:
3407 ia = builtin_newarray_int(1);
3412 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3415 case THREAD_STATE_RUNNABLE:
3416 ia = builtin_newarray_int(1);
3421 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3424 case THREAD_STATE_BLOCKED:
3425 ia = builtin_newarray_int(1);
3430 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3433 case THREAD_STATE_WAITING:
3434 ia = builtin_newarray_int(2);
3439 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3440 /* XXX Implement parked stuff. */
3441 /* array_intarray_element_set(ia, 1, PARKED); */
3444 case THREAD_STATE_TIMED_WAITING:
3445 ia = builtin_newarray_int(3);
3450 /* XXX Not sure about that one. */
3451 /* array_intarray_element_set(ia, 0, SLEEPING); */
3452 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3453 /* XXX Implement parked stuff. */
3454 /* array_intarray_element_set(ia, 2, PARKED); */
3457 case THREAD_STATE_TERMINATED:
3458 ia = builtin_newarray_int(1);
3463 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3467 /* Unknown state - probably incompatible JDK version */
3471 return (jintArray) ia;
3475 /* JVM_GetThreadStateNames */
3477 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3479 java_handle_intarray_t *ia;
3480 java_handle_objectarray_t *oa;
3483 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3484 env, javaThreadState, values));
3486 ia = (java_handle_intarray_t *) values;
3488 /* If new thread states are added in future JDK and VM versions,
3489 this should check if the JDK version is compatible with thread
3490 states supported by the VM. Return NULL if not compatible.
3492 This function must map the VM java_lang_Thread::ThreadStatus
3493 to the Java thread state that the JDK supports. */
3495 if (values == NULL) {
3496 exceptions_throw_nullpointerexception();
3500 switch (javaThreadState) {
3501 case THREAD_STATE_NEW:
3502 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3504 oa = builtin_anewarray(1, class_java_lang_String);
3509 s = javastring_new(utf_new_char("NEW"));
3514 array_objectarray_element_set(oa, 0, s);
3517 case THREAD_STATE_RUNNABLE:
3518 oa = builtin_anewarray(1, class_java_lang_String);
3523 s = javastring_new(utf_new_char("RUNNABLE"));
3528 array_objectarray_element_set(oa, 0, s);
3531 case THREAD_STATE_BLOCKED:
3532 oa = builtin_anewarray(1, class_java_lang_String);
3537 s = javastring_new(utf_new_char("BLOCKED"));
3542 array_objectarray_element_set(oa, 0, s);
3545 case THREAD_STATE_WAITING:
3546 oa = builtin_anewarray(2, class_java_lang_String);
3551 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3552 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3557 array_objectarray_element_set(oa, 0, s);
3558 /* array_objectarray_element_set(oa, 1, s); */
3561 case THREAD_STATE_TIMED_WAITING:
3562 oa = builtin_anewarray(3, class_java_lang_String);
3567 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3568 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3569 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3574 /* array_objectarray_element_set(oa, 0, s); */
3575 array_objectarray_element_set(oa, 0, s);
3576 /* array_objectarray_element_set(oa, 2, s); */
3579 case THREAD_STATE_TERMINATED:
3580 oa = builtin_anewarray(1, class_java_lang_String);
3585 s = javastring_new(utf_new_char("TERMINATED"));
3590 array_objectarray_element_set(oa, 0, s);
3594 /* Unknown state - probably incompatible JDK version */
3598 return (jobjectArray) oa;
3602 /* JVM_GetVersionInfo */
3604 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3606 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3610 /* OS: JVM_RegisterSignal */
3612 void *JVM_RegisterSignal(jint sig, void *handler)
3614 functionptr newHandler;
3616 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3618 if (handler == (void *) 2)
3619 newHandler = (functionptr) signal_thread_handler;
3621 newHandler = (functionptr) (uintptr_t) handler;
3628 /* These signals are already used by the VM. */
3632 /* This signal is used by the VM to dump thread stacks unless
3633 ReduceSignalUsage is set, in which case the user is allowed
3634 to set his own _native_ handler for this signal; thus, in
3635 either case, we do not allow JVM_RegisterSignal to change
3645 signal_register_signal(sig, newHandler, 0);
3647 /* XXX Should return old handler. */
3653 /* OS: JVM_RaiseSignal */
3655 jboolean JVM_RaiseSignal(jint sig)
3657 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3663 /* OS: JVM_FindSignal */
3665 jint JVM_FindSignal(const char *name)
3667 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3669 #if defined(__LINUX__)
3670 if (strcmp(name, "HUP") == 0)
3673 if (strcmp(name, "INT") == 0)
3676 if (strcmp(name, "TERM") == 0)
3679 # error not implemented for this OS
3687 * These are local overrides for various environment variables in Emacs.
3688 * Please do not remove this and leave it at the end of the file, where
3689 * Emacs will automagically detect them.
3690 * ---------------------------------------------------------------------
3693 * indent-tabs-mode: t