1 /* src/native/vm/sun/jvm.c - HotSpot JVM interface functions
3 Copyright (C) 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
36 #if defined(HAVE_SYS_IOCTL_H)
37 #define BSD_COMP /* Get FIONREAD on Solaris2 */
38 #include <sys/ioctl.h>
41 #include <sys/socket.h>
43 #include <sys/types.h>
47 #include "mm/memory.h"
49 #include "native/jni.h"
50 #include "native/llni.h"
51 #include "native/native.h"
53 #include "native/include/java_lang_AssertionStatusDirectives.h"
54 #include "native/include/java_lang_String.h" /* required by j.l.CL */
55 #include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
56 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
57 #include "native/include/java_lang_StackTraceElement.h"
58 #include "native/include/java_lang_Throwable.h"
59 #include "native/include/java_security_ProtectionDomain.h"
61 #if defined(ENABLE_ANNOTATIONS)
62 #include "native/include/sun_reflect_ConstantPool.h"
65 #include "native/vm/java_lang_Class.h"
66 #include "native/vm/java_lang_reflect_Constructor.h"
67 #include "native/vm/java_lang_reflect_Method.h"
68 #include "native/vm/reflect.h"
70 #include "native/vm/sun/hpi.h"
72 #include "threads/lock-common.h"
73 #include "threads/threads-common.h"
75 #include "toolbox/logging.h"
76 #include "toolbox/list.h"
80 #if defined(ENABLE_ASSERTION)
81 #include "vm/assertion.h"
84 #include "vm/builtin.h"
85 #include "vm/exceptions.h"
86 #include "vm/global.h"
87 #include "vm/initialize.h"
88 #include "vm/package.h"
89 #include "vm/primitive.h"
90 #include "vm/properties.h"
91 #include "vm/resolve.h"
92 #include "vm/signallocal.h"
93 #include "vm/stringlocal.h"
96 #include "vm/jit/stacktrace.h"
98 #include "vmcore/classcache.h"
99 #include "vmcore/options.h"
100 #include "vmcore/system.h"
103 /* debugging macros ***********************************************************/
107 # define TRACEJVMCALLS(x) \
109 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
114 # define TRACEJVMCALLSVERBOSE(x) \
116 if (opt_TraceJVMCallsVerbose) { \
121 # define PRINTJVMWARNINGS(x)
123 /* if (opt_PrintJVMWarnings) { \ */
124 /* log_println x; \ */
130 # define TRACEJVMCALLS(x)
131 # define TRACEJVMCALLSVERBOSE(x)
132 # define PRINTJVMWARNINGS(x)
138 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
139 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
140 /* and build number (xx) */
141 unsigned int update_version : 8; /* Update release version (uu) */
142 unsigned int special_update_version : 8; /* Special update release version (c) */
143 unsigned int reserved1 : 16;
144 unsigned int reserved2;
146 /* The following bits represents JVM supports that JDK has dependency on.
147 * JDK can use these bits to determine which JVM version
148 * and support it has to maintain runtime compatibility.
150 * When a new bit is added in a minor or update release, make sure
151 * the new bit is also added in the main/baseline.
153 unsigned int is_attachable : 1;
161 * A structure used to a capture exception table entry in a Java method.
168 } JVM_ExceptionTableEntryType;
171 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
173 if ((intptr_t) count <= 0)
176 return vsnprintf(str, count, fmt, args);
180 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
186 len = jio_vsnprintf(str, count, fmt, ap);
193 int jio_fprintf(FILE* f, const char *fmt, ...)
195 log_println("jio_fprintf: IMPLEMENT ME!");
201 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
203 log_println("jio_vfprintf: IMPLEMENT ME!");
209 int jio_printf(const char *fmt, ...)
211 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)
233 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
235 return (jlong) builtin_currenttimemillis();
241 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
243 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
245 return (jlong) builtin_nanotime();
251 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
256 s = (java_handle_t *) src;
257 d = (java_handle_t *) dst;
259 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));
261 builtin_arraycopy(s, src_pos, d, dst_pos, length);
265 /* JVM_InitProperties */
267 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
272 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
274 h = (java_handle_t *) properties;
276 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
277 sun.nio.MaxDirectMemorySize property. Do this after setting
278 user properties to prevent people from setting the value with a
279 -D option, as requested. */
281 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
282 properties_add("sun.nio.MaxDirectMemorySize", buf);
284 /* Add all properties. */
286 properties_system_add_all(h);
294 void JVM_Exit(jint code)
296 log_println("JVM_Exit: IMPLEMENT ME!");
302 void JVM_Halt(jint code)
304 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
311 /* JVM_OnExit(void (*func)) */
313 void JVM_OnExit(void (*func)(void))
315 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
323 TRACEJVMCALLS(("JVM_GC()"));
329 /* JVM_MaxObjectInspectionAge */
331 jlong JVM_MaxObjectInspectionAge(void)
333 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
339 /* JVM_TraceInstructions */
341 void JVM_TraceInstructions(jboolean on)
343 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
347 /* JVM_TraceMethodCalls */
349 void JVM_TraceMethodCalls(jboolean on)
351 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
355 /* JVM_TotalMemory */
357 jlong JVM_TotalMemory(void)
359 TRACEJVMCALLS(("JVM_TotalMemory()"));
361 return gc_get_heap_size();
367 jlong JVM_FreeMemory(void)
369 TRACEJVMCALLS(("JVM_FreeMemory()"));
371 return gc_get_free_bytes();
377 jlong JVM_MaxMemory(void)
379 TRACEJVMCALLS(("JVM_MaxMemory()"));
381 return gc_get_max_heap_size();
385 /* JVM_ActiveProcessorCount */
387 jint JVM_ActiveProcessorCount(void)
389 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
391 return system_processors_online();
395 /* JVM_FillInStackTrace */
397 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
399 java_lang_Throwable *o;
400 java_handle_bytearray_t *ba;
402 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
404 o = (java_lang_Throwable *) receiver;
406 ba = stacktrace_get_current();
411 LLNI_field_set_ref(o, backtrace, (java_lang_Object *) ba);
415 /* JVM_PrintStackTrace */
417 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
419 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
423 /* JVM_GetStackTraceDepth */
425 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
427 java_lang_Throwable *to;
429 java_handle_bytearray_t *ba;
433 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
435 if (throwable == NULL) {
436 exceptions_throw_nullpointerexception();
440 to = (java_lang_Throwable *) throwable;
442 LLNI_field_get_ref(to, backtrace, o);
444 ba = (java_handle_bytearray_t *) o;
449 /* We need a critical section here as the stacktrace structure is
450 mapped onto a Java byte-array. */
454 st = (stacktrace_t *) LLNI_array_data(ba);
464 /* JVM_GetStackTraceElement */
466 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
468 java_lang_Throwable *to;
470 java_handle_bytearray_t *ba;
472 stacktrace_entry_t *ste;
476 java_lang_StackTraceElement *steo;
477 java_lang_String *declaringclass;
478 java_lang_String *filename;
481 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
483 to = (java_lang_Throwable *) throwable;
485 LLNI_field_get_ref(to, backtrace, o);
487 ba = (java_handle_bytearray_t *) o;
489 /* FIXME critical section */
491 st = (stacktrace_t *) LLNI_array_data(ba);
493 if ((index < 0) || (index >= st->length)) {
494 /* XXX This should be an IndexOutOfBoundsException (check this
497 exceptions_throw_arrayindexoutofboundsexception();
501 /* Get the stacktrace entry. */
503 ste = &(st->entries[index]);
505 /* Get the codeinfo, methodinfo and classinfo. */
511 /* allocate a new StackTraceElement */
513 steo = (java_lang_StackTraceElement *)
514 builtin_new(class_java_lang_StackTraceElement);
521 if (!(m->flags & ACC_NATIVE)) {
522 if (c->sourcefile != NULL)
523 filename = (java_lang_String *) javastring_new(c->sourcefile);
530 /* get line number */
532 if (m->flags & ACC_NATIVE) {
536 /* FIXME The linenumbertable_linenumber_for_pc could change
537 the methodinfo pointer when hitting an inlined method. */
539 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
540 linenumber = (linenumber == 0) ? -1 : linenumber;
543 /* get declaring class name */
545 declaringclass = _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(c));
547 /* fill the java.lang.StackTraceElement element */
549 /* FIXME critical section */
551 steo->declaringClass = declaringclass;
552 steo->methodName = (java_lang_String *) javastring_new(m->name);
553 steo->fileName = filename;
554 steo->lineNumber = linenumber;
556 return (jobject) steo;
562 jint JVM_IHashCode(JNIEnv* env, jobject handle)
564 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
566 return (jint) ((ptrint) handle);
570 /* JVM_MonitorWait */
572 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
574 #if defined(ENABLE_THREADS)
578 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
580 /* exceptions_throw_illegalargumentexception("argument out of range"); */
581 exceptions_throw_illegalargumentexception();
585 #if defined(ENABLE_THREADS)
586 o = (java_handle_t *) handle;
588 lock_wait_for_object(o, ms, 0);
593 /* JVM_MonitorNotify */
595 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
597 #if defined(ENABLE_THREADS)
601 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
603 #if defined(ENABLE_THREADS)
604 o = (java_handle_t *) handle;
606 lock_notify_object(o);
611 /* JVM_MonitorNotifyAll */
613 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
615 #if defined(ENABLE_THREADS)
619 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
621 #if defined(ENABLE_THREADS)
622 o = (java_handle_t *) handle;
624 lock_notify_all_object(o);
631 jobject JVM_Clone(JNIEnv* env, jobject handle)
633 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
635 return (jobject) builtin_clone(env, (java_handle_t *) handle);
639 /* JVM_InitializeCompiler */
641 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
643 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
647 /* JVM_IsSilentCompiler */
649 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
651 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
657 /* JVM_CompileClass */
659 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
661 log_println("JVM_CompileClass: IMPLEMENT ME!");
667 /* JVM_CompileClasses */
669 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
671 log_println("JVM_CompileClasses: IMPLEMENT ME!");
677 /* JVM_CompilerCommand */
679 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
681 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
687 /* JVM_EnableCompiler */
689 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
691 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
692 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
696 /* JVM_DisableCompiler */
698 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
700 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
701 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
705 /* JVM_GetLastErrorString */
707 jint JVM_GetLastErrorString(char *buf, int len)
709 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
711 return hpi_system->GetLastErrorString(buf, len);
717 char *JVM_NativePath(char *path)
719 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
721 return hpi_file->NativePath(path);
725 /* JVM_GetCallerClass */
727 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
731 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
733 c = stacktrace_get_caller_class(depth);
739 /* JVM_FindPrimitiveClass */
741 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
746 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
749 c = primitive_class_get_by_name(u);
751 return (jclass) LLNI_classinfo_wrap(c);
755 /* JVM_ResolveClass */
757 void JVM_ResolveClass(JNIEnv* env, jclass cls)
759 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
760 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
764 /* JVM_FindClassFromClassLoader */
766 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
772 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
774 /* As of now, OpenJDK does not call this function with throwError
777 assert(throwError == false);
779 u = utf_new_char(name);
780 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
782 c = load_class_from_classloader(u, cl);
788 if (!(c->state & CLASS_INITIALIZED))
789 if (!initialize_class(c))
792 return (jclass) LLNI_classinfo_wrap(c);
796 /* JVM_FindClassFromClass */
798 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
800 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
806 /* JVM_DefineClass */
808 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
810 log_println("JVM_DefineClass: IMPLEMENT ME!");
816 /* JVM_DefineClassWithSource */
818 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
824 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
827 u = utf_new_char(name);
831 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
833 /* XXX do something with source */
835 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
837 return (jclass) LLNI_classinfo_wrap(c);
841 /* JVM_FindLoadedClass */
843 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
849 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
851 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
853 u = javastring_toutf((java_handle_t *) name, true);
854 c = classcache_lookup(cl, u);
856 return (jclass) LLNI_classinfo_wrap(c);
860 /* JVM_GetClassName */
862 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
864 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
866 return (jstring) _Jv_java_lang_Class_getName((java_lang_Class *) cls);
870 /* JVM_GetClassInterfaces */
872 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
875 java_handle_objectarray_t *oa;
877 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
879 c = LLNI_classinfo_unwrap(cls);
881 oa = class_get_interfaces(c);
883 return (jobjectArray) oa;
887 /* JVM_GetClassLoader */
889 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
894 TRACEJVMCALLS(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
896 c = LLNI_classinfo_unwrap(cls);
897 cl = class_get_classloader(c);
903 /* JVM_IsInterface */
905 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
909 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
911 c = LLNI_classinfo_unwrap(cls);
913 return class_is_interface(c);
917 /* JVM_GetClassSigners */
919 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
921 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
927 /* JVM_SetClassSigners */
929 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
932 java_handle_objectarray_t *hoa;
934 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
936 c = LLNI_classinfo_unwrap(cls);
938 hoa = (java_handle_objectarray_t *) signers;
940 /* This call is ignored for primitive types and arrays. Signers
941 are only set once, ClassLoader.java, and thus shouldn't be
942 called with an array. Only the bootstrap loader creates
945 if (class_is_primitive(c) || class_is_array(c))
948 LLNI_classinfo_field_set(c, signers, hoa);
952 /* JVM_GetProtectionDomain */
954 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
958 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
960 c = LLNI_classinfo_unwrap(cls);
963 exceptions_throw_nullpointerexception();
967 /* Primitive types do not have a protection domain. */
969 if (class_is_primitive(c))
972 return (jobject) c->protectiondomain;
976 /* JVM_SetProtectionDomain */
978 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
980 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
984 /* JVM_DoPrivileged */
986 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
991 java_handle_t *result;
994 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
996 h = (java_handle_t *) action;
997 LLNI_class_get(h, c);
999 if (action == NULL) {
1000 exceptions_throw_nullpointerexception();
1004 /* lookup run() method (throw no exceptions) */
1006 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1009 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1010 exceptions_throw_internalerror("No run method");
1014 /* XXX It seems something with a privileged stack needs to be done
1017 result = vm_call_method(m, h);
1019 e = exceptions_get_exception();
1022 if ( builtin_instanceof(e, class_java_lang_Exception) &&
1023 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
1024 exceptions_clear_exception();
1025 exceptions_throw_privilegedactionexception(e);
1031 return (jobject) result;
1035 /* JVM_GetInheritedAccessControlContext */
1037 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1039 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1045 /* JVM_GetStackAccessControlContext */
1047 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1049 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
1051 /* XXX All stuff I tested so far works without that function. At
1052 some point we have to implement it, but I disable the output
1053 for now to make IcedTea happy. */
1059 /* JVM_IsArrayClass */
1061 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1065 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1067 c = LLNI_classinfo_unwrap(cls);
1069 return class_is_array(c);
1073 /* JVM_IsPrimitiveClass */
1075 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1079 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1081 c = LLNI_classinfo_unwrap(cls);
1083 return class_is_primitive(c);
1087 /* JVM_GetComponentType */
1089 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1091 classinfo *component;
1094 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1096 c = LLNI_classinfo_unwrap(cls);
1098 component = class_get_componenttype(c);
1100 return (jclass) LLNI_classinfo_wrap(component);
1104 /* JVM_GetClassModifiers */
1106 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1111 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1113 c = LLNI_classinfo_unwrap(cls);
1115 flags = class_get_modifiers(c, false);
1121 /* JVM_GetDeclaredClasses */
1123 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1126 java_handle_objectarray_t *oa;
1128 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1130 c = LLNI_classinfo_unwrap(ofClass);
1132 oa = class_get_declaredclasses(c, false);
1134 return (jobjectArray) oa;
1138 /* JVM_GetDeclaringClass */
1140 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1145 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1147 c = LLNI_classinfo_unwrap(ofClass);
1149 dc = class_get_declaringclass(c);
1151 return (jclass) LLNI_classinfo_wrap(dc);
1155 /* JVM_GetClassSignature */
1157 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1163 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1165 c = LLNI_classinfo_unwrap(cls);
1167 /* Get the signature of the class. */
1169 u = class_get_signature(c);
1174 /* Convert UTF-string to a Java-string. */
1176 s = javastring_new(u);
1182 /* JVM_GetClassAnnotations */
1184 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1186 classinfo *c = NULL; /* classinfo for 'cls' */
1187 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1189 TRACEJVMCALLS(("JVM_GetClassAnnotations: cls=%p", cls));
1192 exceptions_throw_nullpointerexception();
1196 c = LLNI_classinfo_unwrap(cls);
1198 /* get annotations: */
1199 annotations = class_get_annotations(c);
1201 return (jbyteArray)annotations;
1205 /* JVM_GetFieldAnnotations */
1207 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1209 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1210 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1212 TRACEJVMCALLS(("JVM_GetFieldAnnotations: field=%p", field));
1214 if (field == NULL) {
1215 exceptions_throw_nullpointerexception();
1219 rf = (java_lang_reflect_Field*)field;
1221 LLNI_field_get_ref(rf, annotations, ba);
1223 return (jbyteArray)ba;
1227 /* JVM_GetMethodAnnotations */
1229 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1231 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1232 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1234 TRACEJVMCALLS(("JVM_GetMethodAnnotations: method=%p", method));
1236 if (method == NULL) {
1237 exceptions_throw_nullpointerexception();
1241 rm = (java_lang_reflect_Method*)method;
1243 LLNI_field_get_ref(rm, annotations, ba);
1245 return (jbyteArray)ba;
1249 /* JVM_GetMethodDefaultAnnotationValue */
1251 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1253 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1254 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1256 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue: method=%p", method));
1258 if (method == NULL) {
1259 exceptions_throw_nullpointerexception();
1263 rm = (java_lang_reflect_Method*)method;
1265 LLNI_field_get_ref(rm, annotationDefault, ba);
1267 return (jbyteArray)ba;
1271 /* JVM_GetMethodParameterAnnotations */
1273 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1275 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1276 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1278 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations: method=%p", method));
1280 if (method == NULL) {
1281 exceptions_throw_nullpointerexception();
1285 rm = (java_lang_reflect_Method*)method;
1287 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1289 return (jbyteArray)ba;
1293 /* JVM_GetClassDeclaredFields */
1295 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1297 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1299 return (jobjectArray) _Jv_java_lang_Class_getDeclaredFields((java_lang_Class *) ofClass, publicOnly);
1303 /* JVM_GetClassDeclaredMethods */
1305 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1307 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1309 return (jobjectArray) _Jv_java_lang_Class_getDeclaredMethods((java_lang_Class *) ofClass, publicOnly);
1313 /* JVM_GetClassDeclaredConstructors */
1315 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1317 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1319 return (jobjectArray) _Jv_java_lang_Class_getDeclaredConstructors((java_lang_Class *) ofClass, publicOnly);
1323 /* JVM_GetClassAccessFlags */
1325 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1329 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1331 c = LLNI_classinfo_unwrap(cls);
1333 /* Primitive type classes have the correct access flags. */
1335 return c->flags & ACC_CLASS_REFLECT_MASK;
1339 /* JVM_GetClassConstantPool */
1341 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1343 #if defined(ENABLE_ANNOTATIONS)
1344 sun_reflect_ConstantPool *constantPool = NULL;
1345 /* constant pool object for the class refered by 'cls' */
1346 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1347 /* constantPoolOop field of the constant pool object */
1349 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1352 (sun_reflect_ConstantPool*)native_new_and_init(
1353 class_sun_reflect_ConstantPool);
1355 if (constantPool == NULL) {
1360 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1362 return (jobject)constantPool;
1364 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1370 /* JVM_ConstantPoolGetSize */
1372 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1374 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1376 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1378 c = LLNI_classinfo_unwrap(jcpool);
1384 /* JVM_ConstantPoolGetClassAt */
1386 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1388 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1389 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1390 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1392 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1394 c = LLNI_classinfo_unwrap(jcpool);
1396 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1399 exceptions_throw_illegalargumentexception();
1403 result = resolve_classref_eager(ref);
1405 return (jclass) LLNI_classinfo_wrap(result);
1409 /* JVM_ConstantPoolGetClassAtIfLoaded */
1411 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1413 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1414 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1415 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1417 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1419 c = LLNI_classinfo_unwrap(jcpool);
1421 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1424 exceptions_throw_illegalargumentexception();
1428 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1432 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1436 return (jclass) LLNI_classinfo_wrap(result);
1440 /* JVM_ConstantPoolGetMethodAt */
1442 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1444 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1445 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1447 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1449 cls = LLNI_classinfo_unwrap(jcpool);
1450 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1453 exceptions_throw_illegalargumentexception();
1457 /* XXX: is that right? or do I have to use resolve_method_*? */
1458 return (jobject)reflect_method_new(ref->p.method);
1462 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1464 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1466 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1467 classinfo *c = NULL; /* resolved declaring class of the method */
1468 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1470 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1472 cls = LLNI_classinfo_unwrap(jcpool);
1473 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1476 exceptions_throw_illegalargumentexception();
1480 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1484 if (c == NULL || !(c->state & CLASS_LOADED)) {
1488 return (jobject)reflect_method_new(ref->p.method);
1492 /* JVM_ConstantPoolGetFieldAt */
1494 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1496 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1497 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1499 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1501 cls = LLNI_classinfo_unwrap(jcpool);
1502 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1505 exceptions_throw_illegalargumentexception();
1509 return (jobject)reflect_field_new(ref->p.field);
1513 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1515 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1517 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1518 classinfo *c; /* resolved declaring class for the field */
1519 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1521 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1523 cls = LLNI_classinfo_unwrap(jcpool);
1524 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1527 exceptions_throw_illegalargumentexception();
1531 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1535 if (c == NULL || !(c->state & CLASS_LOADED)) {
1539 return (jobject)reflect_field_new(ref->p.field);
1543 /* JVM_ConstantPoolGetMemberRefInfoAt */
1545 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1547 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1549 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1555 /* JVM_ConstantPoolGetIntAt */
1557 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1559 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1560 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1562 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1564 cls = LLNI_classinfo_unwrap(jcpool);
1565 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1568 exceptions_throw_illegalargumentexception();
1576 /* JVM_ConstantPoolGetLongAt */
1578 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1580 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1581 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1583 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1585 cls = LLNI_classinfo_unwrap(jcpool);
1586 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1589 exceptions_throw_illegalargumentexception();
1597 /* JVM_ConstantPoolGetFloatAt */
1599 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1601 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1602 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1604 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1606 cls = LLNI_classinfo_unwrap(jcpool);
1607 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1610 exceptions_throw_illegalargumentexception();
1618 /* JVM_ConstantPoolGetDoubleAt */
1620 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1622 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1623 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1625 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1627 cls = LLNI_classinfo_unwrap(jcpool);
1628 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1631 exceptions_throw_illegalargumentexception();
1639 /* JVM_ConstantPoolGetStringAt */
1641 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1643 utf *ref; /* utf object for the string in constant pool at index 'index' */
1644 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1646 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1648 cls = LLNI_classinfo_unwrap(jcpool);
1649 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1652 exceptions_throw_illegalargumentexception();
1656 /* XXX: I hope literalstring_new is the right Function. */
1657 return (jstring)literalstring_new(ref);
1661 /* JVM_ConstantPoolGetUTF8At */
1663 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1665 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1666 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1668 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1670 cls = LLNI_classinfo_unwrap(jcpool);
1671 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1674 exceptions_throw_illegalargumentexception();
1678 /* XXX: I hope literalstring_new is the right Function. */
1679 return (jstring)literalstring_new(ref);
1683 /* JVM_DesiredAssertionStatus */
1685 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1687 #if defined(ENABLE_ASSERTION)
1688 assertion_name_t *item;
1693 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1695 c = LLNI_classinfo_unwrap(cls);
1697 if (c->classloader == NULL) {
1698 status = (jboolean)assertion_system_enabled;
1701 status = (jboolean)assertion_user_enabled;
1704 if (list_assertion_names != NULL) {
1705 item = (assertion_name_t *)list_first(list_assertion_names);
1706 while (item != NULL) {
1707 name = utf_new_char(item->name);
1708 if (name == c->packagename) {
1709 status = (jboolean)item->enabled;
1711 else if (name == c->name) {
1712 status = (jboolean)item->enabled;
1715 item = (assertion_name_t *)list_next(list_assertion_names, item);
1721 return (jboolean)false;
1726 /* JVM_AssertionStatusDirectives */
1728 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1731 java_lang_AssertionStatusDirectives *o;
1732 java_handle_objectarray_t *classes;
1733 java_handle_objectarray_t *packages;
1734 java_booleanarray_t *classEnabled;
1735 java_booleanarray_t *packageEnabled;
1736 #if defined(ENABLE_ASSERTION)
1737 assertion_name_t *item;
1742 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1744 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1749 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1754 #if defined(ENABLE_ASSERTION)
1755 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1757 classes = builtin_anewarray(0, class_java_lang_Object);
1759 if (classes == NULL)
1762 #if defined(ENABLE_ASSERTION)
1763 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1765 packages = builtin_anewarray(0, class_java_lang_Object);
1767 if (packages == NULL)
1770 #if defined(ENABLE_ASSERTION)
1771 classEnabled = builtin_newarray_boolean(assertion_class_count);
1773 classEnabled = builtin_newarray_boolean(0);
1775 if (classEnabled == NULL)
1778 #if defined(ENABLE_ASSERTION)
1779 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1781 packageEnabled = builtin_newarray_boolean(0);
1783 if (packageEnabled == NULL)
1786 #if defined(ENABLE_ASSERTION)
1787 /* initialize arrays */
1789 if (list_assertion_names != NULL) {
1793 item = (assertion_name_t *)list_first(list_assertion_names);
1794 while (item != NULL) {
1795 js = javastring_new_from_ascii(item->name);
1800 if (item->package == false) {
1801 classes->data[i] = js;
1802 classEnabled->data[i] = (jboolean) item->enabled;
1806 packages->data[j] = js;
1807 packageEnabled->data[j] = (jboolean) item->enabled;
1811 item = (assertion_name_t *)list_next(list_assertion_names, item);
1816 /* set instance fields */
1818 o->classes = classes;
1819 o->packages = packages;
1820 o->classEnabled = classEnabled;
1821 o->packageEnabled = packageEnabled;
1827 /* JVM_GetClassNameUTF */
1829 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1831 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1837 /* JVM_GetClassCPTypes */
1839 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1841 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1845 /* JVM_GetClassCPEntriesCount */
1847 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1849 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1855 /* JVM_GetClassFieldsCount */
1857 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1859 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1865 /* JVM_GetClassMethodsCount */
1867 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1869 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1875 /* JVM_GetMethodIxExceptionIndexes */
1877 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1879 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1883 /* JVM_GetMethodIxExceptionsCount */
1885 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1887 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1893 /* JVM_GetMethodIxByteCode */
1895 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1897 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1901 /* JVM_GetMethodIxByteCodeLength */
1903 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1905 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1911 /* JVM_GetMethodIxExceptionTableEntry */
1913 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1915 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1919 /* JVM_GetMethodIxExceptionTableLength */
1921 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1923 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1929 /* JVM_GetMethodIxModifiers */
1931 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1933 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1939 /* JVM_GetFieldIxModifiers */
1941 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1943 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1949 /* JVM_GetMethodIxLocalsCount */
1951 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1953 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1959 /* JVM_GetMethodIxArgsSize */
1961 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1963 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1969 /* JVM_GetMethodIxMaxStack */
1971 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1973 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1979 /* JVM_IsConstructorIx */
1981 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1983 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1989 /* JVM_GetMethodIxNameUTF */
1991 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1993 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1999 /* JVM_GetMethodIxSignatureUTF */
2001 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
2003 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
2009 /* JVM_GetCPFieldNameUTF */
2011 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2013 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
2019 /* JVM_GetCPMethodNameUTF */
2021 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2023 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
2029 /* JVM_GetCPMethodSignatureUTF */
2031 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2033 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
2039 /* JVM_GetCPFieldSignatureUTF */
2041 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2043 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2049 /* JVM_GetCPClassNameUTF */
2051 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2053 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2059 /* JVM_GetCPFieldClassNameUTF */
2061 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2063 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2069 /* JVM_GetCPMethodClassNameUTF */
2071 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2073 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2079 /* JVM_GetCPFieldModifiers */
2081 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2083 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2089 /* JVM_GetCPMethodModifiers */
2091 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2093 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2099 /* JVM_ReleaseUTF */
2101 void JVM_ReleaseUTF(const char *utf)
2103 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2107 /* JVM_IsSameClassPackage */
2109 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2111 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2119 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2122 * JVM I/O error codes
2124 #define JVM_EEXIST -100
2126 jint JVM_Open(const char *fname, jint flags, jint mode)
2130 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2132 result = hpi_file->Open(fname, flags, mode);
2150 jint JVM_Close(jint fd)
2152 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2154 return hpi_file->Close(fd);
2160 jint JVM_Read(jint fd, char *buf, jint nbytes)
2162 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2164 return (jint) hpi_file->Read(fd, buf, nbytes);
2170 jint JVM_Write(jint fd, char *buf, jint nbytes)
2172 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2174 return (jint) hpi_file->Write(fd, buf, nbytes);
2180 jint JVM_Available(jint fd, jlong *pbytes)
2182 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2184 return hpi_file->Available(fd, pbytes);
2190 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2192 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2194 return hpi_file->Seek(fd, (off_t) offset, whence);
2200 jint JVM_SetLength(jint fd, jlong length)
2202 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2204 return hpi_file->SetLength(fd, length);
2210 jint JVM_Sync(jint fd)
2212 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2214 return hpi_file->Sync(fd);
2218 /* JVM_StartThread */
2220 void JVM_StartThread(JNIEnv* env, jobject jthread)
2222 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2224 threads_thread_start((java_handle_t *) jthread);
2228 /* JVM_StopThread */
2230 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2232 log_println("JVM_StopThread: IMPLEMENT ME!");
2236 /* JVM_IsThreadAlive */
2238 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2244 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2246 h = (java_handle_t *) jthread;
2247 t = thread_get_thread(h);
2249 /* The threadobject is null when a thread is created in Java. The
2250 priority is set later during startup. */
2255 result = threads_thread_is_alive(t);
2261 /* JVM_SuspendThread */
2263 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2265 log_println("JVM_SuspendThread: IMPLEMENT ME!");
2269 /* JVM_ResumeThread */
2271 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2273 log_println("JVM_ResumeThread: IMPLEMENT ME!");
2277 /* JVM_SetThreadPriority */
2279 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2284 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2286 h = (java_handle_t *) jthread;
2287 t = thread_get_thread(h);
2289 /* The threadobject is null when a thread is created in Java. The
2290 priority is set later during startup. */
2295 threads_set_thread_priority(t->tid, prio);
2301 void JVM_Yield(JNIEnv *env, jclass threadClass)
2303 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2311 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2313 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2315 threads_sleep(millis, 0);
2319 /* JVM_CurrentThread */
2321 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2325 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2327 o = threads_get_current_object();
2333 /* JVM_CountStackFrames */
2335 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2337 log_println("JVM_CountStackFrames: IMPLEMENT ME!");
2345 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2350 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2352 h = (java_handle_t *) jthread;
2353 t = thread_get_thread(h);
2358 threads_thread_interrupt(t);
2362 /* JVM_IsInterrupted */
2364 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2369 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2371 h = (java_handle_t *) jthread;
2372 t = thread_get_thread(h);
2374 /* XXX do something with clear_interrupted */
2376 return threads_thread_has_been_interrupted(t);
2382 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2387 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2389 h = (java_handle_t *) obj;
2392 exceptions_throw_nullpointerexception();
2396 result = lock_is_held_by_current_thread(h);
2402 /* JVM_DumpAllStacks */
2404 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2406 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2410 /* JVM_CurrentLoadedClass */
2412 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2414 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2420 /* JVM_CurrentClassLoader */
2422 jobject JVM_CurrentClassLoader(JNIEnv *env)
2424 /* XXX if a method in a class in a trusted loader is in a
2425 doPrivileged, return NULL */
2427 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2433 /* JVM_GetClassContext */
2435 jobjectArray JVM_GetClassContext(JNIEnv *env)
2437 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2439 return (jobjectArray) stacktrace_getClassContext();
2443 /* JVM_ClassDepth */
2445 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2447 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2453 /* JVM_ClassLoaderDepth */
2455 jint JVM_ClassLoaderDepth(JNIEnv *env)
2457 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2463 /* JVM_GetSystemPackage */
2465 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2471 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2473 /* s = package_find(name); */
2474 u = javastring_toutf((java_handle_t *) name, false);
2476 result = package_find(u);
2479 s = javastring_new(result);
2487 /* JVM_GetSystemPackages */
2489 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2491 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2497 /* JVM_AllocateNewObject */
2499 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2501 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2507 /* JVM_AllocateNewArray */
2509 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2511 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2517 /* JVM_LatestUserDefinedLoader */
2519 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2523 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2525 cl = stacktrace_first_nonnull_classloader();
2527 return (jobject) cl;
2531 /* JVM_LoadClass0 */
2533 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2535 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2541 /* JVM_GetArrayLength */
2543 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2547 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2549 a = (java_handle_t *) arr;
2551 return array_length_get(a);
2555 /* JVM_GetArrayElement */
2557 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2562 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2564 a = (java_handle_t *) arr;
2566 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2567 /* exceptions_throw_illegalargumentexception(); */
2571 o = array_element_get(a, index);
2577 /* JVM_GetPrimitiveArrayElement */
2579 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2583 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2591 /* JVM_SetArrayElement */
2593 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2596 java_handle_t *value;
2598 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2600 a = (java_handle_t *) arr;
2601 value = (java_handle_t *) val;
2603 array_element_set(a, index, value);
2607 /* JVM_SetPrimitiveArrayElement */
2609 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2611 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2617 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2622 java_handle_objectarray_t *oa;
2624 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2626 if (eltClass == NULL) {
2627 exceptions_throw_nullpointerexception();
2631 /* NegativeArraySizeException is checked in builtin_newarray. */
2633 c = LLNI_classinfo_unwrap(eltClass);
2635 /* Create primitive or object array. */
2637 if (class_is_primitive(c)) {
2638 pc = primitive_arrayclass_get_by_name(c->name);
2640 /* void arrays are not allowed. */
2643 exceptions_throw_illegalargumentexception();
2647 a = builtin_newarray(length, pc);
2652 oa = builtin_anewarray(length, c);
2654 return (jobject) oa;
2659 /* JVM_NewMultiArray */
2661 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2664 java_handle_intarray_t *ia;
2670 java_handle_objectarray_t *a;
2672 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2674 if (eltClass == NULL) {
2675 exceptions_throw_nullpointerexception();
2679 /* NegativeArraySizeException is checked in builtin_newarray. */
2681 c = LLNI_classinfo_unwrap(eltClass);
2683 ia = (java_handle_intarray_t *) dim;
2685 length = array_length_get((java_handle_t *) ia);
2687 /* We check here for exceptions thrown in array_length_get,
2688 otherwise these exceptions get overwritten by the following
2689 IllegalArgumentException. */
2694 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2695 exceptions_throw_illegalargumentexception();
2699 /* XXX This is just a quick hack to get it working. */
2701 dims = MNEW(long, length);
2703 for (i = 0; i < length; i++) {
2704 value = LLNI_array_direct(ia, i);
2705 dims[i] = (long) value;
2708 /* Create an array-class if necessary. */
2710 if (class_is_primitive(c))
2711 ac = primitive_arrayclass_get_by_name(c->name);
2713 ac = class_array_of(c, true);
2718 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2724 /* JVM_InitializeSocketLibrary */
2726 jint JVM_InitializeSocketLibrary()
2728 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2730 return hpi_initialize_socket_library();
2736 jint JVM_Socket(jint domain, jint type, jint protocol)
2738 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2740 return system_socket(domain, type, protocol);
2744 /* JVM_SocketClose */
2746 jint JVM_SocketClose(jint fd)
2748 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2750 return system_close(fd);
2754 /* JVM_SocketShutdown */
2756 jint JVM_SocketShutdown(jint fd, jint howto)
2758 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2760 return system_shutdown(fd, howto);
2766 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2768 log_println("JVM_Recv: IMPLEMENT ME!");
2776 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2778 log_println("JVM_Send: IMPLEMENT ME!");
2786 jint JVM_Timeout(int fd, long timeout)
2788 log_println("JVM_Timeout: IMPLEMENT ME!");
2796 jint JVM_Listen(jint fd, jint count)
2798 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2800 return system_listen(fd, count);
2806 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2808 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2810 return system_connect(fd, him, len);
2816 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2818 log_println("JVM_Bind: IMPLEMENT ME!");
2826 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2828 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2830 return system_accept(fd, him, (socklen_t *) len);
2836 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2838 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2844 /* JVM_GetSockName */
2846 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2848 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2850 return system_getsockname(fd, him, (socklen_t *) len);
2856 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2858 log_println("JVM_SendTo: IMPLEMENT ME!");
2864 /* JVM_SocketAvailable */
2866 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2868 #if defined(FIONREAD)
2872 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2876 result = ioctl(fd, FIONREAD, &bytes);
2885 # error FIONREAD not defined
2890 /* JVM_GetSockOpt */
2892 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2894 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2896 return system_getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2900 /* JVM_SetSockOpt */
2902 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2904 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2906 return system_setsockopt(fd, level, optname, optval, optlen);
2910 /* JVM_GetHostName */
2912 int JVM_GetHostName(char *name, int namelen)
2914 TRACEJVMCALLS(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2916 return system_gethostname(name, namelen);
2920 /* JVM_GetHostByAddr */
2922 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2924 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2930 /* JVM_GetHostByName */
2932 struct hostent *JVM_GetHostByName(char* name)
2934 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2940 /* JVM_GetProtoByName */
2942 struct protoent *JVM_GetProtoByName(char* name)
2944 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2950 /* JVM_LoadLibrary */
2952 void *JVM_LoadLibrary(const char *name)
2956 TRACEJVMCALLS(("JVM_LoadLibrary(name=%s)", name));
2958 u = utf_new_char(name);
2960 return native_library_open(u);
2964 /* JVM_UnloadLibrary */
2966 void JVM_UnloadLibrary(void* handle)
2968 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2970 native_library_close(handle);
2974 /* JVM_FindLibraryEntry */
2976 void *JVM_FindLibraryEntry(void *handle, const char *name)
2980 TRACEJVMCALLS(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
2982 symbol = lt_dlsym(handle, name);
2990 jboolean JVM_IsNaN(jdouble a)
2992 log_println("JVM_IsNaN: IMPLEMENT ME!");
2998 /* JVM_IsSupportedJNIVersion */
3000 jboolean JVM_IsSupportedJNIVersion(jint version)
3002 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
3004 return jni_version_check(version);
3008 /* JVM_InternString */
3010 jstring JVM_InternString(JNIEnv *env, jstring str)
3012 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
3014 return (jstring) javastring_intern((java_handle_t *) str);
3018 /* JVM_RawMonitorCreate */
3020 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3024 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3026 o = NEW(java_object_t);
3028 lock_init_object_lock(o);
3034 /* JVM_RawMonitorDestroy */
3036 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3038 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3040 FREE(mon, java_object_t);
3044 /* JVM_RawMonitorEnter */
3046 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3048 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3050 (void) lock_monitor_enter((java_object_t *) mon);
3056 /* JVM_RawMonitorExit */
3058 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3060 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3062 (void) lock_monitor_exit((java_object_t *) mon);
3066 /* JVM_SetPrimitiveFieldValues */
3068 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3070 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3074 /* JVM_GetPrimitiveFieldValues */
3076 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3078 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3082 /* JVM_AccessVMBooleanFlag */
3084 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3086 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3092 /* JVM_AccessVMIntFlag */
3094 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3096 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3102 /* JVM_VMBreakPoint */
3104 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3106 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3110 /* JVM_GetClassFields */
3112 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3114 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3120 /* JVM_GetClassMethods */
3122 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3124 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3130 /* JVM_GetClassConstructors */
3132 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3134 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3140 /* JVM_GetClassField */
3142 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3144 log_println("JVM_GetClassField: IMPLEMENT ME!");
3150 /* JVM_GetClassMethod */
3152 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3154 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3160 /* JVM_GetClassConstructor */
3162 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3164 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3170 /* JVM_NewInstance */
3172 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3174 log_println("JVM_NewInstance: IMPLEMENT ME!");
3182 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3184 log_println("JVM_GetField: IMPLEMENT ME!");
3190 /* JVM_GetPrimitiveField */
3192 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3196 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3206 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3208 log_println("JVM_SetField: IMPLEMENT ME!");
3212 /* JVM_SetPrimitiveField */
3214 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3216 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3220 /* JVM_InvokeMethod */
3222 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3224 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3226 return (jobject) _Jv_java_lang_reflect_Method_invoke((java_lang_reflect_Method *) method, (java_lang_Object *) obj, (java_handle_objectarray_t *) args0);
3230 /* JVM_NewInstanceFromConstructor */
3232 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)
3234 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, c, args0));
3236 return (jobject) _Jv_java_lang_reflect_Constructor_newInstance(env, (java_lang_reflect_Constructor *) c, (java_handle_objectarray_t *) args0);
3240 /* JVM_SupportsCX8 */
3242 jboolean JVM_SupportsCX8()
3244 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3254 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3256 log_println("JVM_CX8Field: IMPLEMENT ME!");
3262 /* JVM_GetAllThreads */
3264 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3266 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3272 /* JVM_DumpThreads */
3274 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3276 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3282 /* JVM_GetManagement */
3284 void *JVM_GetManagement(jint version)
3286 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3288 /* TODO We current don't support the management interface. */
3294 /* JVM_InitAgentProperties */
3296 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3298 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3304 /* JVM_GetEnclosingMethodInfo */
3306 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3310 java_handle_objectarray_t *oa;
3312 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3314 c = LLNI_classinfo_unwrap(ofClass);
3316 if ((c == NULL) || class_is_primitive(c))
3319 m = class_get_enclosingmethod(c);
3324 oa = builtin_anewarray(3, class_java_lang_Object);
3329 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->class));
3330 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3331 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3333 return (jobjectArray) oa;
3337 /* JVM_GetThreadStateValues */
3339 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3341 java_handle_intarray_t *ia;
3343 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3344 env, javaThreadState));
3346 /* If new thread states are added in future JDK and VM versions,
3347 this should check if the JDK version is compatible with thread
3348 states supported by the VM. Return NULL if not compatible.
3350 This function must map the VM java_lang_Thread::ThreadStatus
3351 to the Java thread state that the JDK supports. */
3353 switch (javaThreadState) {
3354 case THREAD_STATE_NEW:
3355 ia = builtin_newarray_int(1);
3360 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3363 case THREAD_STATE_RUNNABLE:
3364 ia = builtin_newarray_int(1);
3369 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3372 case THREAD_STATE_BLOCKED:
3373 ia = builtin_newarray_int(1);
3378 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3381 case THREAD_STATE_WAITING:
3382 ia = builtin_newarray_int(2);
3387 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3388 /* XXX Implement parked stuff. */
3389 /* array_intarray_element_set(ia, 1, PARKED); */
3392 case THREAD_STATE_TIMED_WAITING:
3393 ia = builtin_newarray_int(3);
3398 /* XXX Not sure about that one. */
3399 /* array_intarray_element_set(ia, 0, SLEEPING); */
3400 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3401 /* XXX Implement parked stuff. */
3402 /* array_intarray_element_set(ia, 2, PARKED); */
3405 case THREAD_STATE_TERMINATED:
3406 ia = builtin_newarray_int(1);
3411 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3415 /* Unknown state - probably incompatible JDK version */
3419 return (jintArray) ia;
3423 /* JVM_GetThreadStateNames */
3425 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3427 java_handle_intarray_t *ia;
3428 java_handle_objectarray_t *oa;
3431 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3432 env, javaThreadState, values));
3434 ia = (java_handle_intarray_t *) values;
3436 /* If new thread states are added in future JDK and VM versions,
3437 this should check if the JDK version is compatible with thread
3438 states supported by the VM. Return NULL if not compatible.
3440 This function must map the VM java_lang_Thread::ThreadStatus
3441 to the Java thread state that the JDK supports. */
3443 if (values == NULL) {
3444 exceptions_throw_nullpointerexception();
3448 switch (javaThreadState) {
3449 case THREAD_STATE_NEW:
3450 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3452 oa = builtin_anewarray(1, class_java_lang_String);
3457 s = javastring_new(utf_new_char("NEW"));
3462 array_objectarray_element_set(oa, 0, s);
3465 case THREAD_STATE_RUNNABLE:
3466 oa = builtin_anewarray(1, class_java_lang_String);
3471 s = javastring_new(utf_new_char("RUNNABLE"));
3476 array_objectarray_element_set(oa, 0, s);
3479 case THREAD_STATE_BLOCKED:
3480 oa = builtin_anewarray(1, class_java_lang_String);
3485 s = javastring_new(utf_new_char("BLOCKED"));
3490 array_objectarray_element_set(oa, 0, s);
3493 case THREAD_STATE_WAITING:
3494 oa = builtin_anewarray(2, class_java_lang_String);
3499 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3500 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3505 array_objectarray_element_set(oa, 0, s);
3506 /* array_objectarray_element_set(oa, 1, s); */
3509 case THREAD_STATE_TIMED_WAITING:
3510 oa = builtin_anewarray(3, class_java_lang_String);
3515 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3516 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3517 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3522 /* array_objectarray_element_set(oa, 0, s); */
3523 array_objectarray_element_set(oa, 0, s);
3524 /* array_objectarray_element_set(oa, 2, s); */
3527 case THREAD_STATE_TERMINATED:
3528 oa = builtin_anewarray(1, class_java_lang_String);
3533 s = javastring_new(utf_new_char("TERMINATED"));
3538 array_objectarray_element_set(oa, 0, s);
3542 /* Unknown state - probably incompatible JDK version */
3546 return (jobjectArray) oa;
3550 /* JVM_GetVersionInfo */
3552 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3554 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3558 /* OS: JVM_RegisterSignal */
3560 void *JVM_RegisterSignal(jint sig, void *handler)
3562 functionptr newHandler;
3564 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3566 if (handler == (void *) 2)
3567 newHandler = (functionptr) signal_thread_handler;
3569 newHandler = (functionptr) (uintptr_t) handler;
3576 /* These signals are already used by the VM. */
3580 /* This signal is used by the VM to dump thread stacks unless
3581 ReduceSignalUsage is set, in which case the user is allowed
3582 to set his own _native_ handler for this signal; thus, in
3583 either case, we do not allow JVM_RegisterSignal to change
3593 signal_register_signal(sig, newHandler, 0);
3595 /* XXX Should return old handler. */
3601 /* OS: JVM_RaiseSignal */
3603 jboolean JVM_RaiseSignal(jint sig)
3605 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3611 /* OS: JVM_FindSignal */
3613 jint JVM_FindSignal(const char *name)
3615 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3617 #if defined(__LINUX__)
3618 if (strcmp(name, "HUP") == 0)
3621 if (strcmp(name, "INT") == 0)
3624 if (strcmp(name, "TERM") == 0)
3627 # error not implemented for this OS
3635 * These are local overrides for various environment variables in Emacs.
3636 * Please do not remove this and leave it at the end of the file, where
3637 * Emacs will automagically detect them.
3638 * ---------------------------------------------------------------------
3641 * indent-tabs-mode: t