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.h"
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.h"
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 properties_add("sun.nio.MaxDirectMemorySize", buf);
290 /* Add all properties. */
292 properties_system_add_all(h);
300 void JVM_Exit(jint code)
302 log_println("JVM_Exit: IMPLEMENT ME!");
308 void JVM_Halt(jint code)
310 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
317 /* JVM_OnExit(void (*func)) */
319 void JVM_OnExit(void (*func)(void))
321 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
329 TRACEJVMCALLS(("JVM_GC()"));
335 /* JVM_MaxObjectInspectionAge */
337 jlong JVM_MaxObjectInspectionAge(void)
339 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
345 /* JVM_TraceInstructions */
347 void JVM_TraceInstructions(jboolean on)
349 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
353 /* JVM_TraceMethodCalls */
355 void JVM_TraceMethodCalls(jboolean on)
357 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
361 /* JVM_TotalMemory */
363 jlong JVM_TotalMemory(void)
365 TRACEJVMCALLS(("JVM_TotalMemory()"));
367 return gc_get_heap_size();
373 jlong JVM_FreeMemory(void)
375 TRACEJVMCALLS(("JVM_FreeMemory()"));
377 return gc_get_free_bytes();
383 jlong JVM_MaxMemory(void)
385 TRACEJVMCALLS(("JVM_MaxMemory()"));
387 return gc_get_max_heap_size();
391 /* JVM_ActiveProcessorCount */
393 jint JVM_ActiveProcessorCount(void)
395 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
397 return os::processors_online();
401 /* JVM_FillInStackTrace */
403 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
405 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
407 java_handle_bytearray_t* ba = stacktrace_get_current();
412 java_lang_Throwable jlt(receiver, ba);
416 /* JVM_PrintStackTrace */
418 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
420 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
424 /* JVM_GetStackTraceDepth */
426 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
428 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
430 java_lang_Throwable jlt(throwable);
433 exceptions_throw_nullpointerexception();
437 java_handle_bytearray_t* ba = jlt.get_backtrace();
442 // We need a critical section here as the stacktrace structure is
443 // mapped onto a Java byte-array.
447 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
449 int32_t depth = st->length;
457 /* JVM_GetStackTraceElement */
459 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
461 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
463 java_lang_Throwable jlt(throwable);
464 java_handle_bytearray_t* ba = jlt.get_backtrace();
466 // We need a critical section here as the stacktrace structure is
467 // mapped onto a Java byte-array.
470 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
472 if ((index < 0) || (index >= st->length)) {
473 /* XXX This should be an IndexOutOfBoundsException (check this
475 exceptions_throw_arrayindexoutofboundsexception();
479 // Get the stacktrace entry.
480 stacktrace_entry_t* ste = &(st->entries[index]);
482 // Get the codeinfo, methodinfo and classinfo.
483 codeinfo* code = ste->code;
484 methodinfo* m = code->m;
485 classinfo* c = m->clazz;
488 java_handle_t* filename;
490 if (!(m->flags & ACC_NATIVE)) {
491 if (c->sourcefile != NULL)
492 filename = javastring_new(c->sourcefile);
502 if (m->flags & ACC_NATIVE) {
506 /* FIXME The linenumbertable_linenumber_for_pc could change
507 the methodinfo pointer when hitting an inlined method. */
509 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
510 linenumber = (linenumber == 0) ? -1 : linenumber;
515 // Get declaring class name.
516 java_handle_t* declaringclass = class_get_classname(c);
518 // Allocate a new StackTraceElement object.
519 java_lang_StackTraceElement jlste(declaringclass, javastring_new(m->name), filename, linenumber);
524 return (jobject) jlste.get_handle();
530 jint JVM_IHashCode(JNIEnv* env, jobject handle)
532 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
534 java_lang_Object o(handle);
536 return o.get_hashcode();
540 /* JVM_MonitorWait */
542 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
544 #if defined(ENABLE_THREADS)
548 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
550 /* exceptions_throw_illegalargumentexception("argument out of range"); */
551 exceptions_throw_illegalargumentexception();
555 #if defined(ENABLE_THREADS)
556 o = (java_handle_t *) handle;
558 lock_wait_for_object(o, ms, 0);
563 /* JVM_MonitorNotify */
565 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
567 #if defined(ENABLE_THREADS)
571 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
573 #if defined(ENABLE_THREADS)
574 o = (java_handle_t *) handle;
576 lock_notify_object(o);
581 /* JVM_MonitorNotifyAll */
583 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
585 #if defined(ENABLE_THREADS)
589 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
591 #if defined(ENABLE_THREADS)
592 o = (java_handle_t *) handle;
594 lock_notify_all_object(o);
601 jobject JVM_Clone(JNIEnv* env, jobject handle)
603 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
605 return (jobject) builtin_clone(env, (java_handle_t *) handle);
609 /* JVM_InitializeCompiler */
611 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
613 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
617 /* JVM_IsSilentCompiler */
619 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
621 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
627 /* JVM_CompileClass */
629 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
631 log_println("JVM_CompileClass: IMPLEMENT ME!");
637 /* JVM_CompileClasses */
639 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
641 log_println("JVM_CompileClasses: IMPLEMENT ME!");
647 /* JVM_CompilerCommand */
649 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
651 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
657 /* JVM_EnableCompiler */
659 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
661 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
662 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
666 /* JVM_DisableCompiler */
668 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
670 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
671 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
675 /* JVM_GetLastErrorString */
677 jint JVM_GetLastErrorString(char *buf, int len)
679 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
681 return hpi_system->GetLastErrorString(buf, len);
687 char *JVM_NativePath(char *path)
689 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
691 return hpi_file->NativePath(path);
695 /* JVM_GetCallerClass */
697 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
701 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
703 c = stacktrace_get_caller_class(depth);
709 /* JVM_FindPrimitiveClass */
711 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
716 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
719 c = Primitive::get_class_by_name(u);
721 return (jclass) LLNI_classinfo_wrap(c);
725 /* JVM_ResolveClass */
727 void JVM_ResolveClass(JNIEnv* env, jclass cls)
729 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
730 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
734 /* JVM_FindClassFromClassLoader */
736 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
742 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
744 /* As of now, OpenJDK does not call this function with throwError
747 assert(throwError == false);
749 u = utf_new_char(name);
750 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
752 c = load_class_from_classloader(u, cl);
758 if (!(c->state & CLASS_INITIALIZED))
759 if (!initialize_class(c))
762 return (jclass) LLNI_classinfo_wrap(c);
766 /* JVM_FindClassFromClass */
768 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
770 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
776 /* JVM_DefineClass */
778 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
780 log_println("JVM_DefineClass: IMPLEMENT ME!");
786 /* JVM_DefineClassWithSource */
788 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
794 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
797 u = utf_new_char(name);
801 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
803 /* XXX do something with source */
805 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
807 return (jclass) LLNI_classinfo_wrap(c);
811 /* JVM_FindLoadedClass */
813 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
819 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
821 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
823 u = javastring_toutf((java_handle_t *) name, true);
824 c = classcache_lookup(cl, u);
826 return (jclass) LLNI_classinfo_wrap(c);
830 /* JVM_GetClassName */
832 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
836 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
838 c = LLNI_classinfo_unwrap(cls);
840 return (jstring) class_get_classname(c);
844 /* JVM_GetClassInterfaces */
846 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
849 java_handle_objectarray_t *oa;
851 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
853 c = LLNI_classinfo_unwrap(cls);
855 oa = class_get_interfaces(c);
857 return (jobjectArray) oa;
861 /* JVM_GetClassLoader */
863 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
868 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
870 c = LLNI_classinfo_unwrap(cls);
871 cl = class_get_classloader(c);
873 TRACEJVMCALLSEXIT(("->%p", cl));
879 /* JVM_IsInterface */
881 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
885 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
887 c = LLNI_classinfo_unwrap(cls);
889 return class_is_interface(c);
893 /* JVM_GetClassSigners */
895 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
897 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
903 /* JVM_SetClassSigners */
905 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
908 java_handle_objectarray_t *hoa;
910 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
912 c = LLNI_classinfo_unwrap(cls);
914 hoa = (java_handle_objectarray_t *) signers;
916 /* This call is ignored for primitive types and arrays. Signers
917 are only set once, ClassLoader.java, and thus shouldn't be
918 called with an array. Only the bootstrap loader creates
921 if (class_is_primitive(c) || class_is_array(c))
924 LLNI_classinfo_field_set(c, signers, hoa);
928 /* JVM_GetProtectionDomain */
930 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
934 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
936 c = LLNI_classinfo_unwrap(cls);
939 exceptions_throw_nullpointerexception();
943 /* Primitive types do not have a protection domain. */
945 if (class_is_primitive(c))
948 return (jobject) c->protectiondomain;
952 /* JVM_SetProtectionDomain */
954 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
956 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
960 /* JVM_DoPrivileged */
962 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
967 java_handle_t *result;
970 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
972 h = (java_handle_t *) action;
973 LLNI_class_get(h, c);
975 if (action == NULL) {
976 exceptions_throw_nullpointerexception();
980 /* lookup run() method (throw no exceptions) */
982 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
985 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
986 exceptions_throw_internalerror("No run method");
990 /* XXX It seems something with a privileged stack needs to be done
993 result = vm_call_method(m, h);
995 e = exceptions_get_exception();
998 if ( builtin_instanceof(e, class_java_lang_Exception) &&
999 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
1000 exceptions_clear_exception();
1001 exceptions_throw_privilegedactionexception(e);
1007 return (jobject) result;
1011 /* JVM_GetInheritedAccessControlContext */
1013 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1015 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1021 /* JVM_GetStackAccessControlContext */
1023 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1025 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
1027 /* XXX All stuff I tested so far works without that function. At
1028 some point we have to implement it, but I disable the output
1029 for now to make IcedTea happy. */
1035 /* JVM_IsArrayClass */
1037 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1041 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1043 c = LLNI_classinfo_unwrap(cls);
1045 return class_is_array(c);
1049 /* JVM_IsPrimitiveClass */
1051 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1055 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1057 c = LLNI_classinfo_unwrap(cls);
1059 return class_is_primitive(c);
1063 /* JVM_GetComponentType */
1065 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1067 classinfo *component;
1070 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1072 c = LLNI_classinfo_unwrap(cls);
1074 component = class_get_componenttype(c);
1076 return (jclass) LLNI_classinfo_wrap(component);
1080 /* JVM_GetClassModifiers */
1082 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1087 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1089 c = LLNI_classinfo_unwrap(cls);
1091 flags = class_get_modifiers(c, false);
1097 /* JVM_GetDeclaredClasses */
1099 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1102 java_handle_objectarray_t *oa;
1104 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1106 c = LLNI_classinfo_unwrap(ofClass);
1108 oa = class_get_declaredclasses(c, false);
1110 return (jobjectArray) oa;
1114 /* JVM_GetDeclaringClass */
1116 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1121 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1123 c = LLNI_classinfo_unwrap(ofClass);
1125 dc = class_get_declaringclass(c);
1127 return (jclass) LLNI_classinfo_wrap(dc);
1131 /* JVM_GetClassSignature */
1133 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1139 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1141 c = LLNI_classinfo_unwrap(cls);
1143 /* Get the signature of the class. */
1145 u = class_get_signature(c);
1150 /* Convert UTF-string to a Java-string. */
1152 s = javastring_new(u);
1158 /* JVM_GetClassAnnotations */
1160 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1162 TRACEJVMCALLS(("JVM_GetClassAnnotations(env=%p, cls=%p)", env, cls));
1165 exceptions_throw_nullpointerexception();
1169 classinfo* c = LLNI_classinfo_unwrap(cls);
1171 /* get annotations: */
1172 java_handle_bytearray_t* annotations = class_get_annotations(c);
1174 return (jbyteArray) annotations;
1178 /* JVM_GetFieldAnnotations */
1180 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1182 TRACEJVMCALLS(("JVM_GetFieldAnnotations(env=%p, field=%p)", env, field));
1184 java_lang_reflect_Field jlrf(field);
1186 if (jlrf.is_null()) {
1187 exceptions_throw_nullpointerexception();
1191 return (jbyteArray) jlrf.get_annotations();
1195 /* JVM_GetMethodAnnotations */
1197 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1199 TRACEJVMCALLS(("JVM_GetMethodAnnotations(env=%p, method=%p)", env, method));
1201 java_lang_reflect_Method jlrm(method);
1203 if (jlrm.is_null()) {
1204 exceptions_throw_nullpointerexception();
1208 return (jbyteArray) jlrm.get_annotations();
1212 /* JVM_GetMethodDefaultAnnotationValue */
1214 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1216 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue(env=%p, method=%p)", env, method));
1218 java_lang_reflect_Method jlrm(method);
1220 if (jlrm.is_null()) {
1221 exceptions_throw_nullpointerexception();
1225 return (jbyteArray) jlrm.get_annotationDefault();
1229 /* JVM_GetMethodParameterAnnotations */
1231 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1233 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations(env=%p, method=%p)", env, method));
1235 java_lang_reflect_Method jlrm(method);
1237 if (jlrm.is_null()) {
1238 exceptions_throw_nullpointerexception();
1242 return (jbyteArray) jlrm.get_parameterAnnotations();
1246 /* JVM_GetClassDeclaredFields */
1248 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1251 java_handle_objectarray_t *oa;
1253 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1255 c = LLNI_classinfo_unwrap(ofClass);
1257 oa = class_get_declaredfields(c, publicOnly);
1259 return (jobjectArray) oa;
1263 /* JVM_GetClassDeclaredMethods */
1265 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1267 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1269 classinfo* c = LLNI_classinfo_unwrap(ofClass);
1271 java_handle_objectarray_t* oa = class_get_declaredmethods(c, publicOnly);
1273 return (jobjectArray) oa;
1277 /* JVM_GetClassDeclaredConstructors */
1279 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1282 java_handle_objectarray_t *oa;
1284 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1286 c = LLNI_classinfo_unwrap(ofClass);
1288 oa = class_get_declaredconstructors(c, publicOnly);
1290 return (jobjectArray) oa;
1294 /* JVM_GetClassAccessFlags */
1296 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1300 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1302 c = LLNI_classinfo_unwrap(cls);
1304 /* Primitive type classes have the correct access flags. */
1306 return c->flags & ACC_CLASS_REFLECT_MASK;
1310 /* JVM_GetClassConstantPool */
1312 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1314 #if defined(ENABLE_ANNOTATIONS)
1315 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1317 java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
1318 sun_reflect_ConstantPool cp(h, cls);
1324 return (jobject) cp.get_handle();
1326 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1332 /* JVM_ConstantPoolGetSize */
1334 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1336 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1338 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1340 c = LLNI_classinfo_unwrap(jcpool);
1346 /* JVM_ConstantPoolGetClassAt */
1348 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1350 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1351 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1352 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1354 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1356 c = LLNI_classinfo_unwrap(jcpool);
1358 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1361 exceptions_throw_illegalargumentexception();
1365 result = resolve_classref_eager(ref);
1367 return (jclass) LLNI_classinfo_wrap(result);
1371 /* JVM_ConstantPoolGetClassAtIfLoaded */
1373 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1375 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1376 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1377 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1379 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1381 c = LLNI_classinfo_unwrap(jcpool);
1383 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1386 exceptions_throw_illegalargumentexception();
1390 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1394 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1398 return (jclass) LLNI_classinfo_wrap(result);
1402 /* JVM_ConstantPoolGetMethodAt */
1404 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1406 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1407 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1409 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1411 cls = LLNI_classinfo_unwrap(jcpool);
1412 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1415 exceptions_throw_illegalargumentexception();
1419 // Create a new java.lang.reflect.Method Java object.
1420 /* XXX: is that right? or do I have to use resolve_method_*? */
1421 java_lang_reflect_Method jlrm(ref->p.method);
1423 return (jobject) jlrm.get_handle();
1427 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1429 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1431 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1432 classinfo *c = NULL; /* resolved declaring class of the method */
1433 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1435 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1437 cls = LLNI_classinfo_unwrap(jcpool);
1438 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1441 exceptions_throw_illegalargumentexception();
1445 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1449 if (c == NULL || !(c->state & CLASS_LOADED)) {
1453 // Create a new java.lang.reflect.Method Java object.
1454 java_lang_reflect_Method jlrm(ref->p.method);
1456 return (jobject) jlrm.get_handle();
1460 /* JVM_ConstantPoolGetFieldAt */
1462 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1464 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1465 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1467 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1469 cls = LLNI_classinfo_unwrap(jcpool);
1470 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1473 exceptions_throw_illegalargumentexception();
1477 // Create a new java.lang.reflect.Field Java object.
1478 java_lang_reflect_Field jlrf(ref->p.field);
1480 return (jobject) jlrf.get_handle();
1484 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1486 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1488 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1489 classinfo *c; /* resolved declaring class for the field */
1490 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1492 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1494 cls = LLNI_classinfo_unwrap(jcpool);
1495 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1498 exceptions_throw_illegalargumentexception();
1502 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1506 if (c == NULL || !(c->state & CLASS_LOADED)) {
1510 // Create a new java.lang.reflect.Field Java object.
1511 java_lang_reflect_Field jlrf(ref->p.field);
1513 return (jobject) jlrf.get_handle();
1517 /* JVM_ConstantPoolGetMemberRefInfoAt */
1519 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1521 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1523 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1529 /* JVM_ConstantPoolGetIntAt */
1531 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1533 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1534 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1536 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1538 cls = LLNI_classinfo_unwrap(jcpool);
1539 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1542 exceptions_throw_illegalargumentexception();
1550 /* JVM_ConstantPoolGetLongAt */
1552 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1554 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1555 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1557 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1559 cls = LLNI_classinfo_unwrap(jcpool);
1560 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1563 exceptions_throw_illegalargumentexception();
1571 /* JVM_ConstantPoolGetFloatAt */
1573 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1575 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1576 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1578 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1580 cls = LLNI_classinfo_unwrap(jcpool);
1581 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1584 exceptions_throw_illegalargumentexception();
1592 /* JVM_ConstantPoolGetDoubleAt */
1594 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1596 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1597 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1599 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1601 cls = LLNI_classinfo_unwrap(jcpool);
1602 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1605 exceptions_throw_illegalargumentexception();
1613 /* JVM_ConstantPoolGetStringAt */
1615 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1617 utf *ref; /* utf object for the string in constant pool at index 'index' */
1618 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1620 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1622 cls = LLNI_classinfo_unwrap(jcpool);
1623 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1626 exceptions_throw_illegalargumentexception();
1630 /* XXX: I hope literalstring_new is the right Function. */
1631 return (jstring)literalstring_new(ref);
1635 /* JVM_ConstantPoolGetUTF8At */
1637 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1639 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1640 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1642 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1644 cls = LLNI_classinfo_unwrap(jcpool);
1645 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1648 exceptions_throw_illegalargumentexception();
1652 /* XXX: I hope literalstring_new is the right Function. */
1653 return (jstring)literalstring_new(ref);
1657 /* JVM_DesiredAssertionStatus */
1659 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1661 #if defined(ENABLE_ASSERTION)
1662 assertion_name_t *item;
1667 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1669 c = LLNI_classinfo_unwrap(cls);
1671 if (c->classloader == NULL) {
1672 status = (jboolean)assertion_system_enabled;
1675 status = (jboolean)assertion_user_enabled;
1678 if (list_assertion_names != NULL) {
1679 item = (assertion_name_t *)list_first(list_assertion_names);
1680 while (item != NULL) {
1681 name = utf_new_char(item->name);
1682 if (name == c->packagename) {
1683 status = (jboolean)item->enabled;
1685 else if (name == c->name) {
1686 status = (jboolean)item->enabled;
1689 item = (assertion_name_t *)list_next(list_assertion_names, item);
1695 return (jboolean)false;
1700 /* JVM_AssertionStatusDirectives */
1702 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1704 java_handle_objectarray_t *classes;
1705 java_handle_objectarray_t *packages;
1706 java_booleanarray_t *classEnabled;
1707 java_booleanarray_t *packageEnabled;
1708 #if defined(ENABLE_ASSERTION)
1709 assertion_name_t *item;
1714 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1716 #if defined(ENABLE_ASSERTION)
1717 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1719 classes = builtin_anewarray(0, class_java_lang_Object);
1721 if (classes == NULL)
1724 #if defined(ENABLE_ASSERTION)
1725 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1727 packages = builtin_anewarray(0, class_java_lang_Object);
1729 if (packages == NULL)
1732 #if defined(ENABLE_ASSERTION)
1733 classEnabled = builtin_newarray_boolean(assertion_class_count);
1735 classEnabled = builtin_newarray_boolean(0);
1737 if (classEnabled == NULL)
1740 #if defined(ENABLE_ASSERTION)
1741 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1743 packageEnabled = builtin_newarray_boolean(0);
1745 if (packageEnabled == NULL)
1748 #if defined(ENABLE_ASSERTION)
1749 /* initialize arrays */
1751 if (list_assertion_names != NULL) {
1755 item = (assertion_name_t *)list_first(list_assertion_names);
1756 while (item != NULL) {
1757 js = javastring_new_from_ascii(item->name);
1762 if (item->package == false) {
1763 classes->data[i] = js;
1764 classEnabled->data[i] = (jboolean) item->enabled;
1768 packages->data[j] = js;
1769 packageEnabled->data[j] = (jboolean) item->enabled;
1773 item = (assertion_name_t *)list_next(list_assertion_names, item);
1778 /* set instance fields */
1780 java_lang_AssertionStatusDirectives jlasd(classes, classEnabled, packages, packageEnabled);
1782 return (jobject) jlasd.get_handle();
1786 /* JVM_GetClassNameUTF */
1788 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1790 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1796 /* JVM_GetClassCPTypes */
1798 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1800 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1804 /* JVM_GetClassCPEntriesCount */
1806 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1808 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1814 /* JVM_GetClassFieldsCount */
1816 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1818 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1824 /* JVM_GetClassMethodsCount */
1826 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1828 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1834 /* JVM_GetMethodIxExceptionIndexes */
1836 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1838 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1842 /* JVM_GetMethodIxExceptionsCount */
1844 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1846 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1852 /* JVM_GetMethodIxByteCode */
1854 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1856 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1860 /* JVM_GetMethodIxByteCodeLength */
1862 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1864 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1870 /* JVM_GetMethodIxExceptionTableEntry */
1872 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1874 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1878 /* JVM_GetMethodIxExceptionTableLength */
1880 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1882 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1888 /* JVM_GetMethodIxModifiers */
1890 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1892 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1898 /* JVM_GetFieldIxModifiers */
1900 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1902 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1908 /* JVM_GetMethodIxLocalsCount */
1910 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1912 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1918 /* JVM_GetMethodIxArgsSize */
1920 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1922 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1928 /* JVM_GetMethodIxMaxStack */
1930 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1932 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1938 /* JVM_IsConstructorIx */
1940 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1942 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1948 /* JVM_GetMethodIxNameUTF */
1950 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1952 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1958 /* JVM_GetMethodIxSignatureUTF */
1960 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1962 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1968 /* JVM_GetCPFieldNameUTF */
1970 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1972 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1978 /* JVM_GetCPMethodNameUTF */
1980 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1982 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1988 /* JVM_GetCPMethodSignatureUTF */
1990 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1992 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1998 /* JVM_GetCPFieldSignatureUTF */
2000 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2002 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2008 /* JVM_GetCPClassNameUTF */
2010 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2012 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2018 /* JVM_GetCPFieldClassNameUTF */
2020 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2022 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2028 /* JVM_GetCPMethodClassNameUTF */
2030 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2032 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2038 /* JVM_GetCPFieldModifiers */
2040 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2042 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2048 /* JVM_GetCPMethodModifiers */
2050 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2052 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2058 /* JVM_ReleaseUTF */
2060 void JVM_ReleaseUTF(const char *utf)
2062 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2066 /* JVM_IsSameClassPackage */
2068 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2070 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2078 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2081 * JVM I/O error codes
2083 #define JVM_EEXIST -100
2085 jint JVM_Open(const char *fname, jint flags, jint mode)
2089 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2091 result = hpi_file->Open(fname, flags, mode);
2109 jint JVM_Close(jint fd)
2111 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2113 return hpi_file->Close(fd);
2119 jint JVM_Read(jint fd, char *buf, jint nbytes)
2121 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2123 return (jint) hpi_file->Read(fd, buf, nbytes);
2129 jint JVM_Write(jint fd, char *buf, jint nbytes)
2131 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2133 return (jint) hpi_file->Write(fd, buf, nbytes);
2139 jint JVM_Available(jint fd, jlong *pbytes)
2141 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2143 return hpi_file->Available(fd, pbytes);
2149 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2151 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2153 return hpi_file->Seek(fd, (off_t) offset, whence);
2159 jint JVM_SetLength(jint fd, jlong length)
2161 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2163 return hpi_file->SetLength(fd, length);
2169 jint JVM_Sync(jint fd)
2171 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2173 return hpi_file->Sync(fd);
2177 /* JVM_StartThread */
2179 void JVM_StartThread(JNIEnv* env, jobject jthread)
2181 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2183 threads_thread_start((java_handle_t *) jthread);
2187 /* JVM_StopThread */
2189 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2191 log_println("JVM_StopThread: Deprecated. Not implemented.");
2195 /* JVM_IsThreadAlive */
2197 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2203 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2205 h = (java_handle_t *) jthread;
2206 t = thread_get_thread(h);
2208 /* The threadobject is null when a thread is created in Java. The
2209 priority is set later during startup. */
2214 result = threads_thread_is_alive(t);
2220 /* JVM_SuspendThread */
2222 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2224 log_println("JVM_SuspendThread: Deprecated. Not implemented.");
2228 /* JVM_ResumeThread */
2230 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2232 log_println("JVM_ResumeThread: Deprecated. Not implemented.");
2236 /* JVM_SetThreadPriority */
2238 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2243 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2245 h = (java_handle_t *) jthread;
2246 t = thread_get_thread(h);
2248 /* The threadobject is null when a thread is created in Java. The
2249 priority is set later during startup. */
2254 threads_set_thread_priority(t->tid, prio);
2260 void JVM_Yield(JNIEnv *env, jclass threadClass)
2262 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2270 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2272 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2274 threads_sleep(millis, 0);
2278 /* JVM_CurrentThread */
2280 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2284 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2286 o = thread_get_current_object();
2292 /* JVM_CountStackFrames */
2294 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2296 log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2304 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2309 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2311 h = (java_handle_t *) jthread;
2312 t = thread_get_thread(h);
2317 threads_thread_interrupt(t);
2321 /* JVM_IsInterrupted */
2323 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2327 jboolean interrupted;
2329 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2331 h = (java_handle_t *) jthread;
2332 t = thread_get_thread(h);
2334 interrupted = thread_is_interrupted(t);
2336 if (interrupted && clear_interrupted)
2337 thread_set_interrupted(t, false);
2345 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2350 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2352 h = (java_handle_t *) obj;
2355 exceptions_throw_nullpointerexception();
2359 result = lock_is_held_by_current_thread(h);
2365 /* JVM_DumpAllStacks */
2367 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2369 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2373 /* JVM_CurrentLoadedClass */
2375 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2377 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2383 /* JVM_CurrentClassLoader */
2385 jobject JVM_CurrentClassLoader(JNIEnv *env)
2387 /* XXX if a method in a class in a trusted loader is in a
2388 doPrivileged, return NULL */
2390 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2396 /* JVM_GetClassContext */
2398 jobjectArray JVM_GetClassContext(JNIEnv *env)
2400 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2402 return (jobjectArray) stacktrace_getClassContext();
2406 /* JVM_ClassDepth */
2408 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2410 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2416 /* JVM_ClassLoaderDepth */
2418 jint JVM_ClassLoaderDepth(JNIEnv *env)
2420 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2426 /* JVM_GetSystemPackage */
2428 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2434 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2436 /* s = Package::find(name); */
2437 u = javastring_toutf((java_handle_t *) name, false);
2439 result = Package::find(u);
2442 s = javastring_new(result);
2450 /* JVM_GetSystemPackages */
2452 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2454 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2460 /* JVM_AllocateNewObject */
2462 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2464 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2470 /* JVM_AllocateNewArray */
2472 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2474 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2480 /* JVM_LatestUserDefinedLoader */
2482 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2486 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2488 cl = stacktrace_first_nonnull_classloader();
2490 return (jobject) cl;
2494 /* JVM_LoadClass0 */
2496 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2498 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2504 /* JVM_GetArrayLength */
2506 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2510 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2512 a = (java_handle_t *) arr;
2514 return array_length_get(a);
2518 /* JVM_GetArrayElement */
2520 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2525 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2527 a = (java_handle_t *) arr;
2529 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2530 /* exceptions_throw_illegalargumentexception(); */
2534 o = array_element_get(a, index);
2540 /* JVM_GetPrimitiveArrayElement */
2542 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2546 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2554 /* JVM_SetArrayElement */
2556 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2559 java_handle_t *value;
2561 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2563 a = (java_handle_t *) arr;
2564 value = (java_handle_t *) val;
2566 array_element_set(a, index, value);
2570 /* JVM_SetPrimitiveArrayElement */
2572 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2574 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2580 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2585 java_handle_objectarray_t *oa;
2587 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2589 if (eltClass == NULL) {
2590 exceptions_throw_nullpointerexception();
2594 /* NegativeArraySizeException is checked in builtin_newarray. */
2596 c = LLNI_classinfo_unwrap(eltClass);
2598 /* Create primitive or object array. */
2600 if (class_is_primitive(c)) {
2601 pc = Primitive::get_arrayclass_by_name(c->name);
2603 /* void arrays are not allowed. */
2606 exceptions_throw_illegalargumentexception();
2610 a = builtin_newarray(length, pc);
2615 oa = builtin_anewarray(length, c);
2617 return (jobject) oa;
2622 /* JVM_NewMultiArray */
2624 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2627 java_handle_intarray_t *ia;
2633 java_handle_objectarray_t *a;
2635 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2637 if (eltClass == NULL) {
2638 exceptions_throw_nullpointerexception();
2642 /* NegativeArraySizeException is checked in builtin_newarray. */
2644 c = LLNI_classinfo_unwrap(eltClass);
2646 ia = (java_handle_intarray_t *) dim;
2648 length = array_length_get((java_handle_t *) ia);
2650 /* We check here for exceptions thrown in array_length_get,
2651 otherwise these exceptions get overwritten by the following
2652 IllegalArgumentException. */
2657 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2658 exceptions_throw_illegalargumentexception();
2662 /* XXX This is just a quick hack to get it working. */
2664 dims = MNEW(long, length);
2666 for (i = 0; i < length; i++) {
2667 value = LLNI_array_direct(ia, i);
2668 dims[i] = (long) value;
2671 /* Create an array-class if necessary. */
2673 if (class_is_primitive(c))
2674 ac = Primitive::get_arrayclass_by_name(c->name);
2676 ac = class_array_of(c, true);
2681 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2687 /* JVM_InitializeSocketLibrary */
2689 jint JVM_InitializeSocketLibrary()
2691 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2693 return hpi_initialize_socket_library();
2699 jint JVM_Socket(jint domain, jint type, jint protocol)
2701 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2703 return os::socket(domain, type, protocol);
2707 /* JVM_SocketClose */
2709 jint JVM_SocketClose(jint fd)
2711 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2713 return os::close(fd);
2717 /* JVM_SocketShutdown */
2719 jint JVM_SocketShutdown(jint fd, jint howto)
2721 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2723 return os::shutdown(fd, howto);
2729 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2731 log_println("JVM_Recv: IMPLEMENT ME!");
2739 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2741 log_println("JVM_Send: IMPLEMENT ME!");
2749 jint JVM_Timeout(int fd, long timeout)
2751 log_println("JVM_Timeout: IMPLEMENT ME!");
2759 jint JVM_Listen(jint fd, jint count)
2761 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2763 return os::listen(fd, count);
2769 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2771 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2773 return os::connect(fd, him, len);
2779 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2781 log_println("JVM_Bind: IMPLEMENT ME!");
2789 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2791 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2793 return os::accept(fd, him, (socklen_t *) len);
2799 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2801 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2807 /* JVM_GetSockName */
2809 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2811 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2813 return os::getsockname(fd, him, (socklen_t *) len);
2819 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2821 log_println("JVM_SendTo: IMPLEMENT ME!");
2827 /* JVM_SocketAvailable */
2829 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2831 #if defined(FIONREAD)
2835 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2839 result = ioctl(fd, FIONREAD, &bytes);
2848 # error FIONREAD not defined
2853 /* JVM_GetSockOpt */
2855 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2857 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2859 return os::getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2863 /* JVM_SetSockOpt */
2865 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2867 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2869 return os::setsockopt(fd, level, optname, optval, optlen);
2873 /* JVM_GetHostName */
2875 int JVM_GetHostName(char *name, int namelen)
2879 TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2881 result = os::gethostname(name, namelen);
2883 TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
2889 /* JVM_GetHostByAddr */
2891 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2893 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2899 /* JVM_GetHostByName */
2901 struct hostent *JVM_GetHostByName(char* name)
2903 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2909 /* JVM_GetProtoByName */
2911 struct protoent *JVM_GetProtoByName(char* name)
2913 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2919 /* JVM_LoadLibrary */
2921 void *JVM_LoadLibrary(const char *name)
2926 TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
2928 u = utf_new_char(name);
2930 handle = native_library_open(u);
2932 TRACEJVMCALLSEXIT(("->%p", handle));
2938 /* JVM_UnloadLibrary */
2940 void JVM_UnloadLibrary(void* handle)
2942 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2944 native_library_close(handle);
2948 /* JVM_FindLibraryEntry */
2950 void *JVM_FindLibraryEntry(void *handle, const char *name)
2954 TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
2956 symbol = hpi_library->FindLibraryEntry(handle, name);
2958 TRACEJVMCALLSEXIT(("->%p", symbol));
2966 jboolean JVM_IsNaN(jdouble a)
2968 log_println("JVM_IsNaN: IMPLEMENT ME!");
2974 /* JVM_IsSupportedJNIVersion */
2976 jboolean JVM_IsSupportedJNIVersion(jint version)
2978 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
2980 return jni_version_check(version);
2984 /* JVM_InternString */
2986 jstring JVM_InternString(JNIEnv *env, jstring str)
2988 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
2990 return (jstring) javastring_intern((java_handle_t *) str);
2994 /* JVM_RawMonitorCreate */
2996 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3000 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3002 o = NEW(java_object_t);
3004 lock_init_object_lock(o);
3010 /* JVM_RawMonitorDestroy */
3012 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3014 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3016 FREE(mon, java_object_t);
3020 /* JVM_RawMonitorEnter */
3022 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3024 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3026 (void) lock_monitor_enter((java_object_t *) mon);
3032 /* JVM_RawMonitorExit */
3034 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3036 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3038 (void) lock_monitor_exit((java_object_t *) mon);
3042 /* JVM_SetPrimitiveFieldValues */
3044 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3046 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3050 /* JVM_GetPrimitiveFieldValues */
3052 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3054 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3058 /* JVM_AccessVMBooleanFlag */
3060 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3062 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3068 /* JVM_AccessVMIntFlag */
3070 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3072 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3078 /* JVM_VMBreakPoint */
3080 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3082 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3086 /* JVM_GetClassFields */
3088 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3090 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3096 /* JVM_GetClassMethods */
3098 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3100 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3106 /* JVM_GetClassConstructors */
3108 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3110 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3116 /* JVM_GetClassField */
3118 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3120 log_println("JVM_GetClassField: IMPLEMENT ME!");
3126 /* JVM_GetClassMethod */
3128 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3130 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3136 /* JVM_GetClassConstructor */
3138 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3140 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3146 /* JVM_NewInstance */
3148 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3150 log_println("JVM_NewInstance: IMPLEMENT ME!");
3158 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3160 log_println("JVM_GetField: IMPLEMENT ME!");
3166 /* JVM_GetPrimitiveField */
3168 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3172 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3182 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3184 log_println("JVM_SetField: IMPLEMENT ME!");
3188 /* JVM_SetPrimitiveField */
3190 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3192 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3196 /* JVM_InvokeMethod */
3198 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3200 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3202 java_lang_reflect_Method jlrm(method);
3204 java_handle_t* result = jlrm.invoke((java_handle_t*) obj, (java_handle_objectarray_t*) args0);
3206 return (jobject) result;
3210 /* JVM_NewInstanceFromConstructor */
3212 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3214 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3216 java_lang_reflect_Constructor jlrc(con);
3217 java_handle_t* o = jlrc.new_instance((java_handle_objectarray_t*) args0);
3223 /* JVM_SupportsCX8 */
3225 jboolean JVM_SupportsCX8()
3227 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3237 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3239 log_println("JVM_CX8Field: IMPLEMENT ME!");
3245 /* JVM_GetAllThreads */
3247 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3249 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3255 /* JVM_DumpThreads */
3257 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3259 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3265 /* JVM_GetManagement */
3267 void *JVM_GetManagement(jint version)
3269 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3271 /* TODO We current don't support the management interface. */
3277 /* JVM_InitAgentProperties */
3279 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3281 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3287 /* JVM_GetEnclosingMethodInfo */
3289 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3293 java_handle_objectarray_t *oa;
3295 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3297 c = LLNI_classinfo_unwrap(ofClass);
3299 if ((c == NULL) || class_is_primitive(c))
3302 m = class_get_enclosingmethod_raw(c);
3307 oa = builtin_anewarray(3, class_java_lang_Object);
3312 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
3313 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3314 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3316 return (jobjectArray) oa;
3320 /* JVM_GetThreadStateValues */
3322 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3324 java_handle_intarray_t *ia;
3326 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3327 env, javaThreadState));
3329 /* If new thread states are added in future JDK and VM versions,
3330 this should check if the JDK version is compatible with thread
3331 states supported by the VM. Return NULL if not compatible.
3333 This function must map the VM java_lang_Thread::ThreadStatus
3334 to the Java thread state that the JDK supports. */
3336 switch (javaThreadState) {
3337 case THREAD_STATE_NEW:
3338 ia = builtin_newarray_int(1);
3343 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3346 case THREAD_STATE_RUNNABLE:
3347 ia = builtin_newarray_int(1);
3352 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3355 case THREAD_STATE_BLOCKED:
3356 ia = builtin_newarray_int(1);
3361 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3364 case THREAD_STATE_WAITING:
3365 ia = builtin_newarray_int(2);
3370 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3371 /* XXX Implement parked stuff. */
3372 /* array_intarray_element_set(ia, 1, PARKED); */
3375 case THREAD_STATE_TIMED_WAITING:
3376 ia = builtin_newarray_int(3);
3381 /* XXX Not sure about that one. */
3382 /* array_intarray_element_set(ia, 0, SLEEPING); */
3383 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3384 /* XXX Implement parked stuff. */
3385 /* array_intarray_element_set(ia, 2, PARKED); */
3388 case THREAD_STATE_TERMINATED:
3389 ia = builtin_newarray_int(1);
3394 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3398 /* Unknown state - probably incompatible JDK version */
3402 return (jintArray) ia;
3406 /* JVM_GetThreadStateNames */
3408 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3410 java_handle_intarray_t *ia;
3411 java_handle_objectarray_t *oa;
3414 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3415 env, javaThreadState, values));
3417 ia = (java_handle_intarray_t *) values;
3419 /* If new thread states are added in future JDK and VM versions,
3420 this should check if the JDK version is compatible with thread
3421 states supported by the VM. Return NULL if not compatible.
3423 This function must map the VM java_lang_Thread::ThreadStatus
3424 to the Java thread state that the JDK supports. */
3426 if (values == NULL) {
3427 exceptions_throw_nullpointerexception();
3431 switch (javaThreadState) {
3432 case THREAD_STATE_NEW:
3433 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3435 oa = builtin_anewarray(1, class_java_lang_String);
3440 s = javastring_new(utf_new_char("NEW"));
3445 array_objectarray_element_set(oa, 0, s);
3448 case THREAD_STATE_RUNNABLE:
3449 oa = builtin_anewarray(1, class_java_lang_String);
3454 s = javastring_new(utf_new_char("RUNNABLE"));
3459 array_objectarray_element_set(oa, 0, s);
3462 case THREAD_STATE_BLOCKED:
3463 oa = builtin_anewarray(1, class_java_lang_String);
3468 s = javastring_new(utf_new_char("BLOCKED"));
3473 array_objectarray_element_set(oa, 0, s);
3476 case THREAD_STATE_WAITING:
3477 oa = builtin_anewarray(2, class_java_lang_String);
3482 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3483 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3488 array_objectarray_element_set(oa, 0, s);
3489 /* array_objectarray_element_set(oa, 1, s); */
3492 case THREAD_STATE_TIMED_WAITING:
3493 oa = builtin_anewarray(3, class_java_lang_String);
3498 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3499 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3500 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3505 /* array_objectarray_element_set(oa, 0, s); */
3506 array_objectarray_element_set(oa, 0, s);
3507 /* array_objectarray_element_set(oa, 2, s); */
3510 case THREAD_STATE_TERMINATED:
3511 oa = builtin_anewarray(1, class_java_lang_String);
3516 s = javastring_new(utf_new_char("TERMINATED"));
3521 array_objectarray_element_set(oa, 0, s);
3525 /* Unknown state - probably incompatible JDK version */
3529 return (jobjectArray) oa;
3533 /* JVM_GetVersionInfo */
3535 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3537 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3541 /* OS: JVM_RegisterSignal */
3543 void *JVM_RegisterSignal(jint sig, void *handler)
3545 functionptr newHandler;
3547 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3549 if (handler == (void *) 2)
3550 newHandler = (functionptr) signal_thread_handler;
3552 newHandler = (functionptr) (uintptr_t) handler;
3559 /* These signals are already used by the VM. */
3563 /* This signal is used by the VM to dump thread stacks unless
3564 ReduceSignalUsage is set, in which case the user is allowed
3565 to set his own _native_ handler for this signal; thus, in
3566 either case, we do not allow JVM_RegisterSignal to change
3576 signal_register_signal(sig, newHandler, SA_RESTART | SA_SIGINFO);
3578 /* XXX Should return old handler. */
3584 /* OS: JVM_RaiseSignal */
3586 jboolean JVM_RaiseSignal(jint sig)
3588 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3594 /* OS: JVM_FindSignal */
3596 jint JVM_FindSignal(const char *name)
3598 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3600 #if defined(__LINUX__)
3601 if (strcmp(name, "HUP") == 0)
3604 if (strcmp(name, "INT") == 0)
3607 if (strcmp(name, "TERM") == 0)
3609 #elif defined(__SOLARIS__)
3612 if (os::str2sig(name, &signum) == -1)
3617 # error Not implemented for this OS.
3627 * These are local overrides for various environment variables in Emacs.
3628 * Please do not remove this and leave it at the end of the file, where
3629 * Emacs will automagically detect them.
3630 * ---------------------------------------------------------------------
3633 * indent-tabs-mode: t