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>
44 // Include our JNI header before the JVM headers, because the JVM
45 // headers include jni.h and we want to override the typedefs in
47 #include "native/jni.hpp"
49 // We include jvm_md.h before jvm.h as the latter includes the former.
50 #include INCLUDE_JVM_MD_H
51 #include INCLUDE_JVM_H
53 #include "mm/memory.h"
55 #include "native/llni.h"
56 #include "native/native.hpp"
58 #include "native/vm/reflection.hpp"
60 #include "native/vm/openjdk/hpi.h"
61 #include "native/vm/openjdk/management.hpp"
63 #include "threads/lock.hpp"
64 #include "threads/thread.hpp"
66 #include "toolbox/logging.h"
67 #include "toolbox/list.hpp"
69 #include "vm/array.hpp"
71 #if defined(ENABLE_ASSERTION)
72 #include "vm/assertion.hpp"
75 #include "vm/jit/builtin.hpp"
76 #include "vm/classcache.h"
77 #include "vm/exceptions.hpp"
78 #include "vm/global.h"
79 #include "vm/globals.hpp"
80 #include "vm/initialize.h"
81 #include "vm/javaobjects.hpp"
82 #include "vm/options.h"
84 #include "vm/package.hpp"
85 #include "vm/primitive.hpp"
86 #include "vm/properties.hpp"
87 #include "vm/resolve.h"
88 #include "vm/signallocal.h"
89 #include "vm/string.hpp"
92 #include "vm/jit/stacktrace.hpp"
95 /* debugging macros ***********************************************************/
99 # define TRACEJVMCALLS(x) \
101 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
106 # define TRACEJVMCALLSENTER(x) \
108 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
114 # define TRACEJVMCALLSEXIT(x) \
116 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
122 # define TRACEJVMCALLSVERBOSE(x) \
124 if (opt_TraceJVMCallsVerbose) { \
129 # define PRINTJVMWARNINGS(x)
131 /* if (opt_PrintJVMWarnings) { \ */
132 /* log_println x; \ */
138 # define TRACEJVMCALLS(x)
139 # define TRACEJVMCALLSENTER(x)
140 # define TRACEJVMCALLSEXIT(x)
141 # define TRACEJVMCALLSVERBOSE(x)
142 # define PRINTJVMWARNINGS(x)
147 // Interface functions are exported as C functions.
150 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
152 if ((intptr_t) count <= 0)
155 return vsnprintf(str, count, fmt, args);
159 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
165 len = jio_vsnprintf(str, count, fmt, ap);
172 int jio_fprintf(FILE* f, const char *fmt, ...)
174 log_println("jio_fprintf: IMPLEMENT ME!");
180 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
182 log_println("jio_vfprintf: IMPLEMENT ME!");
188 int jio_printf(const char *fmt, ...)
190 log_println("jio_printf: IMPLEMENT ME!");
196 /* JVM_GetInterfaceVersion */
198 jint JVM_GetInterfaceVersion()
200 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
202 #define JVM_INTERFACE_VERSION 4
204 return JVM_INTERFACE_VERSION;
208 /* JVM_CurrentTimeMillis */
210 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
212 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
214 return (jlong) builtin_currenttimemillis();
220 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
222 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
224 return (jlong) builtin_nanotime();
230 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
235 s = (java_handle_t *) src;
236 d = (java_handle_t *) dst;
238 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));
240 builtin_arraycopy(s, src_pos, d, dst_pos, length);
244 /* JVM_InitProperties */
246 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
251 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
253 h = (java_handle_t *) properties;
255 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
256 sun.nio.MaxDirectMemorySize property. Do this after setting
257 user properties to prevent people from setting the value with a
258 -D option, as requested. */
260 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
261 VM::get_current()->get_properties().put("sun.nio.MaxDirectMemorySize", buf);
263 // Fill the java.util.Properties object.
264 VM::get_current()->get_properties().fill(h);
272 void JVM_Exit(jint code)
274 log_println("JVM_Exit: IMPLEMENT ME!");
280 void JVM_Halt(jint code)
282 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
289 /* JVM_OnExit(void (*func)) */
291 void JVM_OnExit(void (*func)(void))
293 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
301 TRACEJVMCALLS(("JVM_GC()"));
307 /* JVM_MaxObjectInspectionAge */
309 jlong JVM_MaxObjectInspectionAge(void)
311 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
317 /* JVM_TraceInstructions */
319 void JVM_TraceInstructions(jboolean on)
321 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
325 /* JVM_TraceMethodCalls */
327 void JVM_TraceMethodCalls(jboolean on)
329 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
333 /* JVM_TotalMemory */
335 jlong JVM_TotalMemory(void)
337 TRACEJVMCALLS(("JVM_TotalMemory()"));
339 return gc_get_heap_size();
345 jlong JVM_FreeMemory(void)
347 TRACEJVMCALLS(("JVM_FreeMemory()"));
349 return gc_get_free_bytes();
355 jlong JVM_MaxMemory(void)
357 TRACEJVMCALLS(("JVM_MaxMemory()"));
359 return gc_get_max_heap_size();
363 /* JVM_ActiveProcessorCount */
365 jint JVM_ActiveProcessorCount(void)
367 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
369 return os::processors_online();
373 /* JVM_FillInStackTrace */
375 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
377 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
379 java_handle_bytearray_t* ba = stacktrace_get_current();
384 java_lang_Throwable jlt(receiver, ba);
388 /* JVM_PrintStackTrace */
390 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
392 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
396 /* JVM_GetStackTraceDepth */
398 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
400 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
402 java_lang_Throwable jlt(throwable);
405 exceptions_throw_nullpointerexception();
409 java_handle_bytearray_t* ba = jlt.get_backtrace();
414 // We need a critical section here as the stacktrace structure is
415 // mapped onto a Java byte-array.
419 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
421 int32_t depth = st->length;
429 /* JVM_GetStackTraceElement */
431 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
433 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
435 java_lang_Throwable jlt(throwable);
436 java_handle_bytearray_t* ba = jlt.get_backtrace();
438 // We need a critical section here as the stacktrace structure is
439 // mapped onto a Java byte-array.
442 stacktrace_t* st = (stacktrace_t *) LLNI_array_data(ba);
444 if ((index < 0) || (index >= st->length)) {
445 /* XXX This should be an IndexOutOfBoundsException (check this
447 exceptions_throw_arrayindexoutofboundsexception();
451 // Get the stacktrace entry.
452 stacktrace_entry_t* ste = &(st->entries[index]);
454 // Get the codeinfo, methodinfo and classinfo.
455 codeinfo* code = ste->code;
456 methodinfo* m = code->m;
457 classinfo* c = m->clazz;
460 java_handle_t* filename;
462 if (!(m->flags & ACC_NATIVE)) {
463 if (c->sourcefile != NULL)
464 filename = javastring_new(c->sourcefile);
474 if (m->flags & ACC_NATIVE) {
478 // FIXME linenumbertable->find could change the methodinfo
479 // pointer when hitting an inlined method.
480 linenumber = code->linenumbertable->find(&m, ste->pc);
481 linenumber = (linenumber == 0) ? -1 : linenumber;
486 // Get declaring class name.
487 java_handle_t* declaringclass = class_get_classname(c);
489 // Allocate a new StackTraceElement object.
490 java_lang_StackTraceElement jlste(declaringclass, javastring_new(m->name), filename, linenumber);
495 return (jobject) jlste.get_handle();
501 jint JVM_IHashCode(JNIEnv* env, jobject handle)
503 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
505 java_lang_Object o(handle);
507 return o.get_hashcode();
511 /* JVM_MonitorWait */
513 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
515 #if defined(ENABLE_THREADS)
519 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
521 /* exceptions_throw_illegalargumentexception("argument out of range"); */
522 exceptions_throw_illegalargumentexception();
526 #if defined(ENABLE_THREADS)
527 o = (java_handle_t *) handle;
529 lock_wait_for_object(o, ms, 0);
534 /* JVM_MonitorNotify */
536 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
538 #if defined(ENABLE_THREADS)
542 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
544 #if defined(ENABLE_THREADS)
545 o = (java_handle_t *) handle;
547 lock_notify_object(o);
552 /* JVM_MonitorNotifyAll */
554 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
556 #if defined(ENABLE_THREADS)
560 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
562 #if defined(ENABLE_THREADS)
563 o = (java_handle_t *) handle;
565 lock_notify_all_object(o);
572 jobject JVM_Clone(JNIEnv* env, jobject handle)
574 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
576 return (jobject) builtin_clone(env, (java_handle_t *) handle);
580 /* JVM_InitializeCompiler */
582 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
584 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
588 /* JVM_IsSilentCompiler */
590 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
592 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
598 /* JVM_CompileClass */
600 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
602 log_println("JVM_CompileClass: IMPLEMENT ME!");
608 /* JVM_CompileClasses */
610 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
612 log_println("JVM_CompileClasses: IMPLEMENT ME!");
618 /* JVM_CompilerCommand */
620 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
622 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
628 /* JVM_EnableCompiler */
630 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
632 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
633 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
637 /* JVM_DisableCompiler */
639 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
641 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
642 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
646 /* JVM_GetLastErrorString */
648 jint JVM_GetLastErrorString(char *buf, int len)
650 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
652 return hpi_system->GetLastErrorString(buf, len);
658 char *JVM_NativePath(char *path)
660 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
662 return hpi_file->NativePath(path);
666 /* JVM_GetCallerClass */
668 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
672 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
674 c = stacktrace_get_caller_class(depth);
680 /* JVM_FindPrimitiveClass */
682 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
687 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
690 c = Primitive::get_class_by_name(u);
692 return (jclass) LLNI_classinfo_wrap(c);
696 /* JVM_ResolveClass */
698 void JVM_ResolveClass(JNIEnv* env, jclass cls)
700 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
701 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
705 /* JVM_FindClassFromClassLoader */
707 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
713 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
715 /* As of now, OpenJDK does not call this function with throwError
718 assert(throwError == false);
720 u = utf_new_char(name);
721 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
723 c = load_class_from_classloader(u, cl);
729 if (!(c->state & CLASS_INITIALIZED))
730 if (!initialize_class(c))
733 return (jclass) LLNI_classinfo_wrap(c);
737 /* JVM_FindClassFromClass */
739 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
741 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
747 /* JVM_DefineClass */
749 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
751 log_println("JVM_DefineClass: IMPLEMENT ME!");
757 /* JVM_DefineClassWithSource */
759 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
765 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
768 u = utf_new_char(name);
772 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
774 /* XXX do something with source */
776 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
778 return (jclass) LLNI_classinfo_wrap(c);
782 /* JVM_FindLoadedClass */
784 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
790 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
792 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
794 u = javastring_toutf((java_handle_t *) name, true);
795 c = classcache_lookup(cl, u);
797 return (jclass) LLNI_classinfo_wrap(c);
801 /* JVM_GetClassName */
803 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
807 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
809 c = LLNI_classinfo_unwrap(cls);
811 return (jstring) class_get_classname(c);
815 /* JVM_GetClassInterfaces */
817 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
820 java_handle_objectarray_t *oa;
822 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
824 c = LLNI_classinfo_unwrap(cls);
826 oa = class_get_interfaces(c);
828 return (jobjectArray) oa;
832 /* JVM_GetClassLoader */
834 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
839 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
841 c = LLNI_classinfo_unwrap(cls);
842 cl = class_get_classloader(c);
844 TRACEJVMCALLSEXIT(("->%p", cl));
850 /* JVM_IsInterface */
852 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
856 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
858 c = LLNI_classinfo_unwrap(cls);
860 return class_is_interface(c);
864 /* JVM_GetClassSigners */
866 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
868 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
874 /* JVM_SetClassSigners */
876 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
879 java_handle_objectarray_t *hoa;
881 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
883 c = LLNI_classinfo_unwrap(cls);
885 hoa = (java_handle_objectarray_t *) signers;
887 /* This call is ignored for primitive types and arrays. Signers
888 are only set once, ClassLoader.java, and thus shouldn't be
889 called with an array. Only the bootstrap loader creates
892 if (class_is_primitive(c) || class_is_array(c))
895 LLNI_classinfo_field_set(c, signers, hoa);
899 /* JVM_GetProtectionDomain */
901 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
905 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
907 c = LLNI_classinfo_unwrap(cls);
910 exceptions_throw_nullpointerexception();
914 /* Primitive types do not have a protection domain. */
916 if (class_is_primitive(c))
919 return (jobject) c->protectiondomain;
923 /* JVM_SetProtectionDomain */
925 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
927 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
931 /* JVM_DoPrivileged */
933 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
938 java_handle_t *result;
941 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
943 h = (java_handle_t *) action;
944 LLNI_class_get(h, c);
946 if (action == NULL) {
947 exceptions_throw_nullpointerexception();
951 /* lookup run() method (throw no exceptions) */
953 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
956 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
957 exceptions_throw_internalerror("No run method");
961 /* XXX It seems something with a privileged stack needs to be done
964 result = vm_call_method(m, h);
966 e = exceptions_get_exception();
969 if ( builtin_instanceof(e, class_java_lang_Exception) &&
970 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
971 exceptions_clear_exception();
972 exceptions_throw_privilegedactionexception(e);
978 return (jobject) result;
982 /* JVM_GetInheritedAccessControlContext */
984 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
986 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
992 /* JVM_GetStackAccessControlContext */
994 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
996 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
998 /* XXX All stuff I tested so far works without that function. At
999 some point we have to implement it, but I disable the output
1000 for now to make IcedTea happy. */
1006 /* JVM_IsArrayClass */
1008 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1012 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1014 c = LLNI_classinfo_unwrap(cls);
1016 return class_is_array(c);
1020 /* JVM_IsPrimitiveClass */
1022 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1026 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1028 c = LLNI_classinfo_unwrap(cls);
1030 return class_is_primitive(c);
1034 /* JVM_GetComponentType */
1036 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1038 classinfo *component;
1041 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1043 c = LLNI_classinfo_unwrap(cls);
1045 component = class_get_componenttype(c);
1047 return (jclass) LLNI_classinfo_wrap(component);
1051 /* JVM_GetClassModifiers */
1053 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1058 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1060 c = LLNI_classinfo_unwrap(cls);
1062 flags = class_get_modifiers(c, false);
1068 /* JVM_GetDeclaredClasses */
1070 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1073 java_handle_objectarray_t *oa;
1075 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1077 c = LLNI_classinfo_unwrap(ofClass);
1079 oa = class_get_declaredclasses(c, false);
1081 return (jobjectArray) oa;
1085 /* JVM_GetDeclaringClass */
1087 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1092 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1094 c = LLNI_classinfo_unwrap(ofClass);
1096 dc = class_get_declaringclass(c);
1098 return (jclass) LLNI_classinfo_wrap(dc);
1102 /* JVM_GetClassSignature */
1104 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1110 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1112 c = LLNI_classinfo_unwrap(cls);
1114 /* Get the signature of the class. */
1116 u = class_get_signature(c);
1121 /* Convert UTF-string to a Java-string. */
1123 s = javastring_new(u);
1129 /* JVM_GetClassAnnotations */
1131 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1133 TRACEJVMCALLS(("JVM_GetClassAnnotations(env=%p, cls=%p)", env, cls));
1136 exceptions_throw_nullpointerexception();
1140 classinfo* c = LLNI_classinfo_unwrap(cls);
1142 /* get annotations: */
1143 java_handle_bytearray_t* annotations = class_get_annotations(c);
1145 return (jbyteArray) annotations;
1149 /* JVM_GetFieldAnnotations */
1151 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1153 TRACEJVMCALLS(("JVM_GetFieldAnnotations(env=%p, field=%p)", env, field));
1155 java_lang_reflect_Field jlrf(field);
1157 if (jlrf.is_null()) {
1158 exceptions_throw_nullpointerexception();
1162 return (jbyteArray) jlrf.get_annotations();
1166 /* JVM_GetMethodAnnotations */
1168 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1170 TRACEJVMCALLS(("JVM_GetMethodAnnotations(env=%p, method=%p)", env, method));
1172 java_lang_reflect_Method jlrm(method);
1174 if (jlrm.is_null()) {
1175 exceptions_throw_nullpointerexception();
1179 return (jbyteArray) jlrm.get_annotations();
1183 /* JVM_GetMethodDefaultAnnotationValue */
1185 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1187 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue(env=%p, method=%p)", env, method));
1189 java_lang_reflect_Method jlrm(method);
1191 if (jlrm.is_null()) {
1192 exceptions_throw_nullpointerexception();
1196 return (jbyteArray) jlrm.get_annotationDefault();
1200 /* JVM_GetMethodParameterAnnotations */
1202 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1204 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations(env=%p, method=%p)", env, method));
1206 java_lang_reflect_Method jlrm(method);
1208 if (jlrm.is_null()) {
1209 exceptions_throw_nullpointerexception();
1213 return (jbyteArray) jlrm.get_parameterAnnotations();
1217 /* JVM_GetClassDeclaredFields */
1219 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1222 java_handle_objectarray_t *oa;
1224 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1226 c = LLNI_classinfo_unwrap(ofClass);
1228 oa = class_get_declaredfields(c, publicOnly);
1230 return (jobjectArray) oa;
1234 /* JVM_GetClassDeclaredMethods */
1236 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1238 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1240 classinfo* c = LLNI_classinfo_unwrap(ofClass);
1242 java_handle_objectarray_t* oa = class_get_declaredmethods(c, publicOnly);
1244 return (jobjectArray) oa;
1248 /* JVM_GetClassDeclaredConstructors */
1250 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1253 java_handle_objectarray_t *oa;
1255 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1257 c = LLNI_classinfo_unwrap(ofClass);
1259 oa = class_get_declaredconstructors(c, publicOnly);
1261 return (jobjectArray) oa;
1265 /* JVM_GetClassAccessFlags */
1267 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1271 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1273 c = LLNI_classinfo_unwrap(cls);
1275 /* Primitive type classes have the correct access flags. */
1277 return c->flags & ACC_CLASS_REFLECT_MASK;
1281 /* JVM_GetClassConstantPool */
1283 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1285 #if defined(ENABLE_ANNOTATIONS)
1286 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1288 java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
1289 sun_reflect_ConstantPool cp(h, cls);
1295 return (jobject) cp.get_handle();
1297 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1303 /* JVM_ConstantPoolGetSize */
1305 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1307 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1309 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1311 c = LLNI_classinfo_unwrap(jcpool);
1317 /* JVM_ConstantPoolGetClassAt */
1319 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1321 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1322 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1323 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1325 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1327 c = LLNI_classinfo_unwrap(jcpool);
1329 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1332 exceptions_throw_illegalargumentexception();
1336 result = resolve_classref_eager(ref);
1338 return (jclass) LLNI_classinfo_wrap(result);
1342 /* JVM_ConstantPoolGetClassAtIfLoaded */
1344 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1346 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1347 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1348 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1350 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1352 c = LLNI_classinfo_unwrap(jcpool);
1354 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1357 exceptions_throw_illegalargumentexception();
1361 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1365 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1369 return (jclass) LLNI_classinfo_wrap(result);
1373 /* JVM_ConstantPoolGetMethodAt */
1375 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1377 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1378 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1380 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1382 cls = LLNI_classinfo_unwrap(jcpool);
1383 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1386 exceptions_throw_illegalargumentexception();
1390 // Create a new java.lang.reflect.Method Java object.
1391 /* XXX: is that right? or do I have to use resolve_method_*? */
1392 java_lang_reflect_Method jlrm(ref->p.method);
1394 return (jobject) jlrm.get_handle();
1398 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1400 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1402 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1403 classinfo *c = NULL; /* resolved declaring class of the method */
1404 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1406 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1408 cls = LLNI_classinfo_unwrap(jcpool);
1409 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1412 exceptions_throw_illegalargumentexception();
1416 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1420 if (c == NULL || !(c->state & CLASS_LOADED)) {
1424 // Create a new java.lang.reflect.Method Java object.
1425 java_lang_reflect_Method jlrm(ref->p.method);
1427 return (jobject) jlrm.get_handle();
1431 /* JVM_ConstantPoolGetFieldAt */
1433 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1435 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1436 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1438 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1440 cls = LLNI_classinfo_unwrap(jcpool);
1441 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1444 exceptions_throw_illegalargumentexception();
1448 // Create a new java.lang.reflect.Field Java object.
1449 java_lang_reflect_Field jlrf(ref->p.field);
1451 return (jobject) jlrf.get_handle();
1455 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1457 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1459 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1460 classinfo *c; /* resolved declaring class for the field */
1461 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1463 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1465 cls = LLNI_classinfo_unwrap(jcpool);
1466 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1469 exceptions_throw_illegalargumentexception();
1473 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1477 if (c == NULL || !(c->state & CLASS_LOADED)) {
1481 // Create a new java.lang.reflect.Field Java object.
1482 java_lang_reflect_Field jlrf(ref->p.field);
1484 return (jobject) jlrf.get_handle();
1488 /* JVM_ConstantPoolGetMemberRefInfoAt */
1490 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1492 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1494 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1500 /* JVM_ConstantPoolGetIntAt */
1502 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1504 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1505 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1507 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1509 cls = LLNI_classinfo_unwrap(jcpool);
1510 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1513 exceptions_throw_illegalargumentexception();
1521 /* JVM_ConstantPoolGetLongAt */
1523 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1525 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1526 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1528 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1530 cls = LLNI_classinfo_unwrap(jcpool);
1531 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1534 exceptions_throw_illegalargumentexception();
1542 /* JVM_ConstantPoolGetFloatAt */
1544 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1546 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1547 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1549 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1551 cls = LLNI_classinfo_unwrap(jcpool);
1552 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1555 exceptions_throw_illegalargumentexception();
1563 /* JVM_ConstantPoolGetDoubleAt */
1565 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1567 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1568 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1570 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1572 cls = LLNI_classinfo_unwrap(jcpool);
1573 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1576 exceptions_throw_illegalargumentexception();
1584 /* JVM_ConstantPoolGetStringAt */
1586 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1588 utf *ref; /* utf object for the string in constant pool at index 'index' */
1589 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1591 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1593 cls = LLNI_classinfo_unwrap(jcpool);
1594 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1597 exceptions_throw_illegalargumentexception();
1601 /* XXX: I hope literalstring_new is the right Function. */
1602 return (jstring)literalstring_new(ref);
1606 /* JVM_ConstantPoolGetUTF8At */
1608 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1610 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1611 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1613 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1615 cls = LLNI_classinfo_unwrap(jcpool);
1616 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1619 exceptions_throw_illegalargumentexception();
1623 /* XXX: I hope literalstring_new is the right Function. */
1624 return (jstring)literalstring_new(ref);
1628 /* JVM_DesiredAssertionStatus */
1630 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1632 #if defined(ENABLE_ASSERTION)
1637 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1639 c = LLNI_classinfo_unwrap(cls);
1641 if (c->classloader == NULL) {
1642 status = (jboolean)assertion_system_enabled;
1645 status = (jboolean)assertion_user_enabled;
1648 if (list_assertion_names != NULL) {
1649 for (List<assertion_name_t*>::iterator it = list_assertion_names->begin();
1650 it != list_assertion_names->end(); it++) {
1651 assertion_name_t* item = *it;
1653 name = utf_new_char(item->name);
1654 if (name == c->packagename) {
1655 status = (jboolean)item->enabled;
1657 else if (name == c->name) {
1658 status = (jboolean)item->enabled;
1665 return (jboolean)false;
1670 /* JVM_AssertionStatusDirectives */
1672 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1674 java_handle_objectarray_t *classes;
1675 java_handle_objectarray_t *packages;
1676 java_booleanarray_t *classEnabled;
1677 java_booleanarray_t *packageEnabled;
1678 #if defined(ENABLE_ASSERTION)
1683 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1685 #if defined(ENABLE_ASSERTION)
1686 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1688 classes = builtin_anewarray(0, class_java_lang_Object);
1690 if (classes == NULL)
1693 #if defined(ENABLE_ASSERTION)
1694 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1696 packages = builtin_anewarray(0, class_java_lang_Object);
1698 if (packages == NULL)
1701 #if defined(ENABLE_ASSERTION)
1702 classEnabled = builtin_newarray_boolean(assertion_class_count);
1704 classEnabled = builtin_newarray_boolean(0);
1706 if (classEnabled == NULL)
1709 #if defined(ENABLE_ASSERTION)
1710 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1712 packageEnabled = builtin_newarray_boolean(0);
1714 if (packageEnabled == NULL)
1717 #if defined(ENABLE_ASSERTION)
1718 /* initialize arrays */
1720 if (list_assertion_names != NULL) {
1724 for (List<assertion_name_t*>::iterator it = list_assertion_names->begin(); it != list_assertion_names->end(); it++) {
1725 assertion_name_t* item = *it;
1727 js = javastring_new_from_ascii(item->name);
1732 if (item->package == false) {
1733 classes->data[i] = js;
1734 classEnabled->data[i] = (jboolean) item->enabled;
1738 packages->data[j] = js;
1739 packageEnabled->data[j] = (jboolean) item->enabled;
1746 /* set instance fields */
1748 java_lang_AssertionStatusDirectives jlasd(classes, classEnabled, packages, packageEnabled);
1750 return (jobject) jlasd.get_handle();
1754 /* JVM_GetClassNameUTF */
1756 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1758 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1764 /* JVM_GetClassCPTypes */
1766 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1768 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1772 /* JVM_GetClassCPEntriesCount */
1774 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1776 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1782 /* JVM_GetClassFieldsCount */
1784 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1786 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1792 /* JVM_GetClassMethodsCount */
1794 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1796 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1802 /* JVM_GetMethodIxExceptionIndexes */
1804 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1806 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1810 /* JVM_GetMethodIxExceptionsCount */
1812 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1814 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1820 /* JVM_GetMethodIxByteCode */
1822 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1824 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1828 /* JVM_GetMethodIxByteCodeLength */
1830 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1832 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1838 /* JVM_GetMethodIxExceptionTableEntry */
1840 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1842 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1846 /* JVM_GetMethodIxExceptionTableLength */
1848 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1850 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1856 /* JVM_GetMethodIxModifiers */
1858 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1860 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1866 /* JVM_GetFieldIxModifiers */
1868 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1870 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1876 /* JVM_GetMethodIxLocalsCount */
1878 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1880 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1886 /* JVM_GetMethodIxArgsSize */
1888 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1890 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1896 /* JVM_GetMethodIxMaxStack */
1898 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1900 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1906 /* JVM_IsConstructorIx */
1908 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1910 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1916 /* JVM_GetMethodIxNameUTF */
1918 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1920 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1926 /* JVM_GetMethodIxSignatureUTF */
1928 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1930 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1936 /* JVM_GetCPFieldNameUTF */
1938 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1940 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1946 /* JVM_GetCPMethodNameUTF */
1948 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1950 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1956 /* JVM_GetCPMethodSignatureUTF */
1958 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1960 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1966 /* JVM_GetCPFieldSignatureUTF */
1968 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1970 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1976 /* JVM_GetCPClassNameUTF */
1978 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1980 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
1986 /* JVM_GetCPFieldClassNameUTF */
1988 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1990 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
1996 /* JVM_GetCPMethodClassNameUTF */
1998 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2000 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2006 /* JVM_GetCPFieldModifiers */
2008 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2010 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2016 /* JVM_GetCPMethodModifiers */
2018 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2020 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2026 /* JVM_ReleaseUTF */
2028 void JVM_ReleaseUTF(const char *utf)
2030 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2034 /* JVM_IsSameClassPackage */
2036 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2038 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2046 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2049 * JVM I/O error codes
2051 #define JVM_EEXIST -100
2053 jint JVM_Open(const char *fname, jint flags, jint mode)
2057 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2059 result = hpi_file->Open(fname, flags, mode);
2077 jint JVM_Close(jint fd)
2079 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2081 return hpi_file->Close(fd);
2087 jint JVM_Read(jint fd, char *buf, jint nbytes)
2089 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2091 return (jint) hpi_file->Read(fd, buf, nbytes);
2097 jint JVM_Write(jint fd, char *buf, jint nbytes)
2099 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2101 return (jint) hpi_file->Write(fd, buf, nbytes);
2107 jint JVM_Available(jint fd, jlong *pbytes)
2109 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2111 return hpi_file->Available(fd, pbytes);
2117 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2119 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2121 return hpi_file->Seek(fd, (off_t) offset, whence);
2127 jint JVM_SetLength(jint fd, jlong length)
2129 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2131 return hpi_file->SetLength(fd, length);
2137 jint JVM_Sync(jint fd)
2139 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2141 return hpi_file->Sync(fd);
2145 /* JVM_StartThread */
2147 void JVM_StartThread(JNIEnv* env, jobject jthread)
2149 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2151 threads_thread_start((java_handle_t *) jthread);
2155 /* JVM_StopThread */
2157 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2159 log_println("JVM_StopThread: Deprecated. Not implemented.");
2163 /* JVM_IsThreadAlive */
2165 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2171 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2173 h = (java_handle_t *) jthread;
2174 t = thread_get_thread(h);
2176 /* The threadobject is null when a thread is created in Java. The
2177 priority is set later during startup. */
2182 result = threads_thread_is_alive(t);
2188 /* JVM_SuspendThread */
2190 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2192 log_println("JVM_SuspendThread: Deprecated. Not implemented.");
2196 /* JVM_ResumeThread */
2198 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2200 log_println("JVM_ResumeThread: Deprecated. Not implemented.");
2204 /* JVM_SetThreadPriority */
2206 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2211 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2213 h = (java_handle_t *) jthread;
2214 t = thread_get_thread(h);
2216 /* The threadobject is null when a thread is created in Java. The
2217 priority is set later during startup. */
2222 threads_set_thread_priority(t->tid, prio);
2228 void JVM_Yield(JNIEnv *env, jclass threadClass)
2230 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2238 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2240 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2242 threads_sleep(millis, 0);
2246 /* JVM_CurrentThread */
2248 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2252 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2254 o = thread_get_current_object();
2260 /* JVM_CountStackFrames */
2262 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2264 log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2272 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2277 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2279 h = (java_handle_t *) jthread;
2280 t = thread_get_thread(h);
2285 threads_thread_interrupt(t);
2289 /* JVM_IsInterrupted */
2291 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2295 jboolean interrupted;
2297 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2299 h = (java_handle_t *) jthread;
2300 t = thread_get_thread(h);
2302 interrupted = thread_is_interrupted(t);
2304 if (interrupted && clear_interrupted)
2305 thread_set_interrupted(t, false);
2313 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2318 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2320 h = (java_handle_t *) obj;
2323 exceptions_throw_nullpointerexception();
2327 result = lock_is_held_by_current_thread(h);
2333 /* JVM_DumpAllStacks */
2335 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2337 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2341 /* JVM_CurrentLoadedClass */
2343 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2345 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2351 /* JVM_CurrentClassLoader */
2353 jobject JVM_CurrentClassLoader(JNIEnv *env)
2355 /* XXX if a method in a class in a trusted loader is in a
2356 doPrivileged, return NULL */
2358 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2364 /* JVM_GetClassContext */
2366 jobjectArray JVM_GetClassContext(JNIEnv *env)
2368 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2370 return (jobjectArray) stacktrace_getClassContext();
2374 /* JVM_ClassDepth */
2376 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2378 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2384 /* JVM_ClassLoaderDepth */
2386 jint JVM_ClassLoaderDepth(JNIEnv *env)
2388 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2394 /* JVM_GetSystemPackage */
2396 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2402 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2404 /* s = Package::find(name); */
2405 u = javastring_toutf((java_handle_t *) name, false);
2407 result = Package::find(u);
2410 s = javastring_new(result);
2418 /* JVM_GetSystemPackages */
2420 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2422 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2428 /* JVM_AllocateNewObject */
2430 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2432 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2438 /* JVM_AllocateNewArray */
2440 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2442 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2448 /* JVM_LatestUserDefinedLoader */
2450 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2454 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2456 cl = stacktrace_first_nonnull_classloader();
2458 return (jobject) cl;
2462 /* JVM_LoadClass0 */
2464 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2466 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2472 /* JVM_GetArrayLength */
2474 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2478 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2480 a = (java_handle_t *) arr;
2482 return array_length_get(a);
2486 /* JVM_GetArrayElement */
2488 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2493 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2495 a = (java_handle_t *) arr;
2497 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2498 /* exceptions_throw_illegalargumentexception(); */
2502 o = array_element_get(a, index);
2508 /* JVM_GetPrimitiveArrayElement */
2510 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2514 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2522 /* JVM_SetArrayElement */
2524 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2527 java_handle_t *value;
2529 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2531 a = (java_handle_t *) arr;
2532 value = (java_handle_t *) val;
2534 array_element_set(a, index, value);
2538 /* JVM_SetPrimitiveArrayElement */
2540 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2542 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2548 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2553 java_handle_objectarray_t *oa;
2555 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2557 if (eltClass == NULL) {
2558 exceptions_throw_nullpointerexception();
2562 /* NegativeArraySizeException is checked in builtin_newarray. */
2564 c = LLNI_classinfo_unwrap(eltClass);
2566 /* Create primitive or object array. */
2568 if (class_is_primitive(c)) {
2569 pc = Primitive::get_arrayclass_by_name(c->name);
2571 /* void arrays are not allowed. */
2574 exceptions_throw_illegalargumentexception();
2578 a = builtin_newarray(length, pc);
2583 oa = builtin_anewarray(length, c);
2585 return (jobject) oa;
2590 /* JVM_NewMultiArray */
2592 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2595 java_handle_intarray_t *ia;
2601 java_handle_objectarray_t *a;
2603 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2605 if (eltClass == NULL) {
2606 exceptions_throw_nullpointerexception();
2610 /* NegativeArraySizeException is checked in builtin_newarray. */
2612 c = LLNI_classinfo_unwrap(eltClass);
2614 ia = (java_handle_intarray_t *) dim;
2616 length = array_length_get((java_handle_t *) ia);
2618 /* We check here for exceptions thrown in array_length_get,
2619 otherwise these exceptions get overwritten by the following
2620 IllegalArgumentException. */
2625 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2626 exceptions_throw_illegalargumentexception();
2630 /* XXX This is just a quick hack to get it working. */
2632 dims = MNEW(long, length);
2634 for (i = 0; i < length; i++) {
2635 value = LLNI_array_direct(ia, i);
2636 dims[i] = (long) value;
2639 /* Create an array-class if necessary. */
2641 if (class_is_primitive(c))
2642 ac = Primitive::get_arrayclass_by_name(c->name);
2644 ac = class_array_of(c, true);
2649 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2655 /* JVM_InitializeSocketLibrary */
2657 jint JVM_InitializeSocketLibrary()
2659 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2661 return hpi_initialize_socket_library();
2667 jint JVM_Socket(jint domain, jint type, jint protocol)
2669 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2671 return os::socket(domain, type, protocol);
2675 /* JVM_SocketClose */
2677 jint JVM_SocketClose(jint fd)
2679 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2681 return os::close(fd);
2685 /* JVM_SocketShutdown */
2687 jint JVM_SocketShutdown(jint fd, jint howto)
2689 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2691 return os::shutdown(fd, howto);
2697 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2699 log_println("JVM_Recv: IMPLEMENT ME!");
2707 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2709 log_println("JVM_Send: IMPLEMENT ME!");
2717 jint JVM_Timeout(int fd, long timeout)
2719 log_println("JVM_Timeout: IMPLEMENT ME!");
2727 jint JVM_Listen(jint fd, jint count)
2729 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2731 return os::listen(fd, count);
2737 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2739 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2741 return os::connect(fd, him, len);
2747 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2749 log_println("JVM_Bind: IMPLEMENT ME!");
2757 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2759 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2761 return os::accept(fd, him, (socklen_t *) len);
2767 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2769 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2775 /* JVM_GetSockName */
2777 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2779 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2781 return os::getsockname(fd, him, (socklen_t *) len);
2787 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2789 log_println("JVM_SendTo: IMPLEMENT ME!");
2795 /* JVM_SocketAvailable */
2797 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2799 #if defined(FIONREAD)
2803 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2807 result = ioctl(fd, FIONREAD, &bytes);
2816 # error FIONREAD not defined
2821 /* JVM_GetSockOpt */
2823 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2825 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2827 return os::getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2831 /* JVM_SetSockOpt */
2833 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2835 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2837 return os::setsockopt(fd, level, optname, optval, optlen);
2841 /* JVM_GetHostName */
2843 int JVM_GetHostName(char *name, int namelen)
2847 TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2849 result = os::gethostname(name, namelen);
2851 TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
2857 /* JVM_GetHostByAddr */
2859 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2861 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2867 /* JVM_GetHostByName */
2869 struct hostent *JVM_GetHostByName(char* name)
2871 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2877 /* JVM_GetProtoByName */
2879 struct protoent *JVM_GetProtoByName(char* name)
2881 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
2887 /* JVM_LoadLibrary */
2889 void *JVM_LoadLibrary(const char *name)
2894 TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
2896 u = utf_new_char(name);
2898 handle = native_library_open(u);
2900 TRACEJVMCALLSEXIT(("->%p", handle));
2906 /* JVM_UnloadLibrary */
2908 void JVM_UnloadLibrary(void* handle)
2910 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
2912 native_library_close(handle);
2916 /* JVM_FindLibraryEntry */
2918 void *JVM_FindLibraryEntry(void *handle, const char *name)
2922 TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
2924 symbol = hpi_library->FindLibraryEntry(handle, name);
2926 TRACEJVMCALLSEXIT(("->%p", symbol));
2934 jboolean JVM_IsNaN(jdouble a)
2936 log_println("JVM_IsNaN: IMPLEMENT ME!");
2942 /* JVM_IsSupportedJNIVersion */
2944 jboolean JVM_IsSupportedJNIVersion(jint version)
2946 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
2948 return jni_version_check(version);
2952 /* JVM_InternString */
2954 jstring JVM_InternString(JNIEnv *env, jstring str)
2956 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
2958 return (jstring) javastring_intern((java_handle_t *) str);
2962 /* JVM_RawMonitorCreate */
2964 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
2966 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
2968 Mutex* m = new Mutex();
2974 /* JVM_RawMonitorDestroy */
2976 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void* mon)
2978 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
2980 delete ((Mutex*) mon);
2984 /* JVM_RawMonitorEnter */
2986 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void* mon)
2988 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
2990 ((Mutex*) mon)->lock();
2996 /* JVM_RawMonitorExit */
2998 JNIEXPORT void JNICALL JVM_RawMonitorExit(void* mon)
3000 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3002 ((Mutex*) mon)->unlock();
3006 /* JVM_SetPrimitiveFieldValues */
3008 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3010 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3014 /* JVM_GetPrimitiveFieldValues */
3016 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3018 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3022 /* JVM_AccessVMBooleanFlag */
3024 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3026 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3032 /* JVM_AccessVMIntFlag */
3034 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3036 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3042 /* JVM_VMBreakPoint */
3044 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3046 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3050 /* JVM_GetClassFields */
3052 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3054 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3060 /* JVM_GetClassMethods */
3062 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3064 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3070 /* JVM_GetClassConstructors */
3072 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3074 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3080 /* JVM_GetClassField */
3082 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3084 log_println("JVM_GetClassField: IMPLEMENT ME!");
3090 /* JVM_GetClassMethod */
3092 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3094 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3100 /* JVM_GetClassConstructor */
3102 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3104 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3110 /* JVM_NewInstance */
3112 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3114 log_println("JVM_NewInstance: IMPLEMENT ME!");
3122 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3124 log_println("JVM_GetField: IMPLEMENT ME!");
3130 /* JVM_GetPrimitiveField */
3132 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3136 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3146 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3148 log_println("JVM_SetField: IMPLEMENT ME!");
3152 /* JVM_SetPrimitiveField */
3154 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3156 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3160 /* JVM_InvokeMethod */
3162 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3164 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3166 java_lang_reflect_Method jlrm(method);
3168 java_handle_t* result = jlrm.invoke((java_handle_t*) obj, (java_handle_objectarray_t*) args0);
3170 return (jobject) result;
3174 /* JVM_NewInstanceFromConstructor */
3176 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3178 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3180 java_lang_reflect_Constructor jlrc(con);
3181 java_handle_t* o = jlrc.new_instance((java_handle_objectarray_t*) args0);
3187 /* JVM_SupportsCX8 */
3189 jboolean JVM_SupportsCX8()
3191 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3201 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3203 log_println("JVM_CX8Field: IMPLEMENT ME!");
3209 /* JVM_GetAllThreads */
3211 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3213 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3219 /* JVM_DumpThreads */
3221 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3223 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3229 /* JVM_GetManagement */
3231 void *JVM_GetManagement(jint version)
3233 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3235 return Management::get_jmm_interface(version);
3239 /* JVM_InitAgentProperties */
3241 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3243 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3249 /* JVM_GetEnclosingMethodInfo */
3251 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3255 java_handle_objectarray_t *oa;
3257 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3259 c = LLNI_classinfo_unwrap(ofClass);
3261 if ((c == NULL) || class_is_primitive(c))
3264 m = class_get_enclosingmethod_raw(c);
3269 oa = builtin_anewarray(3, class_java_lang_Object);
3274 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
3275 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3276 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3278 return (jobjectArray) oa;
3282 /* JVM_GetThreadStateValues */
3284 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3286 java_handle_intarray_t *ia;
3288 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3289 env, javaThreadState));
3291 /* If new thread states are added in future JDK and VM versions,
3292 this should check if the JDK version is compatible with thread
3293 states supported by the VM. Return NULL if not compatible.
3295 This function must map the VM java_lang_Thread::ThreadStatus
3296 to the Java thread state that the JDK supports. */
3298 switch (javaThreadState) {
3299 case THREAD_STATE_NEW:
3300 ia = builtin_newarray_int(1);
3305 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3308 case THREAD_STATE_RUNNABLE:
3309 ia = builtin_newarray_int(1);
3314 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3317 case THREAD_STATE_BLOCKED:
3318 ia = builtin_newarray_int(1);
3323 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3326 case THREAD_STATE_WAITING:
3327 ia = builtin_newarray_int(2);
3332 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3333 /* XXX Implement parked stuff. */
3334 /* array_intarray_element_set(ia, 1, PARKED); */
3337 case THREAD_STATE_TIMED_WAITING:
3338 ia = builtin_newarray_int(3);
3343 /* XXX Not sure about that one. */
3344 /* array_intarray_element_set(ia, 0, SLEEPING); */
3345 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3346 /* XXX Implement parked stuff. */
3347 /* array_intarray_element_set(ia, 2, PARKED); */
3350 case THREAD_STATE_TERMINATED:
3351 ia = builtin_newarray_int(1);
3356 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3360 /* Unknown state - probably incompatible JDK version */
3364 return (jintArray) ia;
3368 /* JVM_GetThreadStateNames */
3370 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3372 java_handle_intarray_t *ia;
3373 java_handle_objectarray_t *oa;
3376 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3377 env, javaThreadState, values));
3379 ia = (java_handle_intarray_t *) values;
3381 /* If new thread states are added in future JDK and VM versions,
3382 this should check if the JDK version is compatible with thread
3383 states supported by the VM. Return NULL if not compatible.
3385 This function must map the VM java_lang_Thread::ThreadStatus
3386 to the Java thread state that the JDK supports. */
3388 if (values == NULL) {
3389 exceptions_throw_nullpointerexception();
3393 switch (javaThreadState) {
3394 case THREAD_STATE_NEW:
3395 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3397 oa = builtin_anewarray(1, class_java_lang_String);
3402 s = javastring_new(utf_new_char("NEW"));
3407 array_objectarray_element_set(oa, 0, s);
3410 case THREAD_STATE_RUNNABLE:
3411 oa = builtin_anewarray(1, class_java_lang_String);
3416 s = javastring_new(utf_new_char("RUNNABLE"));
3421 array_objectarray_element_set(oa, 0, s);
3424 case THREAD_STATE_BLOCKED:
3425 oa = builtin_anewarray(1, class_java_lang_String);
3430 s = javastring_new(utf_new_char("BLOCKED"));
3435 array_objectarray_element_set(oa, 0, s);
3438 case THREAD_STATE_WAITING:
3439 oa = builtin_anewarray(2, class_java_lang_String);
3444 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3445 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3450 array_objectarray_element_set(oa, 0, s);
3451 /* array_objectarray_element_set(oa, 1, s); */
3454 case THREAD_STATE_TIMED_WAITING:
3455 oa = builtin_anewarray(3, class_java_lang_String);
3460 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3461 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3462 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3467 /* array_objectarray_element_set(oa, 0, s); */
3468 array_objectarray_element_set(oa, 0, s);
3469 /* array_objectarray_element_set(oa, 2, s); */
3472 case THREAD_STATE_TERMINATED:
3473 oa = builtin_anewarray(1, class_java_lang_String);
3478 s = javastring_new(utf_new_char("TERMINATED"));
3483 array_objectarray_element_set(oa, 0, s);
3487 /* Unknown state - probably incompatible JDK version */
3491 return (jobjectArray) oa;
3495 /* JVM_GetVersionInfo */
3497 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3499 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3503 /* OS: JVM_RegisterSignal */
3505 void *JVM_RegisterSignal(jint sig, void *handler)
3507 functionptr newHandler;
3509 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3511 if (handler == (void *) 2)
3512 newHandler = (functionptr) signal_thread_handler;
3514 newHandler = (functionptr) (uintptr_t) handler;
3521 /* These signals are already used by the VM. */
3525 /* This signal is used by the VM to dump thread stacks unless
3526 ReduceSignalUsage is set, in which case the user is allowed
3527 to set his own _native_ handler for this signal; thus, in
3528 either case, we do not allow JVM_RegisterSignal to change
3538 signal_register_signal(sig, newHandler, SA_RESTART | SA_SIGINFO);
3540 /* XXX Should return old handler. */
3546 /* OS: JVM_RaiseSignal */
3548 jboolean JVM_RaiseSignal(jint sig)
3550 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3556 /* OS: JVM_FindSignal */
3558 jint JVM_FindSignal(const char *name)
3560 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3562 #if defined(__LINUX__)
3563 if (strcmp(name, "HUP") == 0)
3566 if (strcmp(name, "INT") == 0)
3569 if (strcmp(name, "TERM") == 0)
3571 #elif defined(__SOLARIS__)
3574 if (os::str2sig(name, &signum) == -1)
3579 # error Not implemented for this OS.
3589 * These are local overrides for various environment variables in Emacs.
3590 * Please do not remove this and leave it at the end of the file, where
3591 * Emacs will automagically detect them.
3592 * ---------------------------------------------------------------------
3595 * indent-tabs-mode: t
3599 * vim:noexpandtab:sw=4:ts=4: