1 /* src/native/vm/openjdk/jvm.c - HotSpot JVM interface functions
3 Copyright (C) 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
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.h"
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.h"
82 #include "vm/global.h"
83 #include "vm/initialize.h"
84 #include "vm/package.hpp"
85 #include "vm/primitive.h"
86 #include "vm/properties.h"
87 #include "vm/resolve.h"
88 #include "vm/signallocal.h"
89 #include "vm/stringlocal.h"
92 #include "vm/jit/stacktrace.h"
94 #include "vmcore/classcache.h"
95 #include "vmcore/options.h"
96 #include "vmcore/system.h"
99 /* debugging macros ***********************************************************/
103 # define TRACEJVMCALLS(x) \
105 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
110 # define TRACEJVMCALLSENTER(x) \
112 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
118 # define TRACEJVMCALLSEXIT(x) \
120 if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
126 # define TRACEJVMCALLSVERBOSE(x) \
128 if (opt_TraceJVMCallsVerbose) { \
133 # define PRINTJVMWARNINGS(x)
135 /* if (opt_PrintJVMWarnings) { \ */
136 /* log_println x; \ */
142 # define TRACEJVMCALLS(x)
143 # define TRACEJVMCALLSENTER(x)
144 # define TRACEJVMCALLSEXIT(x)
145 # define TRACEJVMCALLSVERBOSE(x)
146 # define PRINTJVMWARNINGS(x)
152 /* Naming convention of RE build version string: n.n.n[_uu[c]][-<identifier>]-bxx */
153 unsigned int jvm_version; /* Consists of major, minor, micro (n.n.n) */
154 /* and build number (xx) */
155 unsigned int update_version : 8; /* Update release version (uu) */
156 unsigned int special_update_version : 8; /* Special update release version (c) */
157 unsigned int reserved1 : 16;
158 unsigned int reserved2;
160 /* The following bits represents JVM supports that JDK has dependency on.
161 * JDK can use these bits to determine which JVM version
162 * and support it has to maintain runtime compatibility.
164 * When a new bit is added in a minor or update release, make sure
165 * the new bit is also added in the main/baseline.
167 unsigned int is_attachable : 1;
175 * A structure used to a capture exception table entry in a Java method.
182 } JVM_ExceptionTableEntryType;
185 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
187 if ((intptr_t) count <= 0)
190 return vsnprintf(str, count, fmt, args);
194 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
200 len = jio_vsnprintf(str, count, fmt, ap);
207 int jio_fprintf(FILE* f, const char *fmt, ...)
209 log_println("jio_fprintf: IMPLEMENT ME!");
215 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
217 log_println("jio_vfprintf: IMPLEMENT ME!");
223 int jio_printf(const char *fmt, ...)
225 log_println("jio_printf: IMPLEMENT ME!");
231 /* JVM_GetInterfaceVersion */
233 jint JVM_GetInterfaceVersion()
235 /* This is defined in hotspot/src/share/vm/prims/jvm.h */
237 #define JVM_INTERFACE_VERSION 4
239 return JVM_INTERFACE_VERSION;
243 /* JVM_CurrentTimeMillis */
245 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
247 TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
249 return (jlong) builtin_currenttimemillis();
255 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
257 TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
259 return (jlong) builtin_nanotime();
265 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
270 s = (java_handle_t *) src;
271 d = (java_handle_t *) dst;
273 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));
275 builtin_arraycopy(s, src_pos, d, dst_pos, length);
279 /* JVM_InitProperties */
281 jobject JVM_InitProperties(JNIEnv *env, jobject properties)
286 TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
288 h = (java_handle_t *) properties;
290 /* Convert the -XX:MaxDirectMemorySize= command line flag to the
291 sun.nio.MaxDirectMemorySize property. Do this after setting
292 user properties to prevent people from setting the value with a
293 -D option, as requested. */
295 jio_snprintf(buf, sizeof(buf), PRINTF_FORMAT_INT64_T, opt_MaxDirectMemorySize);
296 properties_add("sun.nio.MaxDirectMemorySize", buf);
298 /* Add all properties. */
300 properties_system_add_all(h);
308 void JVM_Exit(jint code)
310 log_println("JVM_Exit: IMPLEMENT ME!");
316 void JVM_Halt(jint code)
318 TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
325 /* JVM_OnExit(void (*func)) */
327 void JVM_OnExit(void (*func)(void))
329 log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
337 TRACEJVMCALLS(("JVM_GC()"));
343 /* JVM_MaxObjectInspectionAge */
345 jlong JVM_MaxObjectInspectionAge(void)
347 log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
353 /* JVM_TraceInstructions */
355 void JVM_TraceInstructions(jboolean on)
357 log_println("JVM_TraceInstructions: IMPLEMENT ME!");
361 /* JVM_TraceMethodCalls */
363 void JVM_TraceMethodCalls(jboolean on)
365 log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
369 /* JVM_TotalMemory */
371 jlong JVM_TotalMemory(void)
373 TRACEJVMCALLS(("JVM_TotalMemory()"));
375 return gc_get_heap_size();
381 jlong JVM_FreeMemory(void)
383 TRACEJVMCALLS(("JVM_FreeMemory()"));
385 return gc_get_free_bytes();
391 jlong JVM_MaxMemory(void)
393 TRACEJVMCALLS(("JVM_MaxMemory()"));
395 return gc_get_max_heap_size();
399 /* JVM_ActiveProcessorCount */
401 jint JVM_ActiveProcessorCount(void)
403 TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
405 return system_processors_online();
409 /* JVM_FillInStackTrace */
411 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
413 java_lang_Throwable *o;
414 java_handle_bytearray_t *ba;
416 TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
418 o = (java_lang_Throwable *) receiver;
420 ba = stacktrace_get_current();
425 LLNI_field_set_ref(o, backtrace, (java_lang_Object *) ba);
429 /* JVM_PrintStackTrace */
431 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
433 log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
437 /* JVM_GetStackTraceDepth */
439 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
441 java_lang_Throwable *to;
443 java_handle_bytearray_t *ba;
447 TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
449 if (throwable == NULL) {
450 exceptions_throw_nullpointerexception();
454 to = (java_lang_Throwable *) throwable;
456 LLNI_field_get_ref(to, backtrace, o);
458 ba = (java_handle_bytearray_t *) o;
463 /* We need a critical section here as the stacktrace structure is
464 mapped onto a Java byte-array. */
468 st = (stacktrace_t *) LLNI_array_data(ba);
478 /* JVM_GetStackTraceElement */
480 jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
482 java_lang_Throwable *to;
484 java_handle_bytearray_t *ba;
486 stacktrace_entry_t *ste;
490 java_lang_StackTraceElement *steo;
491 java_handle_t* declaringclass;
492 java_lang_String *filename;
495 TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
497 to = (java_lang_Throwable *) throwable;
499 LLNI_field_get_ref(to, backtrace, o);
501 ba = (java_handle_bytearray_t *) o;
503 /* FIXME critical section */
505 st = (stacktrace_t *) LLNI_array_data(ba);
507 if ((index < 0) || (index >= st->length)) {
508 /* XXX This should be an IndexOutOfBoundsException (check this
511 exceptions_throw_arrayindexoutofboundsexception();
515 /* Get the stacktrace entry. */
517 ste = &(st->entries[index]);
519 /* Get the codeinfo, methodinfo and classinfo. */
525 /* allocate a new StackTraceElement */
527 steo = (java_lang_StackTraceElement *)
528 builtin_new(class_java_lang_StackTraceElement);
535 if (!(m->flags & ACC_NATIVE)) {
536 if (c->sourcefile != NULL)
537 filename = (java_lang_String *) javastring_new(c->sourcefile);
544 /* get line number */
546 if (m->flags & ACC_NATIVE) {
550 /* FIXME The linenumbertable_linenumber_for_pc could change
551 the methodinfo pointer when hitting an inlined method. */
553 linenumber = linenumbertable_linenumber_for_pc(&m, code, ste->pc);
554 linenumber = (linenumber == 0) ? -1 : linenumber;
557 /* get declaring class name */
559 declaringclass = class_get_classname(c);
561 /* fill the java.lang.StackTraceElement element */
563 /* FIXME critical section */
565 steo->declaringClass = (java_lang_String*) declaringclass;
566 steo->methodName = (java_lang_String*) javastring_new(m->name);
567 steo->fileName = filename;
568 steo->lineNumber = linenumber;
570 return (jobject) steo;
576 jint JVM_IHashCode(JNIEnv* env, jobject handle)
578 TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
580 return (jint) ((ptrint) handle);
584 /* JVM_MonitorWait */
586 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
588 #if defined(ENABLE_THREADS)
592 TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
594 /* exceptions_throw_illegalargumentexception("argument out of range"); */
595 exceptions_throw_illegalargumentexception();
599 #if defined(ENABLE_THREADS)
600 o = (java_handle_t *) handle;
602 lock_wait_for_object(o, ms, 0);
607 /* JVM_MonitorNotify */
609 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
611 #if defined(ENABLE_THREADS)
615 TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
617 #if defined(ENABLE_THREADS)
618 o = (java_handle_t *) handle;
620 lock_notify_object(o);
625 /* JVM_MonitorNotifyAll */
627 void JVM_MonitorNotifyAll(JNIEnv* env, jobject handle)
629 #if defined(ENABLE_THREADS)
633 TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
635 #if defined(ENABLE_THREADS)
636 o = (java_handle_t *) handle;
638 lock_notify_all_object(o);
645 jobject JVM_Clone(JNIEnv* env, jobject handle)
647 TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
649 return (jobject) builtin_clone(env, (java_handle_t *) handle);
653 /* JVM_InitializeCompiler */
655 void JVM_InitializeCompiler (JNIEnv *env, jclass compCls)
657 log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
661 /* JVM_IsSilentCompiler */
663 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
665 log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
671 /* JVM_CompileClass */
673 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
675 log_println("JVM_CompileClass: IMPLEMENT ME!");
681 /* JVM_CompileClasses */
683 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
685 log_println("JVM_CompileClasses: IMPLEMENT ME!");
691 /* JVM_CompilerCommand */
693 jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
695 log_println("JVM_CompilerCommand: IMPLEMENT ME!");
701 /* JVM_EnableCompiler */
703 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
705 TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
706 PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
710 /* JVM_DisableCompiler */
712 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
714 TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
715 PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
719 /* JVM_GetLastErrorString */
721 jint JVM_GetLastErrorString(char *buf, int len)
723 TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
725 return hpi_system->GetLastErrorString(buf, len);
731 char *JVM_NativePath(char *path)
733 TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
735 return hpi_file->NativePath(path);
739 /* JVM_GetCallerClass */
741 jclass JVM_GetCallerClass(JNIEnv* env, int depth)
745 TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
747 c = stacktrace_get_caller_class(depth);
753 /* JVM_FindPrimitiveClass */
755 jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
760 TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
763 c = primitive_class_get_by_name(u);
765 return (jclass) LLNI_classinfo_wrap(c);
769 /* JVM_ResolveClass */
771 void JVM_ResolveClass(JNIEnv* env, jclass cls)
773 TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
774 PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
778 /* JVM_FindClassFromClassLoader */
780 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
786 TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
788 /* As of now, OpenJDK does not call this function with throwError
791 assert(throwError == false);
793 u = utf_new_char(name);
794 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
796 c = load_class_from_classloader(u, cl);
802 if (!(c->state & CLASS_INITIALIZED))
803 if (!initialize_class(c))
806 return (jclass) LLNI_classinfo_wrap(c);
810 /* JVM_FindClassFromClass */
812 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
814 log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
820 /* JVM_DefineClass */
822 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
824 log_println("JVM_DefineClass: IMPLEMENT ME!");
830 /* JVM_DefineClassWithSource */
832 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
838 TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
841 u = utf_new_char(name);
845 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
847 /* XXX do something with source */
849 c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
851 return (jclass) LLNI_classinfo_wrap(c);
855 /* JVM_FindLoadedClass */
857 jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
863 TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
865 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
867 u = javastring_toutf((java_handle_t *) name, true);
868 c = classcache_lookup(cl, u);
870 return (jclass) LLNI_classinfo_wrap(c);
874 /* JVM_GetClassName */
876 jstring JVM_GetClassName(JNIEnv *env, jclass cls)
880 TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
882 c = LLNI_classinfo_unwrap(cls);
884 return (jstring) class_get_classname(c);
888 /* JVM_GetClassInterfaces */
890 jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
893 java_handle_objectarray_t *oa;
895 TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
897 c = LLNI_classinfo_unwrap(cls);
899 oa = class_get_interfaces(c);
901 return (jobjectArray) oa;
905 /* JVM_GetClassLoader */
907 jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
912 TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
914 c = LLNI_classinfo_unwrap(cls);
915 cl = class_get_classloader(c);
917 TRACEJVMCALLSEXIT(("->%p", cl));
923 /* JVM_IsInterface */
925 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
929 TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
931 c = LLNI_classinfo_unwrap(cls);
933 return class_is_interface(c);
937 /* JVM_GetClassSigners */
939 jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
941 log_println("JVM_GetClassSigners: IMPLEMENT ME!");
947 /* JVM_SetClassSigners */
949 void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
952 java_handle_objectarray_t *hoa;
954 TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
956 c = LLNI_classinfo_unwrap(cls);
958 hoa = (java_handle_objectarray_t *) signers;
960 /* This call is ignored for primitive types and arrays. Signers
961 are only set once, ClassLoader.java, and thus shouldn't be
962 called with an array. Only the bootstrap loader creates
965 if (class_is_primitive(c) || class_is_array(c))
968 LLNI_classinfo_field_set(c, signers, hoa);
972 /* JVM_GetProtectionDomain */
974 jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
978 TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
980 c = LLNI_classinfo_unwrap(cls);
983 exceptions_throw_nullpointerexception();
987 /* Primitive types do not have a protection domain. */
989 if (class_is_primitive(c))
992 return (jobject) c->protectiondomain;
996 /* JVM_SetProtectionDomain */
998 void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
1000 log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
1004 /* JVM_DoPrivileged */
1006 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
1011 java_handle_t *result;
1014 TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
1016 h = (java_handle_t *) action;
1017 LLNI_class_get(h, c);
1019 if (action == NULL) {
1020 exceptions_throw_nullpointerexception();
1024 /* lookup run() method (throw no exceptions) */
1026 m = class_resolveclassmethod(c, utf_run, utf_void__java_lang_Object, c,
1029 if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
1030 exceptions_throw_internalerror("No run method");
1034 /* XXX It seems something with a privileged stack needs to be done
1037 result = vm_call_method(m, h);
1039 e = exceptions_get_exception();
1042 if ( builtin_instanceof(e, class_java_lang_Exception) &&
1043 !builtin_instanceof(e, class_java_lang_RuntimeException)) {
1044 exceptions_clear_exception();
1045 exceptions_throw_privilegedactionexception(e);
1051 return (jobject) result;
1055 /* JVM_GetInheritedAccessControlContext */
1057 jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
1059 log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
1065 /* JVM_GetStackAccessControlContext */
1067 jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
1069 TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
1071 /* XXX All stuff I tested so far works without that function. At
1072 some point we have to implement it, but I disable the output
1073 for now to make IcedTea happy. */
1079 /* JVM_IsArrayClass */
1081 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
1085 TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
1087 c = LLNI_classinfo_unwrap(cls);
1089 return class_is_array(c);
1093 /* JVM_IsPrimitiveClass */
1095 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
1099 TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
1101 c = LLNI_classinfo_unwrap(cls);
1103 return class_is_primitive(c);
1107 /* JVM_GetComponentType */
1109 jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
1111 classinfo *component;
1114 TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
1116 c = LLNI_classinfo_unwrap(cls);
1118 component = class_get_componenttype(c);
1120 return (jclass) LLNI_classinfo_wrap(component);
1124 /* JVM_GetClassModifiers */
1126 jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
1131 TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1133 c = LLNI_classinfo_unwrap(cls);
1135 flags = class_get_modifiers(c, false);
1141 /* JVM_GetDeclaredClasses */
1143 jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
1146 java_handle_objectarray_t *oa;
1148 TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1150 c = LLNI_classinfo_unwrap(ofClass);
1152 oa = class_get_declaredclasses(c, false);
1154 return (jobjectArray) oa;
1158 /* JVM_GetDeclaringClass */
1160 jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
1165 TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1167 c = LLNI_classinfo_unwrap(ofClass);
1169 dc = class_get_declaringclass(c);
1171 return (jclass) LLNI_classinfo_wrap(dc);
1175 /* JVM_GetClassSignature */
1177 jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
1183 TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1185 c = LLNI_classinfo_unwrap(cls);
1187 /* Get the signature of the class. */
1189 u = class_get_signature(c);
1194 /* Convert UTF-string to a Java-string. */
1196 s = javastring_new(u);
1202 /* JVM_GetClassAnnotations */
1204 jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
1206 classinfo *c = NULL; /* classinfo for 'cls' */
1207 java_handle_bytearray_t *annotations = NULL; /* unparsed annotations */
1209 TRACEJVMCALLS(("JVM_GetClassAnnotations: cls=%p", cls));
1212 exceptions_throw_nullpointerexception();
1216 c = LLNI_classinfo_unwrap(cls);
1218 /* get annotations: */
1219 annotations = class_get_annotations(c);
1221 return (jbyteArray)annotations;
1225 /* JVM_GetFieldAnnotations */
1227 jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
1229 java_lang_reflect_Field *rf = NULL; /* java.lang.reflect.Field for 'field' */
1230 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1232 TRACEJVMCALLS(("JVM_GetFieldAnnotations: field=%p", field));
1234 if (field == NULL) {
1235 exceptions_throw_nullpointerexception();
1239 rf = (java_lang_reflect_Field*)field;
1241 LLNI_field_get_ref(rf, annotations, ba);
1243 return (jbyteArray)ba;
1247 /* JVM_GetMethodAnnotations */
1249 jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
1251 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1252 java_handle_bytearray_t *ba = NULL; /* unparsed annotations */
1254 TRACEJVMCALLS(("JVM_GetMethodAnnotations: method=%p", method));
1256 if (method == NULL) {
1257 exceptions_throw_nullpointerexception();
1261 rm = (java_lang_reflect_Method*)method;
1263 LLNI_field_get_ref(rm, annotations, ba);
1265 return (jbyteArray)ba;
1269 /* JVM_GetMethodDefaultAnnotationValue */
1271 jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
1273 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1274 java_handle_bytearray_t *ba = NULL; /* unparsed annotation default value */
1276 TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue: method=%p", method));
1278 if (method == NULL) {
1279 exceptions_throw_nullpointerexception();
1283 rm = (java_lang_reflect_Method*)method;
1285 LLNI_field_get_ref(rm, annotationDefault, ba);
1287 return (jbyteArray)ba;
1291 /* JVM_GetMethodParameterAnnotations */
1293 jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
1295 java_lang_reflect_Method *rm = NULL; /* java.lang.reflect.Method for 'method' */
1296 java_handle_bytearray_t *ba = NULL; /* unparsed parameter annotations */
1298 TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations: method=%p", method));
1300 if (method == NULL) {
1301 exceptions_throw_nullpointerexception();
1305 rm = (java_lang_reflect_Method*)method;
1307 LLNI_field_get_ref(rm, parameterAnnotations, ba);
1309 return (jbyteArray)ba;
1313 /* JVM_GetClassDeclaredFields */
1315 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1318 java_handle_objectarray_t *oa;
1320 TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1322 c = LLNI_classinfo_unwrap(ofClass);
1324 oa = class_get_declaredfields(c, publicOnly);
1326 return (jobjectArray) oa;
1330 /* JVM_GetClassDeclaredMethods */
1332 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1335 java_handle_objectarray_t *oa;
1337 TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1339 c = LLNI_classinfo_unwrap(ofClass);
1341 oa = class_get_declaredmethods(c, publicOnly);
1343 return (jobjectArray) oa;
1347 /* JVM_GetClassDeclaredConstructors */
1349 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1352 java_handle_objectarray_t *oa;
1354 TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1356 c = LLNI_classinfo_unwrap(ofClass);
1358 oa = class_get_declaredconstructors(c, publicOnly);
1360 return (jobjectArray) oa;
1364 /* JVM_GetClassAccessFlags */
1366 jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
1370 TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1372 c = LLNI_classinfo_unwrap(cls);
1374 /* Primitive type classes have the correct access flags. */
1376 return c->flags & ACC_CLASS_REFLECT_MASK;
1380 /* JVM_GetClassConstantPool */
1382 jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
1384 #if defined(ENABLE_ANNOTATIONS)
1385 sun_reflect_ConstantPool *constantPool = NULL;
1386 /* constant pool object for the class refered by 'cls' */
1387 java_lang_Object *constantPoolOop = (java_lang_Object*)cls;
1388 /* constantPoolOop field of the constant pool object */
1390 TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1393 (sun_reflect_ConstantPool*)native_new_and_init(
1394 class_sun_reflect_ConstantPool);
1396 if (constantPool == NULL) {
1401 LLNI_field_set_ref(constantPool, constantPoolOop, constantPoolOop);
1403 return (jobject)constantPool;
1405 log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1411 /* JVM_ConstantPoolGetSize */
1413 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1415 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1417 TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1419 c = LLNI_classinfo_unwrap(jcpool);
1425 /* JVM_ConstantPoolGetClassAt */
1427 jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1429 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1430 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1431 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1433 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1435 c = LLNI_classinfo_unwrap(jcpool);
1437 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1440 exceptions_throw_illegalargumentexception();
1444 result = resolve_classref_eager(ref);
1446 return (jclass) LLNI_classinfo_wrap(result);
1450 /* JVM_ConstantPoolGetClassAtIfLoaded */
1452 jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1454 constant_classref *ref; /* classref to the class at constant pool index 'index' */
1455 classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1456 classinfo *result; /* classinfo of the class at constant pool index 'index' */
1458 TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1460 c = LLNI_classinfo_unwrap(jcpool);
1462 ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1465 exceptions_throw_illegalargumentexception();
1469 if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1473 if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1477 return (jclass) LLNI_classinfo_wrap(result);
1481 /* JVM_ConstantPoolGetMethodAt */
1483 jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1485 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1486 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1488 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1490 cls = LLNI_classinfo_unwrap(jcpool);
1491 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1494 exceptions_throw_illegalargumentexception();
1498 /* XXX: is that right? or do I have to use resolve_method_*? */
1499 return (jobject)reflect_method_new(ref->p.method);
1503 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1505 jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1507 constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1508 classinfo *c = NULL; /* resolved declaring class of the method */
1509 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1511 TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1513 cls = LLNI_classinfo_unwrap(jcpool);
1514 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Methodref);
1517 exceptions_throw_illegalargumentexception();
1521 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1525 if (c == NULL || !(c->state & CLASS_LOADED)) {
1529 return (jobject)reflect_method_new(ref->p.method);
1533 /* JVM_ConstantPoolGetFieldAt */
1535 jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1537 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1538 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1540 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1542 cls = LLNI_classinfo_unwrap(jcpool);
1543 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1546 exceptions_throw_illegalargumentexception();
1550 return (jobject)reflect_field_new(ref->p.field);
1554 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1556 jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1558 constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1559 classinfo *c; /* resolved declaring class for the field */
1560 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1562 TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1564 cls = LLNI_classinfo_unwrap(jcpool);
1565 ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
1568 exceptions_throw_illegalargumentexception();
1572 if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1576 if (c == NULL || !(c->state & CLASS_LOADED)) {
1580 return (jobject)reflect_field_new(ref->p.field);
1584 /* JVM_ConstantPoolGetMemberRefInfoAt */
1586 jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1588 log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1590 /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1596 /* JVM_ConstantPoolGetIntAt */
1598 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1600 constant_integer *ref; /* reference to the int value in constant pool at index 'index' */
1601 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1603 TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1605 cls = LLNI_classinfo_unwrap(jcpool);
1606 ref = (constant_integer*)class_getconstant(cls, index, CONSTANT_Integer);
1609 exceptions_throw_illegalargumentexception();
1617 /* JVM_ConstantPoolGetLongAt */
1619 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1621 constant_long *ref; /* reference to the long value in constant pool at index 'index' */
1622 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1624 TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1626 cls = LLNI_classinfo_unwrap(jcpool);
1627 ref = (constant_long*)class_getconstant(cls, index, CONSTANT_Long);
1630 exceptions_throw_illegalargumentexception();
1638 /* JVM_ConstantPoolGetFloatAt */
1640 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1642 constant_float *ref; /* reference to the float value in constant pool at index 'index' */
1643 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1645 TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1647 cls = LLNI_classinfo_unwrap(jcpool);
1648 ref = (constant_float*)class_getconstant(cls, index, CONSTANT_Float);
1651 exceptions_throw_illegalargumentexception();
1659 /* JVM_ConstantPoolGetDoubleAt */
1661 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1663 constant_double *ref; /* reference to the double value in constant pool at index 'index' */
1664 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1666 TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1668 cls = LLNI_classinfo_unwrap(jcpool);
1669 ref = (constant_double*)class_getconstant(cls, index, CONSTANT_Double);
1672 exceptions_throw_illegalargumentexception();
1680 /* JVM_ConstantPoolGetStringAt */
1682 jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1684 utf *ref; /* utf object for the string in constant pool at index 'index' */
1685 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1687 TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1689 cls = LLNI_classinfo_unwrap(jcpool);
1690 ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1693 exceptions_throw_illegalargumentexception();
1697 /* XXX: I hope literalstring_new is the right Function. */
1698 return (jstring)literalstring_new(ref);
1702 /* JVM_ConstantPoolGetUTF8At */
1704 jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1706 utf *ref; /* utf object for the utf8 data in constant pool at index 'index' */
1707 classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1709 TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1711 cls = LLNI_classinfo_unwrap(jcpool);
1712 ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1715 exceptions_throw_illegalargumentexception();
1719 /* XXX: I hope literalstring_new is the right Function. */
1720 return (jstring)literalstring_new(ref);
1724 /* JVM_DesiredAssertionStatus */
1726 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1728 #if defined(ENABLE_ASSERTION)
1729 assertion_name_t *item;
1734 TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1736 c = LLNI_classinfo_unwrap(cls);
1738 if (c->classloader == NULL) {
1739 status = (jboolean)assertion_system_enabled;
1742 status = (jboolean)assertion_user_enabled;
1745 if (list_assertion_names != NULL) {
1746 item = (assertion_name_t *)list_first(list_assertion_names);
1747 while (item != NULL) {
1748 name = utf_new_char(item->name);
1749 if (name == c->packagename) {
1750 status = (jboolean)item->enabled;
1752 else if (name == c->name) {
1753 status = (jboolean)item->enabled;
1756 item = (assertion_name_t *)list_next(list_assertion_names, item);
1762 return (jboolean)false;
1767 /* JVM_AssertionStatusDirectives */
1769 jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
1772 java_lang_AssertionStatusDirectives *o;
1773 java_handle_objectarray_t *classes;
1774 java_handle_objectarray_t *packages;
1775 java_booleanarray_t *classEnabled;
1776 java_booleanarray_t *packageEnabled;
1777 #if defined(ENABLE_ASSERTION)
1778 assertion_name_t *item;
1783 TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1785 c = load_class_bootstrap(utf_new_char("java/lang/AssertionStatusDirectives"));
1790 o = (java_lang_AssertionStatusDirectives *) builtin_new(c);
1795 #if defined(ENABLE_ASSERTION)
1796 classes = builtin_anewarray(assertion_class_count, class_java_lang_Object);
1798 classes = builtin_anewarray(0, class_java_lang_Object);
1800 if (classes == NULL)
1803 #if defined(ENABLE_ASSERTION)
1804 packages = builtin_anewarray(assertion_package_count, class_java_lang_Object);
1806 packages = builtin_anewarray(0, class_java_lang_Object);
1808 if (packages == NULL)
1811 #if defined(ENABLE_ASSERTION)
1812 classEnabled = builtin_newarray_boolean(assertion_class_count);
1814 classEnabled = builtin_newarray_boolean(0);
1816 if (classEnabled == NULL)
1819 #if defined(ENABLE_ASSERTION)
1820 packageEnabled = builtin_newarray_boolean(assertion_package_count);
1822 packageEnabled = builtin_newarray_boolean(0);
1824 if (packageEnabled == NULL)
1827 #if defined(ENABLE_ASSERTION)
1828 /* initialize arrays */
1830 if (list_assertion_names != NULL) {
1834 item = (assertion_name_t *)list_first(list_assertion_names);
1835 while (item != NULL) {
1836 js = javastring_new_from_ascii(item->name);
1841 if (item->package == false) {
1842 classes->data[i] = js;
1843 classEnabled->data[i] = (jboolean) item->enabled;
1847 packages->data[j] = js;
1848 packageEnabled->data[j] = (jboolean) item->enabled;
1852 item = (assertion_name_t *)list_next(list_assertion_names, item);
1857 /* set instance fields */
1859 o->classes = classes;
1860 o->packages = packages;
1861 o->classEnabled = classEnabled;
1862 o->packageEnabled = packageEnabled;
1868 /* JVM_GetClassNameUTF */
1870 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1872 log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1878 /* JVM_GetClassCPTypes */
1880 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1882 log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1886 /* JVM_GetClassCPEntriesCount */
1888 jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
1890 log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1896 /* JVM_GetClassFieldsCount */
1898 jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
1900 log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1906 /* JVM_GetClassMethodsCount */
1908 jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
1910 log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1916 /* JVM_GetMethodIxExceptionIndexes */
1918 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1920 log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1924 /* JVM_GetMethodIxExceptionsCount */
1926 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1928 log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1934 /* JVM_GetMethodIxByteCode */
1936 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1938 log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1942 /* JVM_GetMethodIxByteCodeLength */
1944 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1946 log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1952 /* JVM_GetMethodIxExceptionTableEntry */
1954 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1956 log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1960 /* JVM_GetMethodIxExceptionTableLength */
1962 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1964 log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1970 /* JVM_GetMethodIxModifiers */
1972 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1974 log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1980 /* JVM_GetFieldIxModifiers */
1982 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1984 log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1990 /* JVM_GetMethodIxLocalsCount */
1992 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1994 log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
2000 /* JVM_GetMethodIxArgsSize */
2002 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
2004 log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
2010 /* JVM_GetMethodIxMaxStack */
2012 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
2014 log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
2020 /* JVM_IsConstructorIx */
2022 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
2024 log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
2030 /* JVM_GetMethodIxNameUTF */
2032 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
2034 log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
2040 /* JVM_GetMethodIxSignatureUTF */
2042 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
2044 log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
2050 /* JVM_GetCPFieldNameUTF */
2052 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2054 log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
2060 /* JVM_GetCPMethodNameUTF */
2062 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2064 log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
2070 /* JVM_GetCPMethodSignatureUTF */
2072 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2074 log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
2080 /* JVM_GetCPFieldSignatureUTF */
2082 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
2084 log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
2090 /* JVM_GetCPClassNameUTF */
2092 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2094 log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
2100 /* JVM_GetCPFieldClassNameUTF */
2102 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2104 log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
2110 /* JVM_GetCPMethodClassNameUTF */
2112 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
2114 log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
2120 /* JVM_GetCPFieldModifiers */
2122 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2124 log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
2130 /* JVM_GetCPMethodModifiers */
2132 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
2134 log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
2140 /* JVM_ReleaseUTF */
2142 void JVM_ReleaseUTF(const char *utf)
2144 log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
2148 /* JVM_IsSameClassPackage */
2150 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
2152 log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
2160 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2163 * JVM I/O error codes
2165 #define JVM_EEXIST -100
2167 jint JVM_Open(const char *fname, jint flags, jint mode)
2171 TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2173 result = hpi_file->Open(fname, flags, mode);
2191 jint JVM_Close(jint fd)
2193 TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2195 return hpi_file->Close(fd);
2201 jint JVM_Read(jint fd, char *buf, jint nbytes)
2203 TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2205 return (jint) hpi_file->Read(fd, buf, nbytes);
2211 jint JVM_Write(jint fd, char *buf, jint nbytes)
2213 TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2215 return (jint) hpi_file->Write(fd, buf, nbytes);
2221 jint JVM_Available(jint fd, jlong *pbytes)
2223 TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2225 return hpi_file->Available(fd, pbytes);
2231 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2233 TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2235 return hpi_file->Seek(fd, (off_t) offset, whence);
2241 jint JVM_SetLength(jint fd, jlong length)
2243 TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2245 return hpi_file->SetLength(fd, length);
2251 jint JVM_Sync(jint fd)
2253 TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2255 return hpi_file->Sync(fd);
2259 /* JVM_StartThread */
2261 void JVM_StartThread(JNIEnv* env, jobject jthread)
2263 TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2265 threads_thread_start((java_handle_t *) jthread);
2269 /* JVM_StopThread */
2271 void JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable)
2273 log_println("JVM_StopThread: Deprecated. Not implemented.");
2277 /* JVM_IsThreadAlive */
2279 jboolean JVM_IsThreadAlive(JNIEnv* env, jobject jthread)
2285 TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2287 h = (java_handle_t *) jthread;
2288 t = thread_get_thread(h);
2290 /* The threadobject is null when a thread is created in Java. The
2291 priority is set later during startup. */
2296 result = threads_thread_is_alive(t);
2302 /* JVM_SuspendThread */
2304 void JVM_SuspendThread(JNIEnv* env, jobject jthread)
2306 log_println("JVM_SuspendThread: Deprecated. Not implemented.");
2310 /* JVM_ResumeThread */
2312 void JVM_ResumeThread(JNIEnv* env, jobject jthread)
2314 log_println("JVM_ResumeThread: Deprecated. Not implemented.");
2318 /* JVM_SetThreadPriority */
2320 void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio)
2325 TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2327 h = (java_handle_t *) jthread;
2328 t = thread_get_thread(h);
2330 /* The threadobject is null when a thread is created in Java. The
2331 priority is set later during startup. */
2336 threads_set_thread_priority(t->tid, prio);
2342 void JVM_Yield(JNIEnv *env, jclass threadClass)
2344 TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2352 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2354 TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2356 threads_sleep(millis, 0);
2360 /* JVM_CurrentThread */
2362 jobject JVM_CurrentThread(JNIEnv* env, jclass threadClass)
2366 TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2368 o = thread_get_current_object();
2374 /* JVM_CountStackFrames */
2376 jint JVM_CountStackFrames(JNIEnv* env, jobject jthread)
2378 log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2386 void JVM_Interrupt(JNIEnv* env, jobject jthread)
2391 TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2393 h = (java_handle_t *) jthread;
2394 t = thread_get_thread(h);
2399 threads_thread_interrupt(t);
2403 /* JVM_IsInterrupted */
2405 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2409 jboolean interrupted;
2411 TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2413 h = (java_handle_t *) jthread;
2414 t = thread_get_thread(h);
2416 interrupted = thread_is_interrupted(t);
2418 if (interrupted && clear_interrupted)
2419 thread_set_interrupted(t, false);
2427 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2432 TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2434 h = (java_handle_t *) obj;
2437 exceptions_throw_nullpointerexception();
2441 result = lock_is_held_by_current_thread(h);
2447 /* JVM_DumpAllStacks */
2449 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2451 log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2455 /* JVM_CurrentLoadedClass */
2457 jclass JVM_CurrentLoadedClass(JNIEnv *env)
2459 log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2465 /* JVM_CurrentClassLoader */
2467 jobject JVM_CurrentClassLoader(JNIEnv *env)
2469 /* XXX if a method in a class in a trusted loader is in a
2470 doPrivileged, return NULL */
2472 log_println("JVM_CurrentClassLoader: IMPLEMENT ME!");
2478 /* JVM_GetClassContext */
2480 jobjectArray JVM_GetClassContext(JNIEnv *env)
2482 TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2484 return (jobjectArray) stacktrace_getClassContext();
2488 /* JVM_ClassDepth */
2490 jint JVM_ClassDepth(JNIEnv *env, jstring name)
2492 log_println("JVM_ClassDepth: IMPLEMENT ME!");
2498 /* JVM_ClassLoaderDepth */
2500 jint JVM_ClassLoaderDepth(JNIEnv *env)
2502 log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2508 /* JVM_GetSystemPackage */
2510 jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
2516 TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2518 /* s = Package_find(name); */
2519 u = javastring_toutf((java_handle_t *) name, false);
2521 result = Package_find(u);
2524 s = javastring_new(result);
2532 /* JVM_GetSystemPackages */
2534 jobjectArray JVM_GetSystemPackages(JNIEnv *env)
2536 log_println("JVM_GetSystemPackages: IMPLEMENT ME!");
2542 /* JVM_AllocateNewObject */
2544 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2546 log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2552 /* JVM_AllocateNewArray */
2554 jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
2556 log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2562 /* JVM_LatestUserDefinedLoader */
2564 jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
2568 TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2570 cl = stacktrace_first_nonnull_classloader();
2572 return (jobject) cl;
2576 /* JVM_LoadClass0 */
2578 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2580 log_println("JVM_LoadClass0: IMPLEMENT ME!");
2586 /* JVM_GetArrayLength */
2588 jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
2592 TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2594 a = (java_handle_t *) arr;
2596 return array_length_get(a);
2600 /* JVM_GetArrayElement */
2602 jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
2607 TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2609 a = (java_handle_t *) arr;
2611 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2612 /* exceptions_throw_illegalargumentexception(); */
2616 o = array_element_get(a, index);
2622 /* JVM_GetPrimitiveArrayElement */
2624 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2628 log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2636 /* JVM_SetArrayElement */
2638 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2641 java_handle_t *value;
2643 TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2645 a = (java_handle_t *) arr;
2646 value = (java_handle_t *) val;
2648 array_element_set(a, index, value);
2652 /* JVM_SetPrimitiveArrayElement */
2654 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2656 log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2662 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2667 java_handle_objectarray_t *oa;
2669 TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2671 if (eltClass == NULL) {
2672 exceptions_throw_nullpointerexception();
2676 /* NegativeArraySizeException is checked in builtin_newarray. */
2678 c = LLNI_classinfo_unwrap(eltClass);
2680 /* Create primitive or object array. */
2682 if (class_is_primitive(c)) {
2683 pc = primitive_arrayclass_get_by_name(c->name);
2685 /* void arrays are not allowed. */
2688 exceptions_throw_illegalargumentexception();
2692 a = builtin_newarray(length, pc);
2697 oa = builtin_anewarray(length, c);
2699 return (jobject) oa;
2704 /* JVM_NewMultiArray */
2706 jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
2709 java_handle_intarray_t *ia;
2715 java_handle_objectarray_t *a;
2717 TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2719 if (eltClass == NULL) {
2720 exceptions_throw_nullpointerexception();
2724 /* NegativeArraySizeException is checked in builtin_newarray. */
2726 c = LLNI_classinfo_unwrap(eltClass);
2728 ia = (java_handle_intarray_t *) dim;
2730 length = array_length_get((java_handle_t *) ia);
2732 /* We check here for exceptions thrown in array_length_get,
2733 otherwise these exceptions get overwritten by the following
2734 IllegalArgumentException. */
2739 if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2740 exceptions_throw_illegalargumentexception();
2744 /* XXX This is just a quick hack to get it working. */
2746 dims = MNEW(long, length);
2748 for (i = 0; i < length; i++) {
2749 value = LLNI_array_direct(ia, i);
2750 dims[i] = (long) value;
2753 /* Create an array-class if necessary. */
2755 if (class_is_primitive(c))
2756 ac = primitive_arrayclass_get_by_name(c->name);
2758 ac = class_array_of(c, true);
2763 a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2769 /* JVM_InitializeSocketLibrary */
2771 jint JVM_InitializeSocketLibrary()
2773 TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2775 return hpi_initialize_socket_library();
2781 jint JVM_Socket(jint domain, jint type, jint protocol)
2783 TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2785 return system_socket(domain, type, protocol);
2789 /* JVM_SocketClose */
2791 jint JVM_SocketClose(jint fd)
2793 TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2795 return system_close(fd);
2799 /* JVM_SocketShutdown */
2801 jint JVM_SocketShutdown(jint fd, jint howto)
2803 TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2805 return system_shutdown(fd, howto);
2811 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2813 log_println("JVM_Recv: IMPLEMENT ME!");
2821 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2823 log_println("JVM_Send: IMPLEMENT ME!");
2831 jint JVM_Timeout(int fd, long timeout)
2833 log_println("JVM_Timeout: IMPLEMENT ME!");
2841 jint JVM_Listen(jint fd, jint count)
2843 TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2845 return system_listen(fd, count);
2851 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2853 TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2855 return system_connect(fd, him, len);
2861 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2863 log_println("JVM_Bind: IMPLEMENT ME!");
2871 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2873 TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2875 return system_accept(fd, him, (socklen_t *) len);
2881 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2883 log_println("JVM_RecvFrom: IMPLEMENT ME!");
2889 /* JVM_GetSockName */
2891 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2893 TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2895 return system_getsockname(fd, him, (socklen_t *) len);
2901 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2903 log_println("JVM_SendTo: IMPLEMENT ME!");
2909 /* JVM_SocketAvailable */
2911 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2913 #if defined(FIONREAD)
2917 TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2921 result = ioctl(fd, FIONREAD, &bytes);
2930 # error FIONREAD not defined
2935 /* JVM_GetSockOpt */
2937 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2939 TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2941 return system_getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2945 /* JVM_SetSockOpt */
2947 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2949 TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2951 return system_setsockopt(fd, level, optname, optval, optlen);
2955 /* JVM_GetHostName */
2957 int JVM_GetHostName(char *name, int namelen)
2961 TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2963 result = system_gethostname(name, namelen);
2965 TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
2971 /* JVM_GetHostByAddr */
2973 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
2975 log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
2981 /* JVM_GetHostByName */
2983 struct hostent *JVM_GetHostByName(char* name)
2985 log_println("JVM_GetHostByName: IMPLEMENT ME!");
2991 /* JVM_GetProtoByName */
2993 struct protoent *JVM_GetProtoByName(char* name)
2995 log_println("JVM_GetProtoByName: IMPLEMENT ME!");
3001 /* JVM_LoadLibrary */
3003 void *JVM_LoadLibrary(const char *name)
3008 TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
3010 u = utf_new_char(name);
3012 handle = native_library_open(u);
3014 TRACEJVMCALLSEXIT(("->%p", handle));
3020 /* JVM_UnloadLibrary */
3022 void JVM_UnloadLibrary(void* handle)
3024 TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
3026 native_library_close(handle);
3030 /* JVM_FindLibraryEntry */
3032 void *JVM_FindLibraryEntry(void *handle, const char *name)
3036 TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
3038 symbol = hpi_library->FindLibraryEntry(handle, name);
3040 TRACEJVMCALLSEXIT(("->%p", symbol));
3048 jboolean JVM_IsNaN(jdouble a)
3050 log_println("JVM_IsNaN: IMPLEMENT ME!");
3056 /* JVM_IsSupportedJNIVersion */
3058 jboolean JVM_IsSupportedJNIVersion(jint version)
3060 TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
3062 return jni_version_check(version);
3066 /* JVM_InternString */
3068 jstring JVM_InternString(JNIEnv *env, jstring str)
3070 TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
3072 return (jstring) javastring_intern((java_handle_t *) str);
3076 /* JVM_RawMonitorCreate */
3078 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3082 TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3084 o = NEW(java_object_t);
3086 lock_init_object_lock(o);
3092 /* JVM_RawMonitorDestroy */
3094 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
3096 TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3098 FREE(mon, java_object_t);
3102 /* JVM_RawMonitorEnter */
3104 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
3106 TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3108 (void) lock_monitor_enter((java_object_t *) mon);
3114 /* JVM_RawMonitorExit */
3116 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
3118 TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3120 (void) lock_monitor_exit((java_object_t *) mon);
3124 /* JVM_SetPrimitiveFieldValues */
3126 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3128 log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3132 /* JVM_GetPrimitiveFieldValues */
3134 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3136 log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3140 /* JVM_AccessVMBooleanFlag */
3142 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3144 log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3150 /* JVM_AccessVMIntFlag */
3152 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3154 log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3160 /* JVM_VMBreakPoint */
3162 void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
3164 log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3168 /* JVM_GetClassFields */
3170 jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
3172 log_println("JVM_GetClassFields: IMPLEMENT ME!");
3178 /* JVM_GetClassMethods */
3180 jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
3182 log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3188 /* JVM_GetClassConstructors */
3190 jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
3192 log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3198 /* JVM_GetClassField */
3200 jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
3202 log_println("JVM_GetClassField: IMPLEMENT ME!");
3208 /* JVM_GetClassMethod */
3210 jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
3212 log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3218 /* JVM_GetClassConstructor */
3220 jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
3222 log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3228 /* JVM_NewInstance */
3230 jobject JVM_NewInstance(JNIEnv *env, jclass cls)
3232 log_println("JVM_NewInstance: IMPLEMENT ME!");
3240 jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
3242 log_println("JVM_GetField: IMPLEMENT ME!");
3248 /* JVM_GetPrimitiveField */
3250 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3254 log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3264 void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
3266 log_println("JVM_SetField: IMPLEMENT ME!");
3270 /* JVM_SetPrimitiveField */
3272 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3274 log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3278 /* JVM_InvokeMethod */
3280 jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
3282 java_lang_reflect_Method *rm;
3289 TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3291 rm = (java_lang_reflect_Method *) method;
3293 LLNI_field_get_cls(rm, clazz, c);
3294 LLNI_field_get_val(rm, slot, slot);
3295 LLNI_field_get_val(rm, override, override);
3297 m = &(c->methods[slot]);
3299 ro = reflect_method_invoke(m, (java_handle_t *) obj, (java_handle_objectarray_t *) args0, override);
3301 return (jobject) ro;
3305 /* JVM_NewInstanceFromConstructor */
3307 jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
3309 java_lang_reflect_Constructor *rc;
3316 TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3318 rc = (java_lang_reflect_Constructor *) con;
3320 LLNI_field_get_cls(rc, clazz, c);
3321 LLNI_field_get_val(rc, slot, slot);
3322 LLNI_field_get_val(rc, override, override);
3324 m = &(c->methods[slot]);
3326 o = reflect_constructor_newinstance(m, (java_handle_objectarray_t *) args0, override);
3332 /* JVM_SupportsCX8 */
3334 jboolean JVM_SupportsCX8()
3336 TRACEJVMCALLS(("JVM_SupportsCX8()"));
3346 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3348 log_println("JVM_CX8Field: IMPLEMENT ME!");
3354 /* JVM_GetAllThreads */
3356 jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
3358 log_println("JVM_GetAllThreads: IMPLEMENT ME!");
3364 /* JVM_DumpThreads */
3366 jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
3368 log_println("JVM_DumpThreads: IMPLEMENT ME!");
3374 /* JVM_GetManagement */
3376 void *JVM_GetManagement(jint version)
3378 TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3380 /* TODO We current don't support the management interface. */
3386 /* JVM_InitAgentProperties */
3388 jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
3390 log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3396 /* JVM_GetEnclosingMethodInfo */
3398 jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
3402 java_handle_objectarray_t *oa;
3404 TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3406 c = LLNI_classinfo_unwrap(ofClass);
3408 if ((c == NULL) || class_is_primitive(c))
3411 m = class_get_enclosingmethod_raw(c);
3416 oa = builtin_anewarray(3, class_java_lang_Object);
3421 array_objectarray_element_set(oa, 0, (java_handle_t *) LLNI_classinfo_wrap(m->clazz));
3422 array_objectarray_element_set(oa, 1, javastring_new(m->name));
3423 array_objectarray_element_set(oa, 2, javastring_new(m->descriptor));
3425 return (jobjectArray) oa;
3429 /* JVM_GetThreadStateValues */
3431 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3433 java_handle_intarray_t *ia;
3435 TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3436 env, javaThreadState));
3438 /* If new thread states are added in future JDK and VM versions,
3439 this should check if the JDK version is compatible with thread
3440 states supported by the VM. Return NULL if not compatible.
3442 This function must map the VM java_lang_Thread::ThreadStatus
3443 to the Java thread state that the JDK supports. */
3445 switch (javaThreadState) {
3446 case THREAD_STATE_NEW:
3447 ia = builtin_newarray_int(1);
3452 array_intarray_element_set(ia, 0, THREAD_STATE_NEW);
3455 case THREAD_STATE_RUNNABLE:
3456 ia = builtin_newarray_int(1);
3461 array_intarray_element_set(ia, 0, THREAD_STATE_RUNNABLE);
3464 case THREAD_STATE_BLOCKED:
3465 ia = builtin_newarray_int(1);
3470 array_intarray_element_set(ia, 0, THREAD_STATE_BLOCKED);
3473 case THREAD_STATE_WAITING:
3474 ia = builtin_newarray_int(2);
3479 array_intarray_element_set(ia, 0, THREAD_STATE_WAITING);
3480 /* XXX Implement parked stuff. */
3481 /* array_intarray_element_set(ia, 1, PARKED); */
3484 case THREAD_STATE_TIMED_WAITING:
3485 ia = builtin_newarray_int(3);
3490 /* XXX Not sure about that one. */
3491 /* array_intarray_element_set(ia, 0, SLEEPING); */
3492 array_intarray_element_set(ia, 0, THREAD_STATE_TIMED_WAITING);
3493 /* XXX Implement parked stuff. */
3494 /* array_intarray_element_set(ia, 2, PARKED); */
3497 case THREAD_STATE_TERMINATED:
3498 ia = builtin_newarray_int(1);
3503 array_intarray_element_set(ia, 0, THREAD_STATE_TERMINATED);
3507 /* Unknown state - probably incompatible JDK version */
3511 return (jintArray) ia;
3515 /* JVM_GetThreadStateNames */
3517 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3519 java_handle_intarray_t *ia;
3520 java_handle_objectarray_t *oa;
3523 TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3524 env, javaThreadState, values));
3526 ia = (java_handle_intarray_t *) values;
3528 /* If new thread states are added in future JDK and VM versions,
3529 this should check if the JDK version is compatible with thread
3530 states supported by the VM. Return NULL if not compatible.
3532 This function must map the VM java_lang_Thread::ThreadStatus
3533 to the Java thread state that the JDK supports. */
3535 if (values == NULL) {
3536 exceptions_throw_nullpointerexception();
3540 switch (javaThreadState) {
3541 case THREAD_STATE_NEW:
3542 assert(ia->header.size == 1 && ia->data[0] == THREAD_STATE_NEW);
3544 oa = builtin_anewarray(1, class_java_lang_String);
3549 s = javastring_new(utf_new_char("NEW"));
3554 array_objectarray_element_set(oa, 0, s);
3557 case THREAD_STATE_RUNNABLE:
3558 oa = builtin_anewarray(1, class_java_lang_String);
3563 s = javastring_new(utf_new_char("RUNNABLE"));
3568 array_objectarray_element_set(oa, 0, s);
3571 case THREAD_STATE_BLOCKED:
3572 oa = builtin_anewarray(1, class_java_lang_String);
3577 s = javastring_new(utf_new_char("BLOCKED"));
3582 array_objectarray_element_set(oa, 0, s);
3585 case THREAD_STATE_WAITING:
3586 oa = builtin_anewarray(2, class_java_lang_String);
3591 s = javastring_new(utf_new_char("WAITING.OBJECT_WAIT"));
3592 /* s = javastring_new(utf_new_char("WAITING.PARKED")); */
3597 array_objectarray_element_set(oa, 0, s);
3598 /* array_objectarray_element_set(oa, 1, s); */
3601 case THREAD_STATE_TIMED_WAITING:
3602 oa = builtin_anewarray(3, class_java_lang_String);
3607 /* s = javastring_new(utf_new_char("TIMED_WAITING.SLEEPING")); */
3608 s = javastring_new(utf_new_char("TIMED_WAITING.OBJECT_WAIT"));
3609 /* s = javastring_new(utf_new_char("TIMED_WAITING.PARKED")); */
3614 /* array_objectarray_element_set(oa, 0, s); */
3615 array_objectarray_element_set(oa, 0, s);
3616 /* array_objectarray_element_set(oa, 2, s); */
3619 case THREAD_STATE_TERMINATED:
3620 oa = builtin_anewarray(1, class_java_lang_String);
3625 s = javastring_new(utf_new_char("TERMINATED"));
3630 array_objectarray_element_set(oa, 0, s);
3634 /* Unknown state - probably incompatible JDK version */
3638 return (jobjectArray) oa;
3642 /* JVM_GetVersionInfo */
3644 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3646 log_println("JVM_GetVersionInfo: IMPLEMENT ME!");
3650 /* OS: JVM_RegisterSignal */
3652 void *JVM_RegisterSignal(jint sig, void *handler)
3654 functionptr newHandler;
3656 TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3658 if (handler == (void *) 2)
3659 newHandler = (functionptr) signal_thread_handler;
3661 newHandler = (functionptr) (uintptr_t) handler;
3668 /* These signals are already used by the VM. */
3672 /* This signal is used by the VM to dump thread stacks unless
3673 ReduceSignalUsage is set, in which case the user is allowed
3674 to set his own _native_ handler for this signal; thus, in
3675 either case, we do not allow JVM_RegisterSignal to change
3685 signal_register_signal(sig, newHandler, 0);
3687 /* XXX Should return old handler. */
3693 /* OS: JVM_RaiseSignal */
3695 jboolean JVM_RaiseSignal(jint sig)
3697 log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3703 /* OS: JVM_FindSignal */
3705 jint JVM_FindSignal(const char *name)
3707 TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3709 #if defined(__LINUX__)
3710 if (strcmp(name, "HUP") == 0)
3713 if (strcmp(name, "INT") == 0)
3716 if (strcmp(name, "TERM") == 0)
3719 # error not implemented for this OS
3727 * These are local overrides for various environment variables in Emacs.
3728 * Please do not remove this and leave it at the end of the file, where
3729 * Emacs will automagically detect them.
3730 * ---------------------------------------------------------------------
3733 * indent-tabs-mode: t