1 /* src/native/vm/openjdk/jvm.cpp - HotSpot VM 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
35 #if defined(HAVE_SYS_IOCTL_H)
36 #define BSD_COMP /* Get FIONREAD on Solaris2 */
37 #include <sys/ioctl.h>
40 #include <sys/socket.h>
42 #include <sys/types.h>
46 #include "mm/memory.h"
48 #include "native/jni.hpp"
49 #include "native/llni.h"
50 #include "native/native.h"
52 #include "native/vm/reflection.hpp"
54 #include "native/vm/openjdk/hpi.h"
56 #include "threads/lock-common.h"
57 #include "threads/thread.hpp"
59 #include "toolbox/logging.h"
60 #include "toolbox/list.h"
64 #if defined(ENABLE_ASSERTION)
65 #include "vm/assertion.hpp"
68 #include "vm/jit/builtin.hpp"
69 #include "vm/classcache.h"
70 #include "vm/exceptions.hpp"
71 #include "vm/global.h"
72 #include "vm/globals.hpp"
73 #include "vm/initialize.h"
74 #include "vm/javaobjects.hpp"
75 #include "vm/options.h"
77 #include "vm/package.hpp"
78 #include "vm/primitive.hpp"
79 #include "vm/properties.hpp"
80 #include "vm/resolve.h"
81 #include "vm/signallocal.h"
82 #include "vm/string.hpp"
85 #include "vm/jit/stacktrace.hpp"
88 /* debugging macros ***********************************************************/
92 # define TRACEJVMCALLS(x) \
94 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
99 # define TRACEJVMCALLSENTER(x) \
101 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
107 # define TRACEJVMCALLSEXIT(x) \
109 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
115 # define TRACEJVMCALLSVERBOSE(x) \
117 if (opt_TraceJVMCallsVerbose) { \
122 # define PRINTJVMWARNINGS(x)
124 /* if (opt_PrintJVMWarnings) { \ */
125 /* log_println x; \ */
131 # define TRACEJVMCALLS(x)
132 # define TRACEJVMCALLSENTER(x)
133 # define TRACEJVMCALLSEXIT(x)
134 # define TRACEJVMCALLSVERBOSE(x)
135 # define PRINTJVMWARNINGS(x)
141 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
142 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
143 /* and build number (xx) */
144 unsigned int update_version : 8; /* Update release version (uu) */
145 unsigned int special_update_version : 8; /* Special update release version (c) */
146 unsigned int reserved1 : 16;
147 unsigned int reserved2;
149 /* The following bits represents JVM supports that JDK has dependency on.
150 * JDK can use these bits to determine which JVM version
151 * and support it has to maintain runtime compatibility.
153 * When a new bit is added in a minor or update release, make sure
154 * the new bit is also added in the main/baseline.
156 unsigned int is_attachable : 1;
164 * A structure used to a capture exception table entry in a Java method.
171 } JVM_ExceptionTableEntryType;
174 // Interface functions are exported as C functions.
177 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
179 if ((intptr_t) count <= 0)
182 return vsnprintf(str, count, fmt, args);
186 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
192 len = jio_vsnprintf(str, count, fmt, ap);
199 int jio_fprintf(FILE* f, const char *fmt, ...)
201 log_println("jio_fprintf: IMPLEMENT ME!");
207 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
209 log_println("jio_vfprintf: IMPLEMENT ME!");
215 int jio_printf(const char *fmt, ...)
217 log_println("jio_printf: IMPLEMENT ME!");
223 /* JVM_GetInterfaceVersion */
225 jint JVM_GetInterfaceVersion()
227 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
229 #define JVM_INTERFACE_VERSION 4
231 return JVM_INTERFACE_VERSION;
235 /* JVM_CurrentTimeMillis */
237 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
239 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
241 return (jlong) builtin_currenttimemillis();
247 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
249 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
251 return (jlong) builtin_nanotime();
257 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
262 s = (java_handle_t *) src;
263 d = (java_handle_t *) dst;
265 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));
267 builtin_arraycopy(s, src_pos, d, dst_pos, length);
271 /* JVM_InitProperties */
273 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
278 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
280 h = (java_handle_t *) properties;
282 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
283 sun.nio.MaxDirectMemorySize property. Do this after setting
284 user properties to prevent people from setting the value with a
285 -D option, as requested. */
287 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
288 VM::get_current()->get_properties().put("sun.nio.MaxDirectMemorySize", buf);
290 // Fill the java.util.Properties object.
291 VM::get_current()->get_properties().fill(h);
299 void JVM_Exit(jint code)
301 log_println("JVM_Exit: IMPLEMENT ME!");
307 void JVM_Halt(jint code)
309 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
316 /* JVM_OnExit(void (*func)) */
318 void JVM_OnExit(void (*func)(void))
320 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
328 TRACEJVMCALLS(("JVM_GC()"));
334 /* JVM_MaxObjectInspectionAge */
336 jlong JVM_MaxObjectInspectionAge(void)
338 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
344 /* JVM_TraceInstructions */
346 void JVM_TraceInstructions(jboolean on)
348 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
352 /* JVM_TraceMethodCalls */
354 void JVM_TraceMethodCalls(jboolean on)
356 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
360 /* JVM_TotalMemory */
362 jlong JVM_TotalMemory(void)
364 TRACEJVMCALLS(("JVM_TotalMemory()"));
366 return gc_get_heap_size();
372 jlong JVM_FreeMemory(void)
374 TRACEJVMCALLS(("JVM_FreeMemory()"));
376 return gc_get_free_bytes();
382 jlong JVM_MaxMemory(void)
384 TRACEJVMCALLS(("JVM_MaxMemory()"));
386 return gc_get_max_heap_size();
390 /* JVM_ActiveProcessorCount */
392 jint JVM_ActiveProcessorCount(void)
394 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
396 return os::processors_online();
400 /* JVM_FillInStackTrace */
402 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
404 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
406 java_handle_bytearray_t* ba = stacktrace_get_current();
411 java_lang_Throwable jlt(receiver, 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 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
429 java_lang_Throwable jlt(throwable);
432 exceptions_throw_nullpointerexception();
436 java_handle_bytearray_t* ba = jlt.get_backtrace();
441 // We need a critical section here as the stacktrace structure is
442 // mapped onto a Java byte-array.
446 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
448 int32_t depth = st->length;
456 /* JVM_GetStackTraceElement */
458 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
460 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
462 java_lang_Throwable jlt(throwable);
463 java_handle_bytearray_t* ba = jlt.get_backtrace();
465 // We need a critical section here as the stacktrace structure is
466 // mapped onto a Java byte-array.
469 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
471 if ((index < 0) || (index >= st->length)) {
472 /* XXX This should be an IndexOutOfBoundsException (check this
474 exceptions_throw_arrayindexoutofboundsexception();
478 // Get the stacktrace entry.
479 stacktrace_entry_t* ste = &(st->entries[index]);
481 // Get the codeinfo, methodinfo and classinfo.
482 codeinfo* code = ste->code;
483 methodinfo* m = code->m;
484 classinfo* c = m->clazz;
487 java_handle_t* filename;
489 if (!(m->flags & ACC_NATIVE)) {
490 if (c->sourcefile != NULL)
491 filename = javastring_new(c->sourcefile);
501 if (m->flags & ACC_NATIVE) {
505 /* FIXME The linenumbertable_linenumber_for_pc could change
506 the methodinfo pointer when hitting an inlined method. */
508 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
509 linenumber = (linenumber == 0) ? -1 : linenumber;
514 // Get declaring class name.
515 java_handle_t* declaringclass = class_get_classname(c);
517 // Allocate a new StackTraceElement object.
518 java_lang_StackTraceElement jlste(declaringclass, javastring_new(m->name), filename, linenumber);
523 return (jobject) jlste.get_handle();
529 jint JVM_IHashCode(JNIEnv* env, jobject handle)
531 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
533 java_lang_Object o(handle);
535 return o.get_hashcode();
539 /* JVM_MonitorWait */
541 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
543 #if defined(ENABLE_THREADS)
547 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
549 /* exceptions_throw_illegalargumentexception("argument out of range"); */
550 exceptions_throw_illegalargumentexception();
554 #if defined(ENABLE_THREADS)
555 o = (java_handle_t *) handle;
557 lock_wait_for_object(o, ms, 0);
562 /* JVM_MonitorNotify */
564 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
566 #if defined(ENABLE_THREADS)
570 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
572 #if defined(ENABLE_THREADS)
573 o = (java_handle_t *) handle;
575 lock_notify_object(o);
580 /* JVM_MonitorNotifyAll */
582 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
584 #if defined(ENABLE_THREADS)
588 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
590 #if defined(ENABLE_THREADS)
591 o = (java_handle_t *) handle;
593 lock_notify_all_object(o);
600 jobject JVM_Clone(JNIEnv* env, jobject handle)
602 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
604 return (jobject) builtin_clone(env, (java_handle_t *) handle);
608 /* JVM_InitializeCompiler */
610 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
612 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
616 /* JVM_IsSilentCompiler */
618 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
620 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
626 /* JVM_CompileClass */
628 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
630 log_println("JVM_CompileClass: IMPLEMENT ME!");
636 /* JVM_CompileClasses */
638 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
640 log_println("JVM_CompileClasses: IMPLEMENT ME!");
646 /* JVM_CompilerCommand */
648 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
650 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
656 /* JVM_EnableCompiler */
658 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
660 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
661 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
665 /* JVM_DisableCompiler */
667 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
669 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
670 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
674 /* JVM_GetLastErrorString */
676 jint JVM_GetLastErrorString(char *buf, int len)
678 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
680 return hpi_system->GetLastErrorString(buf, len);
686 char *JVM_NativePath(char *path)
688 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
690 return hpi_file->NativePath(path);
694 /* JVM_GetCallerClass */
696 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
700 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
702 c = stacktrace_get_caller_class(depth);
708 /* JVM_FindPrimitiveClass */
710 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
715 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
718 c = Primitive::get_class_by_name(u);
720 return (jclass) LLNI_classinfo_wrap(c);
724 /* JVM_ResolveClass */
726 void JVM_ResolveClass(JNIEnv* env, jclass cls)
728 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
729 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
733 /* JVM_FindClassFromClassLoader */
735 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
741 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
743 /* As of now, OpenJDK does not call this function with throwError
746 assert(throwError == false);
748 u = utf_new_char(name);
749 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
751 c = load_class_from_classloader(u, cl);
757 if (!(c->state & CLASS_INITIALIZED))
758 if (!initialize_class(c))
761 return (jclass) LLNI_classinfo_wrap(c);
765 /* JVM_FindClassFromClass */
767 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
769 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
775 /* JVM_DefineClass */
777 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
779 log_println("JVM_DefineClass: IMPLEMENT ME!");
785 /* JVM_DefineClassWithSource */
787 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
793 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
796 u = utf_new_char(name);
800 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
802 /* XXX do something with source */
804 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
806 return (jclass) LLNI_classinfo_wrap(c);
810 /* JVM_FindLoadedClass */
812 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
818 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
820 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
822 u = javastring_toutf((java_handle_t *) name, true);
823 c = classcache_lookup(cl, u);
825 return (jclass) LLNI_classinfo_wrap(c);
829 /* JVM_GetClassName */
831 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
835 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
837 c = LLNI_classinfo_unwrap(cls);
839 return (jstring) class_get_classname(c);
843 /* JVM_GetClassInterfaces */
845 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
848 java_handle_objectarray_t *oa;
850 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
852 c = LLNI_classinfo_unwrap(cls);
854 oa = class_get_interfaces(c);
856 return (jobjectArray) oa;
860 /* JVM_GetClassLoader */
862 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
867 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
869 c = LLNI_classinfo_unwrap(cls);
870 cl = class_get_classloader(c);
872 TRACEJVMCALLSEXIT(("->%p", cl));
878 /* JVM_IsInterface */
880 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
884 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
886 c = LLNI_classinfo_unwrap(cls);
888 return class_is_interface(c);
892 /* JVM_GetClassSigners */
894 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
896 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
902 /* JVM_SetClassSigners */
904 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
907 java_handle_objectarray_t *hoa;
909 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
911 c = LLNI_classinfo_unwrap(cls);
913 hoa = (java_handle_objectarray_t *) signers;
915 /* This call is ignored for primitive types and arrays. Signers
916 are only set once, ClassLoader.java, and thus shouldn't be
917 called with an array. Only the bootstrap loader creates
920 if (class_is_primitive(c) || class_is_array(c))
923 LLNI_classinfo_field_set(c, signers, hoa);
927 /* JVM_GetProtectionDomain */
929 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
933 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
935 c = LLNI_classinfo_unwrap(cls);
938 exceptions_throw_nullpointerexception();
942 /* Primitive types do not have a protection domain. */
944 if (class_is_primitive(c))
947 return (jobject) c->protectiondomain;
951 /* JVM_SetProtectionDomain */
953 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
955 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
959 /* JVM_DoPrivileged */
961 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
966 java_handle_t *result;
969 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
971 h = (java_handle_t *) action;
972 LLNI_class_get(h, c);
974 if (action == NULL) {
975 exceptions_throw_nullpointerexception();
979 /* lookup run() method (throw no exceptions) */
981 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
984 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
985 exceptions_throw_internalerror("No run method");
989 /* XXX It seems something with a privileged stack needs to be done
992 result = vm_call_method(m, h);
994 e = exceptions_get_exception();
997 if ( builtin_instanceof(e, class_java_lang_Exception) &&
998 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
999 exceptions_clear_exception();
1000 exceptions_throw_privilegedactionexception(e);
1006 return (jobject) result;
1010 /* JVM_GetInheritedAccessControlContext */
1012 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1014 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1020 /* JVM_GetStackAccessControlContext */
1022 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1024 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
1026 /* XXX All stuff I tested so far works without that function. At
1027 some point we have to implement it, but I disable the output
1028 for now to make IcedTea happy. */
1034 /* JVM_IsArrayClass */
1036 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1040 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1042 c = LLNI_classinfo_unwrap(cls);
1044 return class_is_array(c);
1048 /* JVM_IsPrimitiveClass */
1050 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1054 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1056 c = LLNI_classinfo_unwrap(cls);
1058 return class_is_primitive(c);
1062 /* JVM_GetComponentType */
1064 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1066 classinfo *component;
1069 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1071 c = LLNI_classinfo_unwrap(cls);
1073 component = class_get_componenttype(c);
1075 return (jclass) LLNI_classinfo_wrap(component);
1079 /* JVM_GetClassModifiers */
1081 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1086 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1088 c = LLNI_classinfo_unwrap(cls);
1090 flags = class_get_modifiers(c, false);
1096 /* JVM_GetDeclaredClasses */
1098 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1101 java_handle_objectarray_t *oa;
1103 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1105 c = LLNI_classinfo_unwrap(ofClass);
1107 oa = class_get_declaredclasses(c, false);
1109 return (jobjectArray) oa;
1113 /* JVM_GetDeclaringClass */
1115 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1120 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1122 c = LLNI_classinfo_unwrap(ofClass);
1124 dc = class_get_declaringclass(c);
1126 return (jclass) LLNI_classinfo_wrap(dc);
1130 /* JVM_GetClassSignature */
1132 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1138 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1140 c = LLNI_classinfo_unwrap(cls);
1142 /* Get the signature of the class. */
1144 u = class_get_signature(c);
1149 /* Convert UTF-string to a Java-string. */
1151 s = javastring_new(u);
1157 /* JVM_GetClassAnnotations */
1159 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1161 TRACEJVMCALLS(("JVM_GetClassAnnotations(env=%p, cls=%p)", env, cls));
1164 exceptions_throw_nullpointerexception();
1168 classinfo* c = LLNI_classinfo_unwrap(cls);
1170 /* get annotations: */
1171 java_handle_bytearray_t* annotations = class_get_annotations(c);
1173 return (jbyteArray) annotations;
1177 /* JVM_GetFieldAnnotations */
1179 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1181 TRACEJVMCALLS(("JVM_GetFieldAnnotations(env=%p, field=%p)", env, field));
1183 java_lang_reflect_Field jlrf(field);
1185 if (jlrf.is_null()) {
1186 exceptions_throw_nullpointerexception();
1190 return (jbyteArray) jlrf.get_annotations();
1194 /* JVM_GetMethodAnnotations */
1196 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1198 TRACEJVMCALLS(("JVM_GetMethodAnnotations(env=%p, method=%p)", env, method));
1200 java_lang_reflect_Method jlrm(method);
1202 if (jlrm.is_null()) {
1203 exceptions_throw_nullpointerexception();
1207 return (jbyteArray) jlrm.get_annotations();
1211 /* JVM_GetMethodDefaultAnnotationValue */
1213 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1215 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue(env=%p, method=%p)", env, method));
1217 java_lang_reflect_Method jlrm(method);
1219 if (jlrm.is_null()) {
1220 exceptions_throw_nullpointerexception();
1224 return (jbyteArray) jlrm.get_annotationDefault();
1228 /* JVM_GetMethodParameterAnnotations */
1230 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1232 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations(env=%p, method=%p)", env, method));
1234 java_lang_reflect_Method jlrm(method);
1236 if (jlrm.is_null()) {
1237 exceptions_throw_nullpointerexception();
1241 return (jbyteArray) jlrm.get_parameterAnnotations();
1245 /* JVM_GetClassDeclaredFields */
1247 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1250 java_handle_objectarray_t *oa;
1252 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1254 c = LLNI_classinfo_unwrap(ofClass);
1256 oa = class_get_declaredfields(c, publicOnly);
1258 return (jobjectArray) oa;
1262 /* JVM_GetClassDeclaredMethods */
1264 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1266 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1268 classinfo* c = LLNI_classinfo_unwrap(ofClass);
1270 java_handle_objectarray_t* oa = class_get_declaredmethods(c, publicOnly);
1272 return (jobjectArray) oa;
1276 /* JVM_GetClassDeclaredConstructors */
1278 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1281 java_handle_objectarray_t *oa;
1283 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1285 c = LLNI_classinfo_unwrap(ofClass);
1287 oa = class_get_declaredconstructors(c, publicOnly);
1289 return (jobjectArray) oa;
1293 /* JVM_GetClassAccessFlags */
1295 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1299 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1301 c = LLNI_classinfo_unwrap(cls);
1303 /* Primitive type classes have the correct access flags. */
1305 return c->flags & ACC_CLASS_REFLECT_MASK;
1309 /* JVM_GetClassConstantPool */
1311 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1313 #if defined(ENABLE_ANNOTATIONS)
1314 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1316 java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
1317 sun_reflect_ConstantPool cp(h, cls);
1323 return (jobject) cp.get_handle();
1325 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1331 /* JVM_ConstantPoolGetSize */
1333 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1335 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1337 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1339 c = LLNI_classinfo_unwrap(jcpool);
1345 /* JVM_ConstantPoolGetClassAt */
1347 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1349 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1350 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1351 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1353 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1355 c = LLNI_classinfo_unwrap(jcpool);
1357 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1360 exceptions_throw_illegalargumentexception();
1364 result = resolve_classref_eager(ref);
1366 return (jclass) LLNI_classinfo_wrap(result);
1370 /* JVM_ConstantPoolGetClassAtIfLoaded */
1372 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1374 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1375 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1376 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1378 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1380 c = LLNI_classinfo_unwrap(jcpool);
1382 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1385 exceptions_throw_illegalargumentexception();
1389 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1393 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1397 return (jclass) LLNI_classinfo_wrap(result);
1401 /* JVM_ConstantPoolGetMethodAt */
1403 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1405 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1406 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1408 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1410 cls = LLNI_classinfo_unwrap(jcpool);
1411 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1414 exceptions_throw_illegalargumentexception();
1418 // Create a new java.lang.reflect.Method Java object.
1419 /* XXX: is that right? or do I have to use resolve_method_*? */
1420 java_lang_reflect_Method jlrm(ref->p.method);
1422 return (jobject) jlrm.get_handle();
1426 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1428 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1430 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1431 classinfo *c = NULL; /* resolved declaring class of the method */
1432 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1434 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1436 cls = LLNI_classinfo_unwrap(jcpool);
1437 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1440 exceptions_throw_illegalargumentexception();
1444 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1448 if (c == NULL || !(c->state & CLASS_LOADED)) {
1452 // Create a new java.lang.reflect.Method Java object.
1453 java_lang_reflect_Method jlrm(ref->p.method);
1455 return (jobject) jlrm.get_handle();
1459 /* JVM_ConstantPoolGetFieldAt */
1461 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1463 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1464 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1466 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1468 cls = LLNI_classinfo_unwrap(jcpool);
1469 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1472 exceptions_throw_illegalargumentexception();
1476 // Create a new java.lang.reflect.Field Java object.
1477 java_lang_reflect_Field jlrf(ref->p.field);
1479 return (jobject) jlrf.get_handle();
1483 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1485 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1487 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1488 classinfo *c; /* resolved declaring class for the field */
1489 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1491 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1493 cls = LLNI_classinfo_unwrap(jcpool);
1494 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1497 exceptions_throw_illegalargumentexception();
1501 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1505 if (c == NULL || !(c->state & CLASS_LOADED)) {
1509 // Create a new java.lang.reflect.Field Java object.
1510 java_lang_reflect_Field jlrf(ref->p.field);
1512 return (jobject) jlrf.get_handle();
1516 /* JVM_ConstantPoolGetMemberRefInfoAt */
1518 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1520 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1522 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1528 /* JVM_ConstantPoolGetIntAt */
1530 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1532 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1533 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1535 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1537 cls = LLNI_classinfo_unwrap(jcpool);
1538 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1541 exceptions_throw_illegalargumentexception();
1549 /* JVM_ConstantPoolGetLongAt */
1551 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1553 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1554 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1556 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1558 cls = LLNI_classinfo_unwrap(jcpool);
1559 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1562 exceptions_throw_illegalargumentexception();
1570 /* JVM_ConstantPoolGetFloatAt */
1572 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1574 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1575 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1577 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1579 cls = LLNI_classinfo_unwrap(jcpool);
1580 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1583 exceptions_throw_illegalargumentexception();
1591 /* JVM_ConstantPoolGetDoubleAt */
1593 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1595 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1596 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1598 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1600 cls = LLNI_classinfo_unwrap(jcpool);
1601 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1604 exceptions_throw_illegalargumentexception();
1612 /* JVM_ConstantPoolGetStringAt */
1614 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1616 utf *ref; /* utf object for the string in constant pool at index 'index' */
1617 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1619 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1621 cls = LLNI_classinfo_unwrap(jcpool);
1622 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1625 exceptions_throw_illegalargumentexception();
1629 /* XXX: I hope literalstring_new is the right Function. */
1630 return (jstring)literalstring_new(ref);
1634 /* JVM_ConstantPoolGetUTF8At */
1636 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1638 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1639 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1641 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1643 cls = LLNI_classinfo_unwrap(jcpool);
1644 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1647 exceptions_throw_illegalargumentexception();
1651 /* XXX: I hope literalstring_new is the right Function. */
1652 return (jstring)literalstring_new(ref);
1656 /* JVM_DesiredAssertionStatus */
1658 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1660 #if defined(ENABLE_ASSERTION)
1661 assertion_name_t *item;
1666 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1668 c = LLNI_classinfo_unwrap(cls);
1670 if (c->classloader == NULL) {
1671 status = (jboolean)assertion_system_enabled;
1674 status = (jboolean)assertion_user_enabled;
1677 if (list_assertion_names != NULL) {
1678 item = (assertion_name_t *)list_first(list_assertion_names);
1679 while (item != NULL) {
1680 name = utf_new_char(item->name);
1681 if (name == c->packagename) {
1682 status = (jboolean)item->enabled;
1684 else if (name == c->name) {
1685 status = (jboolean)item->enabled;
1688 item = (assertion_name_t *)list_next(list_assertion_names, item);
1694 return (jboolean)false;
1699 /* JVM_AssertionStatusDirectives */
1701 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1703 java_handle_objectarray_t *classes;
1704 java_handle_objectarray_t *packages;
1705 java_booleanarray_t *classEnabled;
1706 java_booleanarray_t *packageEnabled;
1707 #if defined(ENABLE_ASSERTION)
1708 assertion_name_t *item;
1713 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1715 #if defined(ENABLE_ASSERTION)
1716 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1718 classes = builtin_anewarray(0, class_java_lang_Object);
1720 if (classes == NULL)
1723 #if defined(ENABLE_ASSERTION)
1724 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1726 packages = builtin_anewarray(0, class_java_lang_Object);
1728 if (packages == NULL)
1731 #if defined(ENABLE_ASSERTION)
1732 classEnabled = builtin_newarray_boolean(assertion_class_count);
1734 classEnabled = builtin_newarray_boolean(0);
1736 if (classEnabled == NULL)
1739 #if defined(ENABLE_ASSERTION)
1740 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1742 packageEnabled = builtin_newarray_boolean(0);
1744 if (packageEnabled == NULL)
1747 #if defined(ENABLE_ASSERTION)
1748 /* initialize arrays */
1750 if (list_assertion_names != NULL) {
1754 item = (assertion_name_t *)list_first(list_assertion_names);
1755 while (item != NULL) {
1756 js = javastring_new_from_ascii(item->name);
1761 if (item->package == false) {
1762 classes->data[i] = js;
1763 classEnabled->data[i] = (jboolean) item->enabled;
1767 packages->data[j] = js;
1768 packageEnabled->data[j] = (jboolean) item->enabled;
1772 item = (assertion_name_t *)list_next(list_assertion_names, item);
1777 /* set instance fields */
1779 java_lang_AssertionStatusDirectives jlasd(classes, classEnabled, packages, packageEnabled);
1781 return (jobject) jlasd.get_handle();
1785 /* JVM_GetClassNameUTF */
1787 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1789 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1795 /* JVM_GetClassCPTypes */
1797 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1799 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1803 /* JVM_GetClassCPEntriesCount */
1805 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1807 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1813 /* JVM_GetClassFieldsCount */
1815 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1817 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1823 /* JVM_GetClassMethodsCount */
1825 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1827 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1833 /* JVM_GetMethodIxExceptionIndexes */
1835 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1837 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1841 /* JVM_GetMethodIxExceptionsCount */
1843 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1845 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1851 /* JVM_GetMethodIxByteCode */
1853 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1855 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1859 /* JVM_GetMethodIxByteCodeLength */
1861 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1863 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1869 /* JVM_GetMethodIxExceptionTableEntry */
1871 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1873 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1877 /* JVM_GetMethodIxExceptionTableLength */
1879 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1881 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1887 /* JVM_GetMethodIxModifiers */
1889 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1891 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1897 /* JVM_GetFieldIxModifiers */
1899 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1901 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1907 /* JVM_GetMethodIxLocalsCount */
1909 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1911 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1917 /* JVM_GetMethodIxArgsSize */
1919 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1921 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1927 /* JVM_GetMethodIxMaxStack */
1929 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1931 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1937 /* JVM_IsConstructorIx */
1939 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1941 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1947 /* JVM_GetMethodIxNameUTF */
1949 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1951 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1957 /* JVM_GetMethodIxSignatureUTF */
1959 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1961 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1967 /* JVM_GetCPFieldNameUTF */
1969 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1971 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1977 /* JVM_GetCPMethodNameUTF */
1979 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1981 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1987 /* JVM_GetCPMethodSignatureUTF */
1989 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1991 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1997 /* JVM_GetCPFieldSignatureUTF */
1999 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2001 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2007 /* JVM_GetCPClassNameUTF */
2009 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2011 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2017 /* JVM_GetCPFieldClassNameUTF */
2019 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2021 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2027 /* JVM_GetCPMethodClassNameUTF */
2029 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2031 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2037 /* JVM_GetCPFieldModifiers */
2039 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2041 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2047 /* JVM_GetCPMethodModifiers */
2049 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2051 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2057 /* JVM_ReleaseUTF */
2059 void JVM_ReleaseUTF(const char *utf)
2061 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2065 /* JVM_IsSameClassPackage */
2067 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2069 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2077 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2080 * JVM I/O error codes
2082 #define JVM_EEXIST -100
2084 jint JVM_Open(const char *fname, jint flags, jint mode)
2088 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2090 result = hpi_file->Open(fname, flags, mode);
2108 jint JVM_Close(jint fd)
2110 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2112 return hpi_file->Close(fd);
2118 jint JVM_Read(jint fd, char *buf, jint nbytes)
2120 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2122 return (jint) hpi_file->Read(fd, buf, nbytes);
2128 jint JVM_Write(jint fd, char *buf, jint nbytes)
2130 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2132 return (jint) hpi_file->Write(fd, buf, nbytes);
2138 jint JVM_Available(jint fd, jlong *pbytes)
2140 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2142 return hpi_file->Available(fd, pbytes);
2148 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2150 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2152 return hpi_file->Seek(fd, (off_t) offset, whence);
2158 jint JVM_SetLength(jint fd, jlong length)
2160 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2162 return hpi_file->SetLength(fd, length);
2168 jint JVM_Sync(jint fd)
2170 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2172 return hpi_file->Sync(fd);
2176 /* JVM_StartThread */
2178 void JVM_StartThread(JNIEnv* env, jobject jthread)
2180 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2182 threads_thread_start((java_handle_t *) jthread);
2186 /* JVM_StopThread */
2188 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2190 log_println("JVM_StopThread: Deprecated. Not implemented.");
2194 /* JVM_IsThreadAlive */
2196 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2202 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2204 h = (java_handle_t *) jthread;
2205 t = thread_get_thread(h);
2207 /* The threadobject is null when a thread is created in Java. The
2208 priority is set later during startup. */
2213 result = threads_thread_is_alive(t);
2219 /* JVM_SuspendThread */
2221 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2223 log_println("JVM_SuspendThread: Deprecated. Not implemented.");
2227 /* JVM_ResumeThread */
2229 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2231 log_println("JVM_ResumeThread: Deprecated. Not implemented.");
2235 /* JVM_SetThreadPriority */
2237 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2242 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2244 h = (java_handle_t *) jthread;
2245 t = thread_get_thread(h);
2247 /* The threadobject is null when a thread is created in Java. The
2248 priority is set later during startup. */
2253 threads_set_thread_priority(t->tid, prio);
2259 void JVM_Yield(JNIEnv *env, jclass threadClass)
2261 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2269 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2271 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2273 threads_sleep(millis, 0);
2277 /* JVM_CurrentThread */
2279 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2283 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2285 o = thread_get_current_object();
2291 /* JVM_CountStackFrames */
2293 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2295 log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2303 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2308 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2310 h = (java_handle_t *) jthread;
2311 t = thread_get_thread(h);
2316 threads_thread_interrupt(t);
2320 /* JVM_IsInterrupted */
2322 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2326 jboolean interrupted;
2328 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2330 h = (java_handle_t *) jthread;
2331 t = thread_get_thread(h);
2333 interrupted = thread_is_interrupted(t);
2335 if (interrupted && clear_interrupted)
2336 thread_set_interrupted(t, false);
2344 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2349 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2351 h = (java_handle_t *) obj;
2354 exceptions_throw_nullpointerexception();
2358 result = lock_is_held_by_current_thread(h);
2364 /* JVM_DumpAllStacks */
2366 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2368 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2372 /* JVM_CurrentLoadedClass */
2374 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2376 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2382 /* JVM_CurrentClassLoader */
2384 jobject JVM_CurrentClassLoader(JNIEnv *env)
2386 /* XXX if a method in a class in a trusted loader is in a
2387 doPrivileged, return NULL */
2389 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2395 /* JVM_GetClassContext */
2397 jobjectArray JVM_GetClassContext(JNIEnv *env)
2399 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2401 return (jobjectArray) stacktrace_getClassContext();
2405 /* JVM_ClassDepth */
2407 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2409 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2415 /* JVM_ClassLoaderDepth */
2417 jint JVM_ClassLoaderDepth(JNIEnv *env)
2419 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2425 /* JVM_GetSystemPackage */
2427 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2433 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2435 /* s = Package::find(name); */
2436 u = javastring_toutf((java_handle_t *) name, false);
2438 result = Package::find(u);
2441 s = javastring_new(result);
2449 /* JVM_GetSystemPackages */
2451 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2453 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2459 /* JVM_AllocateNewObject */
2461 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2463 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2469 /* JVM_AllocateNewArray */
2471 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2473 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2479 /* JVM_LatestUserDefinedLoader */
2481 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2485 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2487 cl = stacktrace_first_nonnull_classloader();
2489 return (jobject) cl;
2493 /* JVM_LoadClass0 */
2495 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2497 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2503 /* JVM_GetArrayLength */
2505 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2509 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2511 a = (java_handle_t *) arr;
2513 return array_length_get(a);
2517 /* JVM_GetArrayElement */
2519 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2524 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2526 a = (java_handle_t *) arr;
2528 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2529 /* exceptions_throw_illegalargumentexception(); */
2533 o = array_element_get(a, index);
2539 /* JVM_GetPrimitiveArrayElement */
2541 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2545 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2553 /* JVM_SetArrayElement */
2555 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2558 java_handle_t *value;
2560 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2562 a = (java_handle_t *) arr;
2563 value = (java_handle_t *) val;
2565 array_element_set(a, index, value);
2569 /* JVM_SetPrimitiveArrayElement */
2571 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2573 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2579 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2584 java_handle_objectarray_t *oa;
2586 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2588 if (eltClass == NULL) {
2589 exceptions_throw_nullpointerexception();
2593 /* NegativeArraySizeException is checked in builtin_newarray. */
2595 c = LLNI_classinfo_unwrap(eltClass);
2597 /* Create primitive or object array. */
2599 if (class_is_primitive(c)) {
2600 pc = Primitive::get_arrayclass_by_name(c->name);
2602 /* void arrays are not allowed. */
2605 exceptions_throw_illegalargumentexception();
2609 a = builtin_newarray(length, pc);
2614 oa = builtin_anewarray(length, c);
2616 return (jobject) oa;
2621 /* JVM_NewMultiArray */
2623 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2626 java_handle_intarray_t *ia;
2632 java_handle_objectarray_t *a;
2634 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2636 if (eltClass == NULL) {
2637 exceptions_throw_nullpointerexception();
2641 /* NegativeArraySizeException is checked in builtin_newarray. */
2643 c = LLNI_classinfo_unwrap(eltClass);
2645 ia = (java_handle_intarray_t *) dim;
2647 length = array_length_get((java_handle_t *) ia);
2649 /* We check here for exceptions thrown in array_length_get,
2650 otherwise these exceptions get overwritten by the following
2651 IllegalArgumentException. */
2656 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2657 exceptions_throw_illegalargumentexception();
2661 /* XXX This is just a quick hack to get it working. */
2663 dims = MNEW(long, length);
2665 for (i = 0; i < length; i++) {
2666 value = LLNI_array_direct(ia, i);
2667 dims[i] = (long) value;
2670 /* Create an array-class if necessary. */
2672 if (class_is_primitive(c))
2673 ac = Primitive::get_arrayclass_by_name(c->name);
2675 ac = class_array_of(c, true);
2680 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2686 /* JVM_InitializeSocketLibrary */
2688 jint JVM_InitializeSocketLibrary()
2690 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2692 return hpi_initialize_socket_library();
2698 jint JVM_Socket(jint domain, jint type, jint protocol)
2700 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2702 return os::socket(domain, type, protocol);
2706 /* JVM_SocketClose */
2708 jint JVM_SocketClose(jint fd)
2710 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2712 return os::close(fd);
2716 /* JVM_SocketShutdown */
2718 jint JVM_SocketShutdown(jint fd, jint howto)
2720 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2722 return os::shutdown(fd, howto);
2728 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2730 log_println("JVM_Recv: IMPLEMENT ME!");
2738 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2740 log_println("JVM_Send: IMPLEMENT ME!");
2748 jint JVM_Timeout(int fd, long timeout)
2750 log_println("JVM_Timeout: IMPLEMENT ME!");
2758 jint JVM_Listen(jint fd, jint count)
2760 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2762 return os::listen(fd, count);
2768 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2770 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2772 return os::connect(fd, him, len);
2778 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2780 log_println("JVM_Bind: IMPLEMENT ME!");
2788 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2790 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2792 return os::accept(fd, him, (socklen_t *) len);
2798 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2800 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2806 /* JVM_GetSockName */
2808 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2810 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2812 return os::getsockname(fd, him, (socklen_t *) len);
2818 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2820 log_println("JVM_SendTo: IMPLEMENT ME!");
2826 /* JVM_SocketAvailable */
2828 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2830 #if defined(FIONREAD)
2834 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2838 result = ioctl(fd, FIONREAD, &bytes);
2847 # error FIONREAD not defined
2852 /* JVM_GetSockOpt */
2854 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2856 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2858 return os::getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2862 /* JVM_SetSockOpt */
2864 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2866 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2868 return os::setsockopt(fd, level, optname, optval, optlen);
2872 /* JVM_GetHostName */
2874 int JVM_GetHostName(char *name, int namelen)
2878 TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2880 result = os::gethostname(name, namelen);
2882 TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
2888 /* JVM_GetHostByAddr */
2890 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2892 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2898 /* JVM_GetHostByName */
2900 struct hostent *JVM_GetHostByName(char* name)
2902 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2908 /* JVM_GetProtoByName */
2910 struct protoent *JVM_GetProtoByName(char* name)
2912 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2918 /* JVM_LoadLibrary */
2920 void *JVM_LoadLibrary(const char *name)
2925 TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
2927 u = utf_new_char(name);
2929 handle = native_library_open(u);
2931 TRACEJVMCALLSEXIT(("->%p", handle));
2937 /* JVM_UnloadLibrary */
2939 void JVM_UnloadLibrary(void* handle)
2941 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2943 native_library_close(handle);
2947 /* JVM_FindLibraryEntry */
2949 void *JVM_FindLibraryEntry(void *handle, const char *name)
2953 TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
2955 symbol = hpi_library->FindLibraryEntry(handle, name);
2957 TRACEJVMCALLSEXIT(("->%p", symbol));
2965 jboolean JVM_IsNaN(jdouble a)
2967 log_println("JVM_IsNaN: IMPLEMENT ME!");
2973 /* JVM_IsSupportedJNIVersion */
2975 jboolean JVM_IsSupportedJNIVersion(jint version)
2977 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
2979 return jni_version_check(version);
2983 /* JVM_InternString */
2985 jstring JVM_InternString(JNIEnv *env, jstring str)
2987 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
2989 return (jstring) javastring_intern((java_handle_t *) str);
2993 /* JVM_RawMonitorCreate */
2995 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2999 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3001 o = NEW(java_object_t);
3003 lock_init_object_lock(o);
3009 /* JVM_RawMonitorDestroy */
3011 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3013 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3015 FREE(mon, java_object_t);
3019 /* JVM_RawMonitorEnter */
3021 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3023 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3025 (void) lock_monitor_enter((java_object_t *) mon);
3031 /* JVM_RawMonitorExit */
3033 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3035 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3037 (void) lock_monitor_exit((java_object_t *) mon);
3041 /* JVM_SetPrimitiveFieldValues */
3043 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3045 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3049 /* JVM_GetPrimitiveFieldValues */
3051 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3053 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3057 /* JVM_AccessVMBooleanFlag */
3059 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3061 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3067 /* JVM_AccessVMIntFlag */
3069 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3071 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3077 /* JVM_VMBreakPoint */
3079 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3081 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3085 /* JVM_GetClassFields */
3087 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3089 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3095 /* JVM_GetClassMethods */
3097 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3099 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3105 /* JVM_GetClassConstructors */
3107 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3109 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3115 /* JVM_GetClassField */
3117 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3119 log_println("JVM_GetClassField: IMPLEMENT ME!");
3125 /* JVM_GetClassMethod */
3127 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3129 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3135 /* JVM_GetClassConstructor */
3137 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3139 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3145 /* JVM_NewInstance */
3147 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3149 log_println("JVM_NewInstance: IMPLEMENT ME!");
3157 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3159 log_println("JVM_GetField: IMPLEMENT ME!");
3165 /* JVM_GetPrimitiveField */
3167 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3171 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3181 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3183 log_println("JVM_SetField: IMPLEMENT ME!");
3187 /* JVM_SetPrimitiveField */
3189 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3191 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3195 /* JVM_InvokeMethod */
3197 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3199 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3201 java_lang_reflect_Method jlrm(method);
3203 java_handle_t* result = jlrm.invoke((java_handle_t*) obj, (java_handle_objectarray_t*) args0);
3205 return (jobject) result;
3209 /* JVM_NewInstanceFromConstructor */
3211 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3213 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3215 java_lang_reflect_Constructor jlrc(con);
3216 java_handle_t* o = jlrc.new_instance((java_handle_objectarray_t*) args0);
3222 /* JVM_SupportsCX8 */
3224 jboolean JVM_SupportsCX8()
3226 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3236 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3238 log_println("JVM_CX8Field: IMPLEMENT ME!");
3244 /* JVM_GetAllThreads */
3246 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3248 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3254 /* JVM_DumpThreads */
3256 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3258 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3264 /* JVM_GetManagement */
3266 void *JVM_GetManagement(jint version)
3268 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3270 /* TODO We current don't support the management interface. */
3276 /* JVM_InitAgentProperties */
3278 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3280 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3286 /* JVM_GetEnclosingMethodInfo */
3288 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3292 java_handle_objectarray_t *oa;
3294 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3296 c = LLNI_classinfo_unwrap(ofClass);
3298 if ((c == NULL) || class_is_primitive(c))
3301 m = class_get_enclosingmethod_raw(c);
3306 oa = builtin_anewarray(3, class_java_lang_Object);
3311 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
3312 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3313 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3315 return (jobjectArray) oa;
3319 /* JVM_GetThreadStateValues */
3321 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3323 java_handle_intarray_t *ia;
3325 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3326 env, javaThreadState));
3328 /* If new thread states are added in future JDK and VM versions,
3329 this should check if the JDK version is compatible with thread
3330 states supported by the VM. Return NULL if not compatible.
3332 This function must map the VM java_lang_Thread::ThreadStatus
3333 to the Java thread state that the JDK supports. */
3335 switch (javaThreadState) {
3336 case THREAD_STATE_NEW:
3337 ia = builtin_newarray_int(1);
3342 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3345 case THREAD_STATE_RUNNABLE:
3346 ia = builtin_newarray_int(1);
3351 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3354 case THREAD_STATE_BLOCKED:
3355 ia = builtin_newarray_int(1);
3360 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3363 case THREAD_STATE_WAITING:
3364 ia = builtin_newarray_int(2);
3369 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3370 /* XXX Implement parked stuff. */
3371 /* array_intarray_element_set(ia, 1, PARKED); */
3374 case THREAD_STATE_TIMED_WAITING:
3375 ia = builtin_newarray_int(3);
3380 /* XXX Not sure about that one. */
3381 /* array_intarray_element_set(ia, 0, SLEEPING); */
3382 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3383 /* XXX Implement parked stuff. */
3384 /* array_intarray_element_set(ia, 2, PARKED); */
3387 case THREAD_STATE_TERMINATED:
3388 ia = builtin_newarray_int(1);
3393 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3397 /* Unknown state - probably incompatible JDK version */
3401 return (jintArray) ia;
3405 /* JVM_GetThreadStateNames */
3407 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3409 java_handle_intarray_t *ia;
3410 java_handle_objectarray_t *oa;
3413 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3414 env, javaThreadState, values));
3416 ia = (java_handle_intarray_t *) values;
3418 /* If new thread states are added in future JDK and VM versions,
3419 this should check if the JDK version is compatible with thread
3420 states supported by the VM. Return NULL if not compatible.
3422 This function must map the VM java_lang_Thread::ThreadStatus
3423 to the Java thread state that the JDK supports. */
3425 if (values == NULL) {
3426 exceptions_throw_nullpointerexception();
3430 switch (javaThreadState) {
3431 case THREAD_STATE_NEW:
3432 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3434 oa = builtin_anewarray(1, class_java_lang_String);
3439 s = javastring_new(utf_new_char("NEW"));
3444 array_objectarray_element_set(oa, 0, s);
3447 case THREAD_STATE_RUNNABLE:
3448 oa = builtin_anewarray(1, class_java_lang_String);
3453 s = javastring_new(utf_new_char("RUNNABLE"));
3458 array_objectarray_element_set(oa, 0, s);
3461 case THREAD_STATE_BLOCKED:
3462 oa = builtin_anewarray(1, class_java_lang_String);
3467 s = javastring_new(utf_new_char("BLOCKED"));
3472 array_objectarray_element_set(oa, 0, s);
3475 case THREAD_STATE_WAITING:
3476 oa = builtin_anewarray(2, class_java_lang_String);
3481 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3482 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3487 array_objectarray_element_set(oa, 0, s);
3488 /* array_objectarray_element_set(oa, 1, s); */
3491 case THREAD_STATE_TIMED_WAITING:
3492 oa = builtin_anewarray(3, class_java_lang_String);
3497 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3498 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3499 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3504 /* array_objectarray_element_set(oa, 0, s); */
3505 array_objectarray_element_set(oa, 0, s);
3506 /* array_objectarray_element_set(oa, 2, s); */
3509 case THREAD_STATE_TERMINATED:
3510 oa = builtin_anewarray(1, class_java_lang_String);
3515 s = javastring_new(utf_new_char("TERMINATED"));
3520 array_objectarray_element_set(oa, 0, s);
3524 /* Unknown state - probably incompatible JDK version */
3528 return (jobjectArray) oa;
3532 /* JVM_GetVersionInfo */
3534 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3536 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3540 /* OS: JVM_RegisterSignal */
3542 void *JVM_RegisterSignal(jint sig, void *handler)
3544 functionptr newHandler;
3546 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3548 if (handler == (void *) 2)
3549 newHandler = (functionptr) signal_thread_handler;
3551 newHandler = (functionptr) (uintptr_t) handler;
3558 /* These signals are already used by the VM. */
3562 /* This signal is used by the VM to dump thread stacks unless
3563 ReduceSignalUsage is set, in which case the user is allowed
3564 to set his own _native_ handler for this signal; thus, in
3565 either case, we do not allow JVM_RegisterSignal to change
3575 signal_register_signal(sig, newHandler, SA_RESTART | SA_SIGINFO);
3577 /* XXX Should return old handler. */
3583 /* OS: JVM_RaiseSignal */
3585 jboolean JVM_RaiseSignal(jint sig)
3587 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3593 /* OS: JVM_FindSignal */
3595 jint JVM_FindSignal(const char *name)
3597 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3599 #if defined(__LINUX__)
3600 if (strcmp(name, "HUP") == 0)
3603 if (strcmp(name, "INT") == 0)
3606 if (strcmp(name, "TERM") == 0)
3608 #elif defined(__SOLARIS__)
3611 if (os::str2sig(name, &signum) == -1)
3616 # error Not implemented for this OS.
3626 * These are local overrides for various environment variables in Emacs.
3627 * Please do not remove this and leave it at the end of the file, where
3628 * Emacs will automagically detect them.
3629 * ---------------------------------------------------------------------
3632 * indent-tabs-mode: t