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.h"
49 #include "native/llni.h"
50 #include "native/native.h"
52 #include "native/include/java_lang_AssertionStatusDirectives.h"
53 #include "native/include/java_lang_String.h" /* required by j.l.CL */
54 #include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
55 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
56 #include "native/include/java_lang_StackTraceElement.h"
57 #include "native/include/java_lang_Throwable.h"
58 #include "native/include/java_security_ProtectionDomain.h"
60 #if defined(ENABLE_ANNOTATIONS)
61 #include "native/include/sun_reflect_ConstantPool.h"
64 #include "native/vm/reflect.h"
66 #include "native/vm/openjdk/hpi.h"
68 #include "threads/lock-common.h"
69 #include "threads/thread.hpp"
71 #include "toolbox/logging.h"
72 #include "toolbox/list.h"
76 #if defined(ENABLE_ASSERTION)
77 #include "vm/assertion.h"
80 #include "vm/builtin.h"
81 #include "vm/exceptions.hpp"
82 #include "vm/global.h"
83 #include "vm/initialize.h"
84 #include "vm/package.hpp"
85 #include "vm/primitive.hpp"
86 #include "vm/properties.h"
87 #include "vm/resolve.h"
88 #include "vm/signallocal.h"
89 #include "vm/string.hpp"
92 #include "vm/jit/stacktrace.hpp"
94 #include "vmcore/classcache.h"
95 #include "vmcore/globals.hpp"
96 #include "vmcore/options.h"
97 #include "vmcore/os.hpp"
100 /* debugging macros ***********************************************************/
104 # define TRACEJVMCALLS(x) \
106 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
111 # define TRACEJVMCALLSENTER(x) \
113 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
119 # define TRACEJVMCALLSEXIT(x) \
121 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
127 # define TRACEJVMCALLSVERBOSE(x) \
129 if (opt_TraceJVMCallsVerbose) { \
134 # define PRINTJVMWARNINGS(x)
136 /* if (opt_PrintJVMWarnings) { \ */
137 /* log_println x; \ */
143 # define TRACEJVMCALLS(x)
144 # define TRACEJVMCALLSENTER(x)
145 # define TRACEJVMCALLSEXIT(x)
146 # define TRACEJVMCALLSVERBOSE(x)
147 # define PRINTJVMWARNINGS(x)
153 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
154 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
155 /* and build number (xx) */
156 unsigned int update_version : 8; /* Update release version (uu) */
157 unsigned int special_update_version : 8; /* Special update release version (c) */
158 unsigned int reserved1 : 16;
159 unsigned int reserved2;
161 /* The following bits represents JVM supports that JDK has dependency on.
162 * JDK can use these bits to determine which JVM version
163 * and support it has to maintain runtime compatibility.
165 * When a new bit is added in a minor or update release, make sure
166 * the new bit is also added in the main/baseline.
168 unsigned int is_attachable : 1;
176 * A structure used to a capture exception table entry in a Java method.
183 } JVM_ExceptionTableEntryType;
186 // Interface functions are exported as C functions.
189 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
191 if ((intptr_t) count <= 0)
194 return vsnprintf(str, count, fmt, args);
198 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
204 len = jio_vsnprintf(str, count, fmt, ap);
211 int jio_fprintf(FILE* f, const char *fmt, ...)
213 log_println("jio_fprintf: IMPLEMENT ME!");
219 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
221 log_println("jio_vfprintf: IMPLEMENT ME!");
227 int jio_printf(const char *fmt, ...)
229 log_println("jio_printf: IMPLEMENT ME!");
235 /* JVM_GetInterfaceVersion */
237 jint JVM_GetInterfaceVersion()
239 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
241 #define JVM_INTERFACE_VERSION 4
243 return JVM_INTERFACE_VERSION;
247 /* JVM_CurrentTimeMillis */
249 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
251 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
253 return (jlong) builtin_currenttimemillis();
259 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
261 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
263 return (jlong) builtin_nanotime();
269 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
274 s = (java_handle_t *) src;
275 d = (java_handle_t *) dst;
277 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));
279 builtin_arraycopy(s, src_pos, d, dst_pos, length);
283 /* JVM_InitProperties */
285 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
290 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
292 h = (java_handle_t *) properties;
294 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
295 sun.nio.MaxDirectMemorySize property. Do this after setting
296 user properties to prevent people from setting the value with a
297 -D option, as requested. */
299 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
300 properties_add("sun.nio.MaxDirectMemorySize", buf);
302 /* Add all properties. */
304 properties_system_add_all(h);
312 void JVM_Exit(jint code)
314 log_println("JVM_Exit: IMPLEMENT ME!");
320 void JVM_Halt(jint code)
322 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
329 /* JVM_OnExit(void (*func)) */
331 void JVM_OnExit(void (*func)(void))
333 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
341 TRACEJVMCALLS(("JVM_GC()"));
347 /* JVM_MaxObjectInspectionAge */
349 jlong JVM_MaxObjectInspectionAge(void)
351 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
357 /* JVM_TraceInstructions */
359 void JVM_TraceInstructions(jboolean on)
361 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
365 /* JVM_TraceMethodCalls */
367 void JVM_TraceMethodCalls(jboolean on)
369 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
373 /* JVM_TotalMemory */
375 jlong JVM_TotalMemory(void)
377 TRACEJVMCALLS(("JVM_TotalMemory()"));
379 return gc_get_heap_size();
385 jlong JVM_FreeMemory(void)
387 TRACEJVMCALLS(("JVM_FreeMemory()"));
389 return gc_get_free_bytes();
395 jlong JVM_MaxMemory(void)
397 TRACEJVMCALLS(("JVM_MaxMemory()"));
399 return gc_get_max_heap_size();
403 /* JVM_ActiveProcessorCount */
405 jint JVM_ActiveProcessorCount(void)
407 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
409 return os::processors_online();
413 /* JVM_FillInStackTrace */
415 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
417 java_lang_Throwable *o;
418 java_handle_bytearray_t *ba;
420 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
422 o = (java_lang_Throwable *) receiver;
424 ba = stacktrace_get_current();
429 LLNI_field_set_ref(o, backtrace, (java_lang_Object *) ba);
433 /* JVM_PrintStackTrace */
435 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
437 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
441 /* JVM_GetStackTraceDepth */
443 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
445 java_lang_Throwable *to;
447 java_handle_bytearray_t *ba;
451 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
453 if (throwable == NULL) {
454 exceptions_throw_nullpointerexception();
458 to = (java_lang_Throwable *) throwable;
460 LLNI_field_get_ref(to, backtrace, o);
462 ba = (java_handle_bytearray_t *) o;
467 /* We need a critical section here as the stacktrace structure is
468 mapped onto a Java byte-array. */
472 st = (stacktrace_t *) LLNI_array_data(ba);
482 /* JVM_GetStackTraceElement */
484 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
486 java_lang_Throwable *to;
488 java_handle_bytearray_t *ba;
490 stacktrace_entry_t *ste;
494 java_lang_StackTraceElement *steo;
495 java_handle_t* declaringclass;
496 java_lang_String *filename;
499 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
501 to = (java_lang_Throwable *) throwable;
503 LLNI_field_get_ref(to, backtrace, o);
505 ba = (java_handle_bytearray_t *) o;
507 /* FIXME critical section */
509 st = (stacktrace_t *) LLNI_array_data(ba);
511 if ((index < 0) || (index >= st->length)) {
512 /* XXX This should be an IndexOutOfBoundsException (check this
515 exceptions_throw_arrayindexoutofboundsexception();
519 /* Get the stacktrace entry. */
521 ste = &(st->entries[index]);
523 /* Get the codeinfo, methodinfo and classinfo. */
529 /* allocate a new StackTraceElement */
531 steo = (java_lang_StackTraceElement *)
532 builtin_new(class_java_lang_StackTraceElement);
539 if (!(m->flags & ACC_NATIVE)) {
540 if (c->sourcefile != NULL)
541 filename = (java_lang_String *) javastring_new(c->sourcefile);
548 /* get line number */
550 if (m->flags & ACC_NATIVE) {
554 /* FIXME The linenumbertable_linenumber_for_pc could change
555 the methodinfo pointer when hitting an inlined method. */
557 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
558 linenumber = (linenumber == 0) ? -1 : linenumber;
561 /* get declaring class name */
563 declaringclass = class_get_classname(c);
565 /* fill the java.lang.StackTraceElement element */
567 /* FIXME critical section */
569 steo->declaringClass = (java_lang_String*) declaringclass;
570 steo->methodName = (java_lang_String*) javastring_new(m->name);
571 steo->fileName = filename;
572 steo->lineNumber = linenumber;
574 return (jobject) steo;
580 jint JVM_IHashCode(JNIEnv* env, jobject handle)
582 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
584 return (jint) ((ptrint) handle);
588 /* JVM_MonitorWait */
590 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
592 #if defined(ENABLE_THREADS)
596 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
598 /* exceptions_throw_illegalargumentexception("argument out of range"); */
599 exceptions_throw_illegalargumentexception();
603 #if defined(ENABLE_THREADS)
604 o = (java_handle_t *) handle;
606 lock_wait_for_object(o, ms, 0);
611 /* JVM_MonitorNotify */
613 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
615 #if defined(ENABLE_THREADS)
619 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
621 #if defined(ENABLE_THREADS)
622 o = (java_handle_t *) handle;
624 lock_notify_object(o);
629 /* JVM_MonitorNotifyAll */
631 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
633 #if defined(ENABLE_THREADS)
637 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
639 #if defined(ENABLE_THREADS)
640 o = (java_handle_t *) handle;
642 lock_notify_all_object(o);
649 jobject JVM_Clone(JNIEnv* env, jobject handle)
651 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
653 return (jobject) builtin_clone(env, (java_handle_t *) handle);
657 /* JVM_InitializeCompiler */
659 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
661 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
665 /* JVM_IsSilentCompiler */
667 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
669 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
675 /* JVM_CompileClass */
677 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
679 log_println("JVM_CompileClass: IMPLEMENT ME!");
685 /* JVM_CompileClasses */
687 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
689 log_println("JVM_CompileClasses: IMPLEMENT ME!");
695 /* JVM_CompilerCommand */
697 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
699 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
705 /* JVM_EnableCompiler */
707 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
709 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
710 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
714 /* JVM_DisableCompiler */
716 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
718 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
719 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
723 /* JVM_GetLastErrorString */
725 jint JVM_GetLastErrorString(char *buf, int len)
727 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
729 return hpi_system->GetLastErrorString(buf, len);
735 char *JVM_NativePath(char *path)
737 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
739 return hpi_file->NativePath(path);
743 /* JVM_GetCallerClass */
745 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
749 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
751 c = stacktrace_get_caller_class(depth);
757 /* JVM_FindPrimitiveClass */
759 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
764 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
767 c = Primitive::get_class_by_name(u);
769 return (jclass) LLNI_classinfo_wrap(c);
773 /* JVM_ResolveClass */
775 void JVM_ResolveClass(JNIEnv* env, jclass cls)
777 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
778 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
782 /* JVM_FindClassFromClassLoader */
784 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
790 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
792 /* As of now, OpenJDK does not call this function with throwError
795 assert(throwError == false);
797 u = utf_new_char(name);
798 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
800 c = load_class_from_classloader(u, cl);
806 if (!(c->state & CLASS_INITIALIZED))
807 if (!initialize_class(c))
810 return (jclass) LLNI_classinfo_wrap(c);
814 /* JVM_FindClassFromClass */
816 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
818 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
824 /* JVM_DefineClass */
826 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
828 log_println("JVM_DefineClass: IMPLEMENT ME!");
834 /* JVM_DefineClassWithSource */
836 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
842 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
845 u = utf_new_char(name);
849 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
851 /* XXX do something with source */
853 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
855 return (jclass) LLNI_classinfo_wrap(c);
859 /* JVM_FindLoadedClass */
861 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
867 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
869 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
871 u = javastring_toutf((java_handle_t *) name, true);
872 c = classcache_lookup(cl, u);
874 return (jclass) LLNI_classinfo_wrap(c);
878 /* JVM_GetClassName */
880 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
884 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
886 c = LLNI_classinfo_unwrap(cls);
888 return (jstring) class_get_classname(c);
892 /* JVM_GetClassInterfaces */
894 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
897 java_handle_objectarray_t *oa;
899 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
901 c = LLNI_classinfo_unwrap(cls);
903 oa = class_get_interfaces(c);
905 return (jobjectArray) oa;
909 /* JVM_GetClassLoader */
911 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
916 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
918 c = LLNI_classinfo_unwrap(cls);
919 cl = class_get_classloader(c);
921 TRACEJVMCALLSEXIT(("->%p", cl));
927 /* JVM_IsInterface */
929 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
933 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
935 c = LLNI_classinfo_unwrap(cls);
937 return class_is_interface(c);
941 /* JVM_GetClassSigners */
943 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
945 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
951 /* JVM_SetClassSigners */
953 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
956 java_handle_objectarray_t *hoa;
958 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
960 c = LLNI_classinfo_unwrap(cls);
962 hoa = (java_handle_objectarray_t *) signers;
964 /* This call is ignored for primitive types and arrays. Signers
965 are only set once, ClassLoader.java, and thus shouldn't be
966 called with an array. Only the bootstrap loader creates
969 if (class_is_primitive(c) || class_is_array(c))
972 LLNI_classinfo_field_set(c, signers, hoa);
976 /* JVM_GetProtectionDomain */
978 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
982 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
984 c = LLNI_classinfo_unwrap(cls);
987 exceptions_throw_nullpointerexception();
991 /* Primitive types do not have a protection domain. */
993 if (class_is_primitive(c))
996 return (jobject) c->protectiondomain;
1000 /* JVM_SetProtectionDomain */
1002 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
1004 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
1008 /* JVM_DoPrivileged */
1010 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
1015 java_handle_t *result;
1018 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
1020 h = (java_handle_t *) action;
1021 LLNI_class_get(h, c);
1023 if (action == NULL) {
1024 exceptions_throw_nullpointerexception();
1028 /* lookup run() method (throw no exceptions) */
1030 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1033 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1034 exceptions_throw_internalerror("No run method");
1038 /* XXX It seems something with a privileged stack needs to be done
1041 result = vm_call_method(m, h);
1043 e = exceptions_get_exception();
1046 if ( builtin_instanceof(e, class_java_lang_Exception) &&
1047 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
1048 exceptions_clear_exception();
1049 exceptions_throw_privilegedactionexception(e);
1055 return (jobject) result;
1059 /* JVM_GetInheritedAccessControlContext */
1061 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1063 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1069 /* JVM_GetStackAccessControlContext */
1071 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1073 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
1075 /* XXX All stuff I tested so far works without that function. At
1076 some point we have to implement it, but I disable the output
1077 for now to make IcedTea happy. */
1083 /* JVM_IsArrayClass */
1085 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1089 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1091 c = LLNI_classinfo_unwrap(cls);
1093 return class_is_array(c);
1097 /* JVM_IsPrimitiveClass */
1099 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1103 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1105 c = LLNI_classinfo_unwrap(cls);
1107 return class_is_primitive(c);
1111 /* JVM_GetComponentType */
1113 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1115 classinfo *component;
1118 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1120 c = LLNI_classinfo_unwrap(cls);
1122 component = class_get_componenttype(c);
1124 return (jclass) LLNI_classinfo_wrap(component);
1128 /* JVM_GetClassModifiers */
1130 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1135 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1137 c = LLNI_classinfo_unwrap(cls);
1139 flags = class_get_modifiers(c, false);
1145 /* JVM_GetDeclaredClasses */
1147 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1150 java_handle_objectarray_t *oa;
1152 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1154 c = LLNI_classinfo_unwrap(ofClass);
1156 oa = class_get_declaredclasses(c, false);
1158 return (jobjectArray) oa;
1162 /* JVM_GetDeclaringClass */
1164 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1169 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1171 c = LLNI_classinfo_unwrap(ofClass);
1173 dc = class_get_declaringclass(c);
1175 return (jclass) LLNI_classinfo_wrap(dc);
1179 /* JVM_GetClassSignature */
1181 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1187 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1189 c = LLNI_classinfo_unwrap(cls);
1191 /* Get the signature of the class. */
1193 u = class_get_signature(c);
1198 /* Convert UTF-string to a Java-string. */
1200 s = javastring_new(u);
1206 /* JVM_GetClassAnnotations */
1208 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1210 classinfo *c = NULL; /* classinfo for 'cls' */
1211 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1213 TRACEJVMCALLS(("JVM_GetClassAnnotations: cls=%p", cls));
1216 exceptions_throw_nullpointerexception();
1220 c = LLNI_classinfo_unwrap(cls);
1222 /* get annotations: */
1223 annotations = class_get_annotations(c);
1225 return (jbyteArray)annotations;
1229 /* JVM_GetFieldAnnotations */
1231 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1233 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1234 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1236 TRACEJVMCALLS(("JVM_GetFieldAnnotations: field=%p", field));
1238 if (field == NULL) {
1239 exceptions_throw_nullpointerexception();
1243 rf = (java_lang_reflect_Field*)field;
1245 LLNI_field_get_ref(rf, annotations, ba);
1247 return (jbyteArray)ba;
1251 /* JVM_GetMethodAnnotations */
1253 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1255 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1256 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1258 TRACEJVMCALLS(("JVM_GetMethodAnnotations: method=%p", method));
1260 if (method == NULL) {
1261 exceptions_throw_nullpointerexception();
1265 rm = (java_lang_reflect_Method*)method;
1267 LLNI_field_get_ref(rm, annotations, ba);
1269 return (jbyteArray)ba;
1273 /* JVM_GetMethodDefaultAnnotationValue */
1275 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1277 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1278 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1280 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue: method=%p", method));
1282 if (method == NULL) {
1283 exceptions_throw_nullpointerexception();
1287 rm = (java_lang_reflect_Method*)method;
1289 LLNI_field_get_ref(rm, annotationDefault, ba);
1291 return (jbyteArray)ba;
1295 /* JVM_GetMethodParameterAnnotations */
1297 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1299 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1300 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1302 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations: method=%p", method));
1304 if (method == NULL) {
1305 exceptions_throw_nullpointerexception();
1309 rm = (java_lang_reflect_Method*)method;
1311 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1313 return (jbyteArray)ba;
1317 /* JVM_GetClassDeclaredFields */
1319 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1322 java_handle_objectarray_t *oa;
1324 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1326 c = LLNI_classinfo_unwrap(ofClass);
1328 oa = class_get_declaredfields(c, publicOnly);
1330 return (jobjectArray) oa;
1334 /* JVM_GetClassDeclaredMethods */
1336 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1339 java_handle_objectarray_t *oa;
1341 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1343 c = LLNI_classinfo_unwrap(ofClass);
1345 oa = class_get_declaredmethods(c, publicOnly);
1347 return (jobjectArray) oa;
1351 /* JVM_GetClassDeclaredConstructors */
1353 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1356 java_handle_objectarray_t *oa;
1358 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1360 c = LLNI_classinfo_unwrap(ofClass);
1362 oa = class_get_declaredconstructors(c, publicOnly);
1364 return (jobjectArray) oa;
1368 /* JVM_GetClassAccessFlags */
1370 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1374 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1376 c = LLNI_classinfo_unwrap(cls);
1378 /* Primitive type classes have the correct access flags. */
1380 return c->flags & ACC_CLASS_REFLECT_MASK;
1384 /* JVM_GetClassConstantPool */
1386 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1388 #if defined(ENABLE_ANNOTATIONS)
1389 sun_reflect_ConstantPool *constantPool = NULL;
1390 /* constant pool object for the class refered by 'cls' */
1391 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1392 /* constantPoolOop field of the constant pool object */
1394 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1397 (sun_reflect_ConstantPool*)native_new_and_init(
1398 class_sun_reflect_ConstantPool);
1400 if (constantPool == NULL) {
1405 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1407 return (jobject)constantPool;
1409 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1415 /* JVM_ConstantPoolGetSize */
1417 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1419 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1421 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1423 c = LLNI_classinfo_unwrap(jcpool);
1429 /* JVM_ConstantPoolGetClassAt */
1431 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1433 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1434 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1435 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1437 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1439 c = LLNI_classinfo_unwrap(jcpool);
1441 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1444 exceptions_throw_illegalargumentexception();
1448 result = resolve_classref_eager(ref);
1450 return (jclass) LLNI_classinfo_wrap(result);
1454 /* JVM_ConstantPoolGetClassAtIfLoaded */
1456 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1458 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1459 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1460 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1462 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1464 c = LLNI_classinfo_unwrap(jcpool);
1466 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1469 exceptions_throw_illegalargumentexception();
1473 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1477 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1481 return (jclass) LLNI_classinfo_wrap(result);
1485 /* JVM_ConstantPoolGetMethodAt */
1487 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1489 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1490 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1492 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1494 cls = LLNI_classinfo_unwrap(jcpool);
1495 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1498 exceptions_throw_illegalargumentexception();
1502 /* XXX: is that right? or do I have to use resolve_method_*? */
1503 return (jobject)reflect_method_new(ref->p.method);
1507 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1509 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1511 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1512 classinfo *c = NULL; /* resolved declaring class of the method */
1513 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1515 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1517 cls = LLNI_classinfo_unwrap(jcpool);
1518 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1521 exceptions_throw_illegalargumentexception();
1525 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1529 if (c == NULL || !(c->state & CLASS_LOADED)) {
1533 return (jobject)reflect_method_new(ref->p.method);
1537 /* JVM_ConstantPoolGetFieldAt */
1539 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1541 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1542 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1544 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1546 cls = LLNI_classinfo_unwrap(jcpool);
1547 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1550 exceptions_throw_illegalargumentexception();
1554 return (jobject)reflect_field_new(ref->p.field);
1558 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1560 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1562 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1563 classinfo *c; /* resolved declaring class for the field */
1564 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1566 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1568 cls = LLNI_classinfo_unwrap(jcpool);
1569 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1572 exceptions_throw_illegalargumentexception();
1576 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1580 if (c == NULL || !(c->state & CLASS_LOADED)) {
1584 return (jobject)reflect_field_new(ref->p.field);
1588 /* JVM_ConstantPoolGetMemberRefInfoAt */
1590 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1592 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1594 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1600 /* JVM_ConstantPoolGetIntAt */
1602 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1604 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1605 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1607 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1609 cls = LLNI_classinfo_unwrap(jcpool);
1610 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1613 exceptions_throw_illegalargumentexception();
1621 /* JVM_ConstantPoolGetLongAt */
1623 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1625 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1626 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1628 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1630 cls = LLNI_classinfo_unwrap(jcpool);
1631 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1634 exceptions_throw_illegalargumentexception();
1642 /* JVM_ConstantPoolGetFloatAt */
1644 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1646 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1647 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1649 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1651 cls = LLNI_classinfo_unwrap(jcpool);
1652 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1655 exceptions_throw_illegalargumentexception();
1663 /* JVM_ConstantPoolGetDoubleAt */
1665 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1667 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1668 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1670 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1672 cls = LLNI_classinfo_unwrap(jcpool);
1673 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1676 exceptions_throw_illegalargumentexception();
1684 /* JVM_ConstantPoolGetStringAt */
1686 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1688 utf *ref; /* utf object for the string in constant pool at index 'index' */
1689 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1691 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1693 cls = LLNI_classinfo_unwrap(jcpool);
1694 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1697 exceptions_throw_illegalargumentexception();
1701 /* XXX: I hope literalstring_new is the right Function. */
1702 return (jstring)literalstring_new(ref);
1706 /* JVM_ConstantPoolGetUTF8At */
1708 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1710 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1711 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1713 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1715 cls = LLNI_classinfo_unwrap(jcpool);
1716 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1719 exceptions_throw_illegalargumentexception();
1723 /* XXX: I hope literalstring_new is the right Function. */
1724 return (jstring)literalstring_new(ref);
1728 /* JVM_DesiredAssertionStatus */
1730 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1732 #if defined(ENABLE_ASSERTION)
1733 assertion_name_t *item;
1738 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1740 c = LLNI_classinfo_unwrap(cls);
1742 if (c->classloader == NULL) {
1743 status = (jboolean)assertion_system_enabled;
1746 status = (jboolean)assertion_user_enabled;
1749 if (list_assertion_names != NULL) {
1750 item = (assertion_name_t *)list_first(list_assertion_names);
1751 while (item != NULL) {
1752 name = utf_new_char(item->name);
1753 if (name == c->packagename) {
1754 status = (jboolean)item->enabled;
1756 else if (name == c->name) {
1757 status = (jboolean)item->enabled;
1760 item = (assertion_name_t *)list_next(list_assertion_names, item);
1766 return (jboolean)false;
1771 /* JVM_AssertionStatusDirectives */
1773 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1776 java_lang_AssertionStatusDirectives *o;
1777 java_handle_objectarray_t *classes;
1778 java_handle_objectarray_t *packages;
1779 java_booleanarray_t *classEnabled;
1780 java_booleanarray_t *packageEnabled;
1781 #if defined(ENABLE_ASSERTION)
1782 assertion_name_t *item;
1787 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1789 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1794 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1799 #if defined(ENABLE_ASSERTION)
1800 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1802 classes = builtin_anewarray(0, class_java_lang_Object);
1804 if (classes == NULL)
1807 #if defined(ENABLE_ASSERTION)
1808 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1810 packages = builtin_anewarray(0, class_java_lang_Object);
1812 if (packages == NULL)
1815 #if defined(ENABLE_ASSERTION)
1816 classEnabled = builtin_newarray_boolean(assertion_class_count);
1818 classEnabled = builtin_newarray_boolean(0);
1820 if (classEnabled == NULL)
1823 #if defined(ENABLE_ASSERTION)
1824 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1826 packageEnabled = builtin_newarray_boolean(0);
1828 if (packageEnabled == NULL)
1831 #if defined(ENABLE_ASSERTION)
1832 /* initialize arrays */
1834 if (list_assertion_names != NULL) {
1838 item = (assertion_name_t *)list_first(list_assertion_names);
1839 while (item != NULL) {
1840 js = javastring_new_from_ascii(item->name);
1845 if (item->package == false) {
1846 classes->data[i] = js;
1847 classEnabled->data[i] = (jboolean) item->enabled;
1851 packages->data[j] = js;
1852 packageEnabled->data[j] = (jboolean) item->enabled;
1856 item = (assertion_name_t *)list_next(list_assertion_names, item);
1861 /* set instance fields */
1863 o->classes = classes;
1864 o->packages = packages;
1865 o->classEnabled = classEnabled;
1866 o->packageEnabled = packageEnabled;
1872 /* JVM_GetClassNameUTF */
1874 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1876 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1882 /* JVM_GetClassCPTypes */
1884 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1886 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1890 /* JVM_GetClassCPEntriesCount */
1892 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1894 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1900 /* JVM_GetClassFieldsCount */
1902 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1904 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1910 /* JVM_GetClassMethodsCount */
1912 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1914 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1920 /* JVM_GetMethodIxExceptionIndexes */
1922 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1924 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1928 /* JVM_GetMethodIxExceptionsCount */
1930 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1932 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1938 /* JVM_GetMethodIxByteCode */
1940 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1942 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1946 /* JVM_GetMethodIxByteCodeLength */
1948 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1950 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1956 /* JVM_GetMethodIxExceptionTableEntry */
1958 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1960 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1964 /* JVM_GetMethodIxExceptionTableLength */
1966 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1968 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1974 /* JVM_GetMethodIxModifiers */
1976 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1978 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1984 /* JVM_GetFieldIxModifiers */
1986 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1988 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1994 /* JVM_GetMethodIxLocalsCount */
1996 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1998 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
2004 /* JVM_GetMethodIxArgsSize */
2006 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
2008 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
2014 /* JVM_GetMethodIxMaxStack */
2016 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
2018 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
2024 /* JVM_IsConstructorIx */
2026 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
2028 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
2034 /* JVM_GetMethodIxNameUTF */
2036 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
2038 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
2044 /* JVM_GetMethodIxSignatureUTF */
2046 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
2048 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
2054 /* JVM_GetCPFieldNameUTF */
2056 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2058 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
2064 /* JVM_GetCPMethodNameUTF */
2066 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2068 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
2074 /* JVM_GetCPMethodSignatureUTF */
2076 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2078 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
2084 /* JVM_GetCPFieldSignatureUTF */
2086 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2088 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2094 /* JVM_GetCPClassNameUTF */
2096 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2098 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2104 /* JVM_GetCPFieldClassNameUTF */
2106 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2108 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2114 /* JVM_GetCPMethodClassNameUTF */
2116 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2118 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2124 /* JVM_GetCPFieldModifiers */
2126 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2128 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2134 /* JVM_GetCPMethodModifiers */
2136 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2138 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2144 /* JVM_ReleaseUTF */
2146 void JVM_ReleaseUTF(const char *utf)
2148 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2152 /* JVM_IsSameClassPackage */
2154 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2156 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2164 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2167 * JVM I/O error codes
2169 #define JVM_EEXIST -100
2171 jint JVM_Open(const char *fname, jint flags, jint mode)
2175 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2177 result = hpi_file->Open(fname, flags, mode);
2195 jint JVM_Close(jint fd)
2197 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2199 return hpi_file->Close(fd);
2205 jint JVM_Read(jint fd, char *buf, jint nbytes)
2207 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2209 return (jint) hpi_file->Read(fd, buf, nbytes);
2215 jint JVM_Write(jint fd, char *buf, jint nbytes)
2217 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2219 return (jint) hpi_file->Write(fd, buf, nbytes);
2225 jint JVM_Available(jint fd, jlong *pbytes)
2227 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2229 return hpi_file->Available(fd, pbytes);
2235 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2237 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2239 return hpi_file->Seek(fd, (off_t) offset, whence);
2245 jint JVM_SetLength(jint fd, jlong length)
2247 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2249 return hpi_file->SetLength(fd, length);
2255 jint JVM_Sync(jint fd)
2257 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2259 return hpi_file->Sync(fd);
2263 /* JVM_StartThread */
2265 void JVM_StartThread(JNIEnv* env, jobject jthread)
2267 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2269 threads_thread_start((java_handle_t *) jthread);
2273 /* JVM_StopThread */
2275 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2277 log_println("JVM_StopThread: Deprecated. Not implemented.");
2281 /* JVM_IsThreadAlive */
2283 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2289 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2291 h = (java_handle_t *) jthread;
2292 t = thread_get_thread(h);
2294 /* The threadobject is null when a thread is created in Java. The
2295 priority is set later during startup. */
2300 result = threads_thread_is_alive(t);
2306 /* JVM_SuspendThread */
2308 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2310 log_println("JVM_SuspendThread: Deprecated. Not implemented.");
2314 /* JVM_ResumeThread */
2316 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2318 log_println("JVM_ResumeThread: Deprecated. Not implemented.");
2322 /* JVM_SetThreadPriority */
2324 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2329 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2331 h = (java_handle_t *) jthread;
2332 t = thread_get_thread(h);
2334 /* The threadobject is null when a thread is created in Java. The
2335 priority is set later during startup. */
2340 threads_set_thread_priority(t->tid, prio);
2346 void JVM_Yield(JNIEnv *env, jclass threadClass)
2348 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2356 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2358 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2360 threads_sleep(millis, 0);
2364 /* JVM_CurrentThread */
2366 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2370 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2372 o = thread_get_current_object();
2378 /* JVM_CountStackFrames */
2380 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2382 log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2390 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2395 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2397 h = (java_handle_t *) jthread;
2398 t = thread_get_thread(h);
2403 threads_thread_interrupt(t);
2407 /* JVM_IsInterrupted */
2409 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2413 jboolean interrupted;
2415 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2417 h = (java_handle_t *) jthread;
2418 t = thread_get_thread(h);
2420 interrupted = thread_is_interrupted(t);
2422 if (interrupted && clear_interrupted)
2423 thread_set_interrupted(t, false);
2431 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2436 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2438 h = (java_handle_t *) obj;
2441 exceptions_throw_nullpointerexception();
2445 result = lock_is_held_by_current_thread(h);
2451 /* JVM_DumpAllStacks */
2453 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2455 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2459 /* JVM_CurrentLoadedClass */
2461 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2463 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2469 /* JVM_CurrentClassLoader */
2471 jobject JVM_CurrentClassLoader(JNIEnv *env)
2473 /* XXX if a method in a class in a trusted loader is in a
2474 doPrivileged, return NULL */
2476 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2482 /* JVM_GetClassContext */
2484 jobjectArray JVM_GetClassContext(JNIEnv *env)
2486 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2488 return (jobjectArray) stacktrace_getClassContext();
2492 /* JVM_ClassDepth */
2494 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2496 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2502 /* JVM_ClassLoaderDepth */
2504 jint JVM_ClassLoaderDepth(JNIEnv *env)
2506 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2512 /* JVM_GetSystemPackage */
2514 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2520 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2522 /* s = Package::find(name); */
2523 u = javastring_toutf((java_handle_t *) name, false);
2525 result = Package::find(u);
2528 s = javastring_new(result);
2536 /* JVM_GetSystemPackages */
2538 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2540 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2546 /* JVM_AllocateNewObject */
2548 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2550 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2556 /* JVM_AllocateNewArray */
2558 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2560 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2566 /* JVM_LatestUserDefinedLoader */
2568 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2572 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2574 cl = stacktrace_first_nonnull_classloader();
2576 return (jobject) cl;
2580 /* JVM_LoadClass0 */
2582 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2584 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2590 /* JVM_GetArrayLength */
2592 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2596 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2598 a = (java_handle_t *) arr;
2600 return array_length_get(a);
2604 /* JVM_GetArrayElement */
2606 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2611 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2613 a = (java_handle_t *) arr;
2615 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2616 /* exceptions_throw_illegalargumentexception(); */
2620 o = array_element_get(a, index);
2626 /* JVM_GetPrimitiveArrayElement */
2628 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2632 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2640 /* JVM_SetArrayElement */
2642 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2645 java_handle_t *value;
2647 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2649 a = (java_handle_t *) arr;
2650 value = (java_handle_t *) val;
2652 array_element_set(a, index, value);
2656 /* JVM_SetPrimitiveArrayElement */
2658 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2660 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2666 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2671 java_handle_objectarray_t *oa;
2673 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2675 if (eltClass == NULL) {
2676 exceptions_throw_nullpointerexception();
2680 /* NegativeArraySizeException is checked in builtin_newarray. */
2682 c = LLNI_classinfo_unwrap(eltClass);
2684 /* Create primitive or object array. */
2686 if (class_is_primitive(c)) {
2687 pc = Primitive::get_arrayclass_by_name(c->name);
2689 /* void arrays are not allowed. */
2692 exceptions_throw_illegalargumentexception();
2696 a = builtin_newarray(length, pc);
2701 oa = builtin_anewarray(length, c);
2703 return (jobject) oa;
2708 /* JVM_NewMultiArray */
2710 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2713 java_handle_intarray_t *ia;
2719 java_handle_objectarray_t *a;
2721 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2723 if (eltClass == NULL) {
2724 exceptions_throw_nullpointerexception();
2728 /* NegativeArraySizeException is checked in builtin_newarray. */
2730 c = LLNI_classinfo_unwrap(eltClass);
2732 ia = (java_handle_intarray_t *) dim;
2734 length = array_length_get((java_handle_t *) ia);
2736 /* We check here for exceptions thrown in array_length_get,
2737 otherwise these exceptions get overwritten by the following
2738 IllegalArgumentException. */
2743 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2744 exceptions_throw_illegalargumentexception();
2748 /* XXX This is just a quick hack to get it working. */
2750 dims = MNEW(long, length);
2752 for (i = 0; i < length; i++) {
2753 value = LLNI_array_direct(ia, i);
2754 dims[i] = (long) value;
2757 /* Create an array-class if necessary. */
2759 if (class_is_primitive(c))
2760 ac = Primitive::get_arrayclass_by_name(c->name);
2762 ac = class_array_of(c, true);
2767 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2773 /* JVM_InitializeSocketLibrary */
2775 jint JVM_InitializeSocketLibrary()
2777 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2779 return hpi_initialize_socket_library();
2785 jint JVM_Socket(jint domain, jint type, jint protocol)
2787 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2789 return os::socket(domain, type, protocol);
2793 /* JVM_SocketClose */
2795 jint JVM_SocketClose(jint fd)
2797 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2799 return os::close(fd);
2803 /* JVM_SocketShutdown */
2805 jint JVM_SocketShutdown(jint fd, jint howto)
2807 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2809 return os::shutdown(fd, howto);
2815 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2817 log_println("JVM_Recv: IMPLEMENT ME!");
2825 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2827 log_println("JVM_Send: IMPLEMENT ME!");
2835 jint JVM_Timeout(int fd, long timeout)
2837 log_println("JVM_Timeout: IMPLEMENT ME!");
2845 jint JVM_Listen(jint fd, jint count)
2847 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2849 return os::listen(fd, count);
2855 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2857 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2859 return os::connect(fd, him, len);
2865 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2867 log_println("JVM_Bind: IMPLEMENT ME!");
2875 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2877 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2879 return os::accept(fd, him, (socklen_t *) len);
2885 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2887 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2893 /* JVM_GetSockName */
2895 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2897 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2899 return os::getsockname(fd, him, (socklen_t *) len);
2905 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2907 log_println("JVM_SendTo: IMPLEMENT ME!");
2913 /* JVM_SocketAvailable */
2915 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2917 #if defined(FIONREAD)
2921 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2925 result = ioctl(fd, FIONREAD, &bytes);
2934 # error FIONREAD not defined
2939 /* JVM_GetSockOpt */
2941 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2943 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2945 return os::getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2949 /* JVM_SetSockOpt */
2951 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2953 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2955 return os::setsockopt(fd, level, optname, optval, optlen);
2959 /* JVM_GetHostName */
2961 int JVM_GetHostName(char *name, int namelen)
2965 TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2967 result = os::gethostname(name, namelen);
2969 TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
2975 /* JVM_GetHostByAddr */
2977 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2979 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2985 /* JVM_GetHostByName */
2987 struct hostent *JVM_GetHostByName(char* name)
2989 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2995 /* JVM_GetProtoByName */
2997 struct protoent *JVM_GetProtoByName(char* name)
2999 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
3005 /* JVM_LoadLibrary */
3007 void *JVM_LoadLibrary(const char *name)
3012 TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
3014 u = utf_new_char(name);
3016 handle = native_library_open(u);
3018 TRACEJVMCALLSEXIT(("->%p", handle));
3024 /* JVM_UnloadLibrary */
3026 void JVM_UnloadLibrary(void* handle)
3028 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
3030 native_library_close(handle);
3034 /* JVM_FindLibraryEntry */
3036 void *JVM_FindLibraryEntry(void *handle, const char *name)
3040 TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
3042 symbol = hpi_library->FindLibraryEntry(handle, name);
3044 TRACEJVMCALLSEXIT(("->%p", symbol));
3052 jboolean JVM_IsNaN(jdouble a)
3054 log_println("JVM_IsNaN: IMPLEMENT ME!");
3060 /* JVM_IsSupportedJNIVersion */
3062 jboolean JVM_IsSupportedJNIVersion(jint version)
3064 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
3066 return jni_version_check(version);
3070 /* JVM_InternString */
3072 jstring JVM_InternString(JNIEnv *env, jstring str)
3074 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
3076 return (jstring) javastring_intern((java_handle_t *) str);
3080 /* JVM_RawMonitorCreate */
3082 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3086 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3088 o = NEW(java_object_t);
3090 lock_init_object_lock(o);
3096 /* JVM_RawMonitorDestroy */
3098 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3100 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3102 FREE(mon, java_object_t);
3106 /* JVM_RawMonitorEnter */
3108 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3110 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3112 (void) lock_monitor_enter((java_object_t *) mon);
3118 /* JVM_RawMonitorExit */
3120 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3122 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3124 (void) lock_monitor_exit((java_object_t *) mon);
3128 /* JVM_SetPrimitiveFieldValues */
3130 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3132 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3136 /* JVM_GetPrimitiveFieldValues */
3138 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3140 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3144 /* JVM_AccessVMBooleanFlag */
3146 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3148 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3154 /* JVM_AccessVMIntFlag */
3156 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3158 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3164 /* JVM_VMBreakPoint */
3166 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3168 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3172 /* JVM_GetClassFields */
3174 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3176 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3182 /* JVM_GetClassMethods */
3184 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3186 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3192 /* JVM_GetClassConstructors */
3194 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3196 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3202 /* JVM_GetClassField */
3204 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3206 log_println("JVM_GetClassField: IMPLEMENT ME!");
3212 /* JVM_GetClassMethod */
3214 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3216 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3222 /* JVM_GetClassConstructor */
3224 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3226 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3232 /* JVM_NewInstance */
3234 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3236 log_println("JVM_NewInstance: IMPLEMENT ME!");
3244 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3246 log_println("JVM_GetField: IMPLEMENT ME!");
3252 /* JVM_GetPrimitiveField */
3254 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3258 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3268 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3270 log_println("JVM_SetField: IMPLEMENT ME!");
3274 /* JVM_SetPrimitiveField */
3276 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3278 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3282 /* JVM_InvokeMethod */
3284 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3286 java_lang_reflect_Method *rm;
3293 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3295 rm = (java_lang_reflect_Method *) method;
3297 LLNI_field_get_cls(rm, clazz, c);
3298 LLNI_field_get_val(rm, slot, slot);
3299 LLNI_field_get_val(rm, override, override);
3301 m = &(c->methods[slot]);
3303 ro = reflect_method_invoke(m, (java_handle_t *) obj, (java_handle_objectarray_t *) args0, override);
3305 return (jobject) ro;
3309 /* JVM_NewInstanceFromConstructor */
3311 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3313 java_lang_reflect_Constructor *rc;
3320 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3322 rc = (java_lang_reflect_Constructor *) con;
3324 LLNI_field_get_cls(rc, clazz, c);
3325 LLNI_field_get_val(rc, slot, slot);
3326 LLNI_field_get_val(rc, override, override);
3328 m = &(c->methods[slot]);
3330 o = reflect_constructor_newinstance(m, (java_handle_objectarray_t *) args0, override);
3336 /* JVM_SupportsCX8 */
3338 jboolean JVM_SupportsCX8()
3340 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3350 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3352 log_println("JVM_CX8Field: IMPLEMENT ME!");
3358 /* JVM_GetAllThreads */
3360 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3362 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3368 /* JVM_DumpThreads */
3370 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3372 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3378 /* JVM_GetManagement */
3380 void *JVM_GetManagement(jint version)
3382 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3384 /* TODO We current don't support the management interface. */
3390 /* JVM_InitAgentProperties */
3392 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3394 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3400 /* JVM_GetEnclosingMethodInfo */
3402 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3406 java_handle_objectarray_t *oa;
3408 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3410 c = LLNI_classinfo_unwrap(ofClass);
3412 if ((c == NULL) || class_is_primitive(c))
3415 m = class_get_enclosingmethod_raw(c);
3420 oa = builtin_anewarray(3, class_java_lang_Object);
3425 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
3426 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3427 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3429 return (jobjectArray) oa;
3433 /* JVM_GetThreadStateValues */
3435 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3437 java_handle_intarray_t *ia;
3439 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3440 env, javaThreadState));
3442 /* If new thread states are added in future JDK and VM versions,
3443 this should check if the JDK version is compatible with thread
3444 states supported by the VM. Return NULL if not compatible.
3446 This function must map the VM java_lang_Thread::ThreadStatus
3447 to the Java thread state that the JDK supports. */
3449 switch (javaThreadState) {
3450 case THREAD_STATE_NEW:
3451 ia = builtin_newarray_int(1);
3456 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3459 case THREAD_STATE_RUNNABLE:
3460 ia = builtin_newarray_int(1);
3465 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3468 case THREAD_STATE_BLOCKED:
3469 ia = builtin_newarray_int(1);
3474 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3477 case THREAD_STATE_WAITING:
3478 ia = builtin_newarray_int(2);
3483 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3484 /* XXX Implement parked stuff. */
3485 /* array_intarray_element_set(ia, 1, PARKED); */
3488 case THREAD_STATE_TIMED_WAITING:
3489 ia = builtin_newarray_int(3);
3494 /* XXX Not sure about that one. */
3495 /* array_intarray_element_set(ia, 0, SLEEPING); */
3496 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3497 /* XXX Implement parked stuff. */
3498 /* array_intarray_element_set(ia, 2, PARKED); */
3501 case THREAD_STATE_TERMINATED:
3502 ia = builtin_newarray_int(1);
3507 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3511 /* Unknown state - probably incompatible JDK version */
3515 return (jintArray) ia;
3519 /* JVM_GetThreadStateNames */
3521 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3523 java_handle_intarray_t *ia;
3524 java_handle_objectarray_t *oa;
3527 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3528 env, javaThreadState, values));
3530 ia = (java_handle_intarray_t *) values;
3532 /* If new thread states are added in future JDK and VM versions,
3533 this should check if the JDK version is compatible with thread
3534 states supported by the VM. Return NULL if not compatible.
3536 This function must map the VM java_lang_Thread::ThreadStatus
3537 to the Java thread state that the JDK supports. */
3539 if (values == NULL) {
3540 exceptions_throw_nullpointerexception();
3544 switch (javaThreadState) {
3545 case THREAD_STATE_NEW:
3546 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3548 oa = builtin_anewarray(1, class_java_lang_String);
3553 s = javastring_new(utf_new_char("NEW"));
3558 array_objectarray_element_set(oa, 0, s);
3561 case THREAD_STATE_RUNNABLE:
3562 oa = builtin_anewarray(1, class_java_lang_String);
3567 s = javastring_new(utf_new_char("RUNNABLE"));
3572 array_objectarray_element_set(oa, 0, s);
3575 case THREAD_STATE_BLOCKED:
3576 oa = builtin_anewarray(1, class_java_lang_String);
3581 s = javastring_new(utf_new_char("BLOCKED"));
3586 array_objectarray_element_set(oa, 0, s);
3589 case THREAD_STATE_WAITING:
3590 oa = builtin_anewarray(2, class_java_lang_String);
3595 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3596 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3601 array_objectarray_element_set(oa, 0, s);
3602 /* array_objectarray_element_set(oa, 1, s); */
3605 case THREAD_STATE_TIMED_WAITING:
3606 oa = builtin_anewarray(3, class_java_lang_String);
3611 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3612 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3613 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3618 /* array_objectarray_element_set(oa, 0, s); */
3619 array_objectarray_element_set(oa, 0, s);
3620 /* array_objectarray_element_set(oa, 2, s); */
3623 case THREAD_STATE_TERMINATED:
3624 oa = builtin_anewarray(1, class_java_lang_String);
3629 s = javastring_new(utf_new_char("TERMINATED"));
3634 array_objectarray_element_set(oa, 0, s);
3638 /* Unknown state - probably incompatible JDK version */
3642 return (jobjectArray) oa;
3646 /* JVM_GetVersionInfo */
3648 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3650 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3654 /* OS: JVM_RegisterSignal */
3656 void *JVM_RegisterSignal(jint sig, void *handler)
3658 functionptr newHandler;
3660 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3662 if (handler == (void *) 2)
3663 newHandler = (functionptr) signal_thread_handler;
3665 newHandler = (functionptr) (uintptr_t) handler;
3672 /* These signals are already used by the VM. */
3676 /* This signal is used by the VM to dump thread stacks unless
3677 ReduceSignalUsage is set, in which case the user is allowed
3678 to set his own _native_ handler for this signal; thus, in
3679 either case, we do not allow JVM_RegisterSignal to change
3689 signal_register_signal(sig, newHandler, SA_RESTART | SA_SIGINFO);
3691 /* XXX Should return old handler. */
3697 /* OS: JVM_RaiseSignal */
3699 jboolean JVM_RaiseSignal(jint sig)
3701 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3707 /* OS: JVM_FindSignal */
3709 jint JVM_FindSignal(const char *name)
3711 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3713 #if defined(__LINUX__)
3714 if (strcmp(name, "HUP") == 0)
3717 if (strcmp(name, "INT") == 0)
3720 if (strcmp(name, "TERM") == 0)
3723 # error not implemented for this OS
3733 * These are local overrides for various environment variables in Emacs.
3734 * Please do not remove this and leave it at the end of the file, where
3735 * Emacs will automagically detect them.
3736 * ---------------------------------------------------------------------
3739 * indent-tabs-mode: t