CACAO
jvm.cpp
Go to the documentation of this file.
1 /* src/native/vm/openjdk/jvm.cpp - HotSpot VM interface functions
2 
3  Copyright (C) 1996-2013
4  CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5  Copyright (C) 2009 Theobroma Systems Ltd.
6 
7  This file is part of CACAO.
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2, or (at
12  your option) any later version.
13 
14  This program is distributed in the hope that it will be useful, but
15  WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22  02110-1301, USA.
23 
24 */
25 
26 
27 #include "config.h"
28 
29 #include <assert.h>
30 #include <errno.h>
31 #include <stdint.h>
32 #include <stdio.h>
33 #include <inttypes.h>
34 #include <string.h>
35 #include <unistd.h>
36 #include <dlfcn.h>
37 
38 #if defined(HAVE_SYS_IOCTL_H)
39 #define BSD_COMP /* Get FIONREAD on Solaris2 */
40 #include <sys/ioctl.h>
41 #endif
42 
43 #include <sys/types.h>
44 
45 // Include our JNI header before the JVM headers, because the JVM
46 // headers include jni.h and we want to override the typedefs in
47 // jni.h.
48 #include "native/jni.hpp"
49 
50 // We include jvm_md.h before jvm.h as the latter includes the former.
51 #include INCLUDE_JVM_MD_H
52 #include INCLUDE_JVM_H
53 
54 #include "fdlibm/fdlibm.h"
55 
56 #include "mm/memory.hpp"
57 
58 #include "native/llni.hpp"
59 #include "native/native.hpp"
60 
61 #include "native/vm/reflection.hpp"
62 
63 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
65 #endif
67 
68 #include "threads/lock.hpp"
69 #include "threads/thread.hpp"
70 #include "threads/threadlist.hpp"
71 
72 #include "toolbox/logging.hpp"
73 #include "toolbox/list.hpp"
74 
75 #include "vm/array.hpp"
76 
77 #if defined(ENABLE_ASSERTION)
78 #include "vm/assertion.hpp"
79 #endif
80 
81 #include "vm/jit/builtin.hpp"
82 #include "vm/classcache.hpp"
83 #include "vm/exceptions.hpp"
84 #include "vm/global.hpp"
85 #include "vm/globals.hpp"
86 #include "vm/initialize.hpp"
87 #include "vm/javaobjects.hpp"
88 #include "vm/options.hpp"
89 #include "vm/os.hpp"
90 #include "vm/package.hpp"
91 #include "vm/primitive.hpp"
92 #include "vm/properties.hpp"
93 #include "vm/resolve.hpp"
94 #include "vm/signallocal.hpp"
95 #include "vm/string.hpp"
96 #include "vm/vm.hpp"
97 
98 #include "vm/jit/stacktrace.hpp"
99 
100 
101 /* debugging macros ***********************************************************/
102 
103 #if !defined(NDEBUG)
104 
105 # define TRACEJVMCALLS(x) \
106  do { \
107  if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
108  log_println x; \
109  } \
110  } while (0)
111 
112 # define TRACEJVMCALLSENTER(x) \
113  do { \
114  if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
115  log_start(); \
116  log_print x; \
117  } \
118  } while (0)
119 
120 # define TRACEJVMCALLSEXIT(x) \
121  do { \
122  if (opt_TraceJVMCalls || opt_TraceJVMCallsVerbose) { \
123  log_print x; \
124  log_finish(); \
125  } \
126  } while (0)
127 
128 # define TRACEJVMCALLSVERBOSE(x) \
129  do { \
130  if (opt_TraceJVMCallsVerbose) { \
131  log_println x; \
132  } \
133  } while (0)
134 
135 # define PRINTJVMWARNINGS(x) \
136  do { \
137  if (opt_PrintWarnings) { \
138  log_println x; \
139  } \
140  } while (0)
141 
142 #else
143 
144 # define TRACEJVMCALLS(x)
145 # define TRACEJVMCALLSENTER(x)
146 # define TRACEJVMCALLSEXIT(x)
147 # define TRACEJVMCALLSVERBOSE(x)
148 # define PRINTJVMWARNINGS(x)
149 
150 #endif
151 
152 
153 // Interface functions are exported as C functions.
154 extern "C" {
155 
156 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
157 {
158  if ((intptr_t) count <= 0)
159  return -1;
160 
161  return vsnprintf(str, count, fmt, args);
162 }
163 
164 
165 int jio_snprintf(char *str, size_t count, const char *fmt, ...)
166 {
167  va_list ap;
168  int len;
169 
170  va_start(ap, fmt);
171  len = jio_vsnprintf(str, count, fmt, ap);
172  va_end(ap);
173 
174  return len;
175 }
176 
177 
178 int jio_fprintf(FILE* f, const char *fmt, ...)
179 {
180  log_println("jio_fprintf: IMPLEMENT ME!");
181 
182  return 0;
183 }
184 
185 
186 int jio_vfprintf(FILE* f, const char *fmt, va_list args)
187 {
188  log_println("jio_vfprintf: IMPLEMENT ME!");
189 
190  return 0;
191 }
192 
193 
194 int jio_printf(const char *fmt, ...)
195 {
196  log_println("jio_printf: IMPLEMENT ME!");
197 
198  return 0;
199 }
200 
201 
202 /* JVM_GetInterfaceVersion */
203 
205 {
206  /* This is defined in hotspot/src/share/vm/prims/jvm.h */
207 
208 #define JVM_INTERFACE_VERSION 4
209 
210  return JVM_INTERFACE_VERSION;
211 }
212 
213 
214 /* JVM_CurrentTimeMillis */
215 
216 jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
217 {
218  TRACEJVMCALLS(("JVM_CurrentTimeMillis(env=%p, ignored=%p)", env, ignored));
219 
220  return (jlong) builtin_currenttimemillis();
221 }
222 
223 
224 /* JVM_NanoTime */
225 
226 jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
227 {
228  TRACEJVMCALLS(("JVM_NanoTime(env=%p, ignored=%p)", env, ignored));
229 
230  return (jlong) builtin_nanotime();
231 }
232 
233 
234 /* JVM_ArrayCopy */
235 
236 void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
237 {
238  java_handle_t *s;
239  java_handle_t *d;
240 
241  s = (java_handle_t *) src;
242  d = (java_handle_t *) dst;
243 
244  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));
245 
246  builtin_arraycopy(s, src_pos, d, dst_pos, length);
247 }
248 
249 
250 /* JVM_InitProperties */
251 
253 {
254  java_handle_t *h;
255  char buf[256];
256 
257  TRACEJVMCALLS(("JVM_InitProperties(env=%p, properties=%p)", env, properties));
258 
259  h = (java_handle_t *) properties;
260 
261  /* Convert the -XX:MaxDirectMemorySize= command line flag to the
262  sun.nio.MaxDirectMemorySize property. Do this after setting
263  user properties to prevent people from setting the value with a
264  -D option, as requested. */
265 
266  jio_snprintf(buf, sizeof(buf), "%" PRId64, opt_MaxDirectMemorySize);
267  VM::get_current()->get_properties().put("sun.nio.MaxDirectMemorySize", buf);
268 
269  // Fill the java.util.Properties object.
271 
272  return properties;
273 }
274 
275 
276 /* JVM_Exit */
277 
278 void JVM_Exit(jint code)
279 {
280  log_println("JVM_Exit: IMPLEMENT ME!");
281 }
282 
283 
284 /* JVM_Halt */
285 
286 void JVM_Halt(jint code)
287 {
288  TRACEJVMCALLS(("JVM_Halt(code=%d)", code));
289 
290 /* vm_exit(code); */
291  vm_shutdown(code);
292 }
293 
294 
295 /* JVM_OnExit(void (*func)) */
296 
297 void JVM_OnExit(void (*func)(void))
298 {
299  log_println("JVM_OnExit(void (*func): IMPLEMENT ME!");
300 }
301 
302 
303 /* JVM_GC */
304 
305 void JVM_GC(void)
306 {
307  TRACEJVMCALLS(("JVM_GC()"));
308 
309  gc_call();
310 }
311 
312 
313 /* JVM_MaxObjectInspectionAge */
314 
316 {
317  log_println("JVM_MaxObjectInspectionAge: IMPLEMENT ME!");
318 
319  return 0;
320 }
321 
322 
323 /* JVM_TraceInstructions */
324 
325 void JVM_TraceInstructions(jboolean on)
326 {
327  log_println("JVM_TraceInstructions: IMPLEMENT ME!");
328 }
329 
330 
331 /* JVM_TraceMethodCalls */
332 
333 void JVM_TraceMethodCalls(jboolean on)
334 {
335  log_println("JVM_TraceMethodCalls: IMPLEMENT ME!");
336 }
337 
338 
339 /* JVM_TotalMemory */
340 
341 jlong JVM_TotalMemory(void)
342 {
343  TRACEJVMCALLS(("JVM_TotalMemory()"));
344 
345  return gc_get_heap_size();
346 }
347 
348 
349 /* JVM_FreeMemory */
350 
351 jlong JVM_FreeMemory(void)
352 {
353  TRACEJVMCALLS(("JVM_FreeMemory()"));
354 
355  return gc_get_free_bytes();
356 }
357 
358 
359 /* JVM_MaxMemory */
360 
361 jlong JVM_MaxMemory(void)
362 {
363  TRACEJVMCALLS(("JVM_MaxMemory()"));
364 
365  return gc_get_max_heap_size();
366 }
367 
368 
369 /* JVM_ActiveProcessorCount */
370 
372 {
373  TRACEJVMCALLS(("JVM_ActiveProcessorCount()"));
374 
375  return os::processors_online();
376 }
377 
378 
379 /* JVM_FillInStackTrace */
380 
381 void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
382 {
383  TRACEJVMCALLS(("JVM_FillInStackTrace(env=%p, receiver=%p)", env, receiver));
384 
386 
387  if (ba == NULL)
388  return;
389 
390  java_lang_Throwable jlt(receiver, ba);
391 }
392 
393 
394 /* JVM_PrintStackTrace */
395 
396 void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
397 {
398  log_println("JVM_PrintStackTrace: IMPLEMENT ME!");
399 }
400 
401 
402 /* JVM_GetStackTraceDepth */
403 
404 jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
405 {
406  TRACEJVMCALLS(("JVM_GetStackTraceDepth(env=%p, throwable=%p)", env, throwable));
407 
408  java_lang_Throwable jlt(throwable);
409 
410  if (jlt.is_null()) {
412  return 0;
413  }
414 
415  ByteArray ba(jlt.get_backtrace());
416 
417  if (ba.is_null())
418  return 0;
419 
420  // We need a critical section here as the stacktrace structure is
421  // mapped onto a Java byte-array.
422 
424 
425  stacktrace_t* st = (stacktrace_t *) ba.get_raw_data_ptr();
426 
427  int32_t depth = st->length;
428 
430 
431  return depth;
432 }
433 
434 
435 /* JVM_GetStackTraceElement */
436 
438 {
439  TRACEJVMCALLS(("JVM_GetStackTraceElement(env=%p, throwable=%p, index=%d)", env, throwable, index));
440 
441  java_lang_Throwable jlt(throwable);
442  ByteArray ba(jlt.get_backtrace());
443 
444  // XXX We need a critical section here as the stacktrace structure is
445  // mapped onto a Java byte-array.
446  stacktrace_t* st = (stacktrace_t *) ba.get_raw_data_ptr();
447 
448  return stacktrace_get_StackTraceElement(st, index);
449 }
450 
451 
452 /* JVM_IHashCode */
453 
454 jint JVM_IHashCode(JNIEnv* env, jobject handle)
455 {
456  TRACEJVMCALLS(("JVM_IHashCode(env=%p, jobject=%p)", env, handle));
457 
458  java_lang_Object o(handle);
459 
460  return o.get_hashcode();
461 }
462 
463 
464 /* JVM_MonitorWait */
465 
466 void JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms)
467 {
468  TRACEJVMCALLS(("JVM_MonitorWait(env=%p, handle=%p, ms=%ld)", env, handle, ms));
469  if (ms < 0) {
470 /* exceptions_throw_illegalargumentexception("argument out of range"); */
472  return;
473  }
474 
475  lock_wait_for_object((java_handle_t*) handle, ms, 0);
476 }
477 
478 
479 /* JVM_MonitorNotify */
480 
481 void JVM_MonitorNotify(JNIEnv* env, jobject handle)
482 {
483  TRACEJVMCALLS(("JVM_MonitorNotify(env=%p, handle=%p)", env, handle));
484 
486 }
487 
488 
489 /* JVM_MonitorNotifyAll */
490 
492 {
493  TRACEJVMCALLS(("JVM_MonitorNotifyAll(env=%p, handle=%p)", env, handle));
494 
496 }
497 
498 
499 /* JVM_Clone */
500 
502 {
503  TRACEJVMCALLS(("JVM_Clone(env=%p, handle=%p)", env, handle));
504 
505  return (jobject) builtin_clone(env, (java_handle_t *) handle);
506 }
507 
508 
509 /* JVM_InitializeCompiler */
510 
512 {
513  log_println("JVM_InitializeCompiler : IMPLEMENT ME!");
514 }
515 
516 
517 /* JVM_IsSilentCompiler */
518 
519 jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
520 {
521  log_println("JVM_IsSilentCompiler: IMPLEMENT ME!");
522 
523  return 0;
524 }
525 
526 
527 /* JVM_CompileClass */
528 
529 jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
530 {
531  log_println("JVM_CompileClass: IMPLEMENT ME!");
532 
533  return 0;
534 }
535 
536 
537 /* JVM_CompileClasses */
538 
539 jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
540 {
541  log_println("JVM_CompileClasses: IMPLEMENT ME!");
542 
543  return 0;
544 }
545 
546 
547 /* JVM_CompilerCommand */
548 
550 {
551  log_println("JVM_CompilerCommand: IMPLEMENT ME!");
552 
553  return 0;
554 }
555 
556 
557 /* JVM_EnableCompiler */
558 
559 void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
560 {
561  TRACEJVMCALLS(("JVM_EnableCompiler(env=%p, compCls=%p)", env, compCls));
562  PRINTJVMWARNINGS(("JVM_EnableCompiler not supported"));
563 }
564 
565 
566 /* JVM_DisableCompiler */
567 
568 void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
569 {
570  TRACEJVMCALLS(("JVM_DisableCompiler(env=%p, compCls=%p)", env, compCls));
571  PRINTJVMWARNINGS(("JVM_DisableCompiler not supported"));
572 }
573 
574 
575 /* JVM_GetLastErrorString */
576 
577 jint JVM_GetLastErrorString(char* buf, int len)
578 {
579  TRACEJVMCALLS(("JVM_GetLastErrorString(buf=%p, len=%d", buf, len));
580 
581 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
582  HPI& hpi = VM::get_current()->get_hpi();
583  return hpi.get_system().GetLastErrorString(buf, len);
584 #else
585  //XXX IMPLEMENT ME!
586  return 0;
587 #endif
588 }
589 
590 
591 /* JVM_NativePath */
592 
593 char *JVM_NativePath(char* path)
594 {
595  TRACEJVMCALLS(("JVM_NativePath(path=%s)", path));
596 
597 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
598  HPI& hpi = VM::get_current()->get_hpi();
599  return hpi.get_file().NativePath(path);
600 #else
601  return path;
602 #endif
603 }
604 
605 
606 /* JVM_GetCallerClass */
607 
609 {
610  classinfo *c;
611 
612  TRACEJVMCALLS(("JVM_GetCallerClass(env=%p, depth=%d)", env, depth));
613 
614  c = stacktrace_get_caller_class(depth);
615 
616  return (jclass) c;
617 }
618 
619 
620 /* JVM_FindPrimitiveClass */
621 
623 {
624  TRACEJVMCALLS(("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s));
625 
628 
629  return (jclass) LLNI_classinfo_wrap(c);
630 }
631 
632 
633 /* JVM_ResolveClass */
634 
636 {
637  TRACEJVMCALLS(("JVM_ResolveClass(env=%p, cls=%p)", env, cls));
638  PRINTJVMWARNINGS(("JVM_ResolveClass not implemented"));
639 }
640 
641 
642 /* JVM_FindClassFromBootLoader */
643 
645 {
646  TRACEJVMCALLS(("JVM_FindClassFromBootLoader(name=%s)", name));
647 
650 
651  if (c == NULL)
652  return NULL;
653 
654  return (jclass) LLNI_classinfo_wrap(c);
655 }
656 
657 
658 /* JVM_FindClassFromCaller */
659 
660 jclass JVM_FindClassFromCaller(JNIEnv* env, const char* name, jboolean init, jobject loader, jclass caller)
661 {
662  TRACEJVMCALLS(("JVM_FindClassFromCaller(name=%s, init=%d, loader=%p, caller=%p)", name, init, loader, caller));
663 
667 
668  if (c == NULL)
669  return NULL;
670 
671  if (init)
672  if (!(c->state & CLASS_INITIALIZED))
673  if (!initialize_class(c))
674  return NULL;
675 
676  return (jclass) LLNI_classinfo_wrap(c);
677 }
678 
679 /* JVM_FindClassFromClassLoader */
680 
681 jclass JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, jboolean init, jobject loader, jboolean throwError)
682 {
683  TRACEJVMCALLS(("JVM_FindClassFromClassLoader(name=%s, init=%d, loader=%p, throwError=%d)", name, init, loader, throwError));
684 
685  /* As of now, OpenJDK does not call this function with throwError
686  is true. */
687 
688  assert(throwError == false);
689 
693 
694  if (c == NULL)
695  return NULL;
696 
697  if (init)
698  if (!(c->state & CLASS_INITIALIZED))
699  if (!initialize_class(c))
700  return NULL;
701 
702  return (jclass) LLNI_classinfo_wrap(c);
703 }
704 
705 
706 
707 /* JVM_FindClassFromClass */
708 
709 jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
710 {
711  log_println("JVM_FindClassFromClass: IMPLEMENT ME!");
712 
713  return NULL;
714 }
715 
716 
717 /* JVM_DefineClass */
718 
719 jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
720 {
721  log_println("JVM_DefineClass: IMPLEMENT ME!");
722 
723  return NULL;
724 }
725 
726 
727 /* JVM_DefineClassWithSource */
728 
729 jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
730 {
731  TRACEJVMCALLS(("JVM_DefineClassWithSource(env=%p, name=%s, loader=%p, buf=%p, len=%d, pd=%p, source=%s)", env, name, loader, buf, len, pd, source));
732 
733  Utf8String u = (name != NULL) ? Utf8String::from_utf8(name) : NULL;
735 
736  /* XXX do something with source */
737 
738  classinfo *c = class_define(u, cl, len, (uint8_t *) buf, (java_handle_t *) pd);
739 
740  return (jclass) LLNI_classinfo_wrap(c);
741 }
742 
743 
744 /* JVM_FindLoadedClass */
745 
747 {
748  TRACEJVMCALLS(("JVM_FindLoadedClass(env=%p, loader=%p, name=%p)", env, loader, name));
749 
752  classinfo *c = classcache_lookup(cl, u);
753 
754  return (jclass) LLNI_classinfo_wrap(c);
755 }
756 
757 
758 /* JVM_GetClassName */
759 
761 {
762  classinfo* c;
763 
764  TRACEJVMCALLS(("JVM_GetClassName(env=%p, cls=%p)", env, cls));
765 
766  c = LLNI_classinfo_unwrap(cls);
767 
768  return (jstring) class_get_classname(c);
769 }
770 
771 
772 /* JVM_GetClassInterfaces */
773 
775 {
776  classinfo *c;
778 
779  TRACEJVMCALLS(("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls));
780 
781  c = LLNI_classinfo_unwrap(cls);
782 
783  oa = class_get_interfaces(c);
784 
785  return oa;
786 }
787 
788 
789 /* JVM_GetClassLoader */
790 
792 {
793  classinfo *c;
794  classloader_t *cl;
795 
796  TRACEJVMCALLSENTER(("JVM_GetClassLoader(env=%p, cls=%p)", env, cls));
797 
798  c = LLNI_classinfo_unwrap(cls);
799  cl = class_get_classloader(c);
800 
801  TRACEJVMCALLSEXIT(("->%p", cl));
802 
803  return (jobject) cl;
804 }
805 
806 
807 /* JVM_IsInterface */
808 
809 jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
810 {
811  classinfo *c;
812 
813  TRACEJVMCALLS(("JVM_IsInterface(env=%p, cls=%p)", env, cls));
814 
815  c = LLNI_classinfo_unwrap(cls);
816 
817  return class_is_interface(c);
818 }
819 
820 
821 /* JVM_GetClassSigners */
822 
824 {
825  log_println("JVM_GetClassSigners: IMPLEMENT ME!");
826 
827  return NULL;
828 }
829 
830 
831 /* JVM_SetClassSigners */
832 
834 {
835  TRACEJVMCALLS(("JVM_SetClassSigners(env=%p, cls=%p, signers=%p)", env, cls, signers));
836 
838 
839  ObjectArray oa(signers);
840 
841  /* This call is ignored for primitive types and arrays. Signers
842  are only set once, ClassLoader.java, and thus shouldn't be
843  called with an array. Only the bootstrap loader creates
844  arrays. */
845 
846  if (class_is_primitive(c) || class_is_array(c))
847  return;
848 
849  // XXX: Fix this!
851 }
852 
853 
854 /* JVM_GetProtectionDomain */
855 
857 {
858  classinfo *c;
859 
860  TRACEJVMCALLS(("JVM_GetProtectionDomain(env=%p, cls=%p)", env, cls));
861 
862  c = LLNI_classinfo_unwrap(cls);
863 
864  if (c == NULL) {
866  return NULL;
867  }
868 
869  /* Primitive types do not have a protection domain. */
870 
871  if (class_is_primitive(c))
872  return NULL;
873 
874  return (jobject) c->protectiondomain;
875 }
876 
877 
878 /* JVM_SetProtectionDomain */
879 
881 {
882  log_println("JVM_SetProtectionDomain: IMPLEMENT ME!");
883 }
884 
885 
886 /* JVM_DoPrivileged */
887 
888 jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
889 {
890  java_handle_t *h;
891  classinfo *c;
892  methodinfo *m;
893  java_handle_t *result;
894  java_handle_t *e;
895 
896  TRACEJVMCALLS(("JVM_DoPrivileged(env=%p, cls=%p, action=%p, context=%p, wrapException=%d)", env, cls, action, context, wrapException));
897 
898  h = (java_handle_t *) action;
899  LLNI_class_get(h, c);
900 
901  if (action == NULL) {
903  return NULL;
904  }
905 
906  /* lookup run() method (throw no exceptions) */
907 
908  m = class_resolveclassmethod(c, utf8::run, utf8::void__java_lang_Object, c,
909  false);
910 
911  if ((m == NULL) || !(m->flags & ACC_PUBLIC) || (m->flags & ACC_STATIC)) {
912  exceptions_throw_internalerror("No run method");
913  return NULL;
914  }
915 
916  /* XXX It seems something with a privileged stack needs to be done
917  here. */
918 
919  result = vm_call_method(m, h);
920 
922 
923  if (e != NULL) {
928  }
929 
930  return NULL;
931  }
932 
933  return (jobject) result;
934 }
935 
936 
937 /* JVM_GetInheritedAccessControlContext */
938 
940 {
941  log_println("JVM_GetInheritedAccessControlContext: IMPLEMENT ME!");
942 
943  return NULL;
944 }
945 
946 
947 /* JVM_GetStackAccessControlContext */
948 
950 {
951  TRACEJVMCALLS(("JVM_GetStackAccessControlContext(env=%p, cls=%p): IMPLEMENT ME!", env, cls));
952 
953  /* XXX All stuff I tested so far works without that function. At
954  some point we have to implement it, but I disable the output
955  for now to make IcedTea happy. */
956 
957  return NULL;
958 }
959 
960 
961 /* JVM_IsArrayClass */
962 
963 jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
964 {
965  classinfo *c;
966 
967  TRACEJVMCALLS(("JVM_IsArrayClass(env=%p, cls=%p)", env, cls));
968 
969  c = LLNI_classinfo_unwrap(cls);
970 
971  return class_is_array(c);
972 }
973 
974 
975 /* JVM_IsPrimitiveClass */
976 
977 jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
978 {
979  classinfo *c;
980 
981  TRACEJVMCALLS(("JVM_IsPrimitiveClass(env=%p, cls=%p)", env, cls));
982 
983  c = LLNI_classinfo_unwrap(cls);
984 
985  return class_is_primitive(c);
986 }
987 
988 
989 /* JVM_GetComponentType */
990 
992 {
993  classinfo *component;
994  classinfo *c;
995 
996  TRACEJVMCALLS(("JVM_GetComponentType(env=%p, cls=%p)", env, cls));
997 
998  c = LLNI_classinfo_unwrap(cls);
999 
1000  component = class_get_componenttype(c);
1001 
1002  return (jclass) LLNI_classinfo_wrap(component);
1003 }
1004 
1005 
1006 /* JVM_GetClassModifiers */
1007 
1009 {
1010  classinfo *c;
1011  int32_t flags;
1012 
1013  TRACEJVMCALLS(("JVM_GetClassModifiers(env=%p, cls=%p)", env, cls));
1014 
1015  c = LLNI_classinfo_unwrap(cls);
1016 
1017  flags = class_get_modifiers(c, false);
1018 
1019  return flags;
1020 }
1021 
1022 
1023 /* JVM_GetDeclaredClasses */
1024 
1026 {
1027  classinfo *c;
1029 
1030  TRACEJVMCALLS(("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass));
1031 
1032  c = LLNI_classinfo_unwrap(ofClass);
1033 
1034  oa = class_get_declaredclasses(c, false);
1035 
1036  return oa;
1037 }
1038 
1039 
1040 /* JVM_GetDeclaringClass */
1041 
1043 {
1044  classinfo *c;
1045  classinfo *dc;
1046 
1047  TRACEJVMCALLS(("JVM_GetDeclaringClass(env=%p, ofClass=%p)", env, ofClass));
1048 
1049  c = LLNI_classinfo_unwrap(ofClass);
1050 
1051  dc = class_get_declaringclass(c);
1052 
1053  return (jclass) LLNI_classinfo_wrap(dc);
1054 }
1055 
1056 
1057 /* JVM_GetClassSignature */
1058 
1060 {
1061  TRACEJVMCALLS(("JVM_GetClassSignature(env=%p, cls=%p)", env, cls));
1062 
1063  classinfo *c = LLNI_classinfo_unwrap(cls);
1064 
1065  /* Get the signature of the class. */
1066 
1068 
1069  if (u == NULL)
1070  return NULL;
1071 
1072  /* Convert UTF-string to a Java-string. */
1073 
1074  return (jstring) JavaString::from_utf8(u);
1075 }
1076 
1077 
1078 /* JVM_GetClassAnnotations */
1079 
1081 {
1082  TRACEJVMCALLS(("JVM_GetClassAnnotations(env=%p, cls=%p)", env, cls));
1083 
1084  if (cls == NULL) {
1086  return NULL;
1087  }
1088 
1089  classinfo* c = LLNI_classinfo_unwrap(cls);
1090 
1091  /* get annotations: */
1093 
1094  return (jbyteArray) annotations;
1095 }
1096 
1097 
1098 /* JVM_GetFieldAnnotations */
1099 
1101 {
1102  TRACEJVMCALLS(("JVM_GetFieldAnnotations(env=%p, field=%p)", env, field));
1103 
1104  java_lang_reflect_Field jlrf(field);
1105 
1106  if (jlrf.is_null()) {
1108  return NULL;
1109  }
1110 
1111  return (jbyteArray) jlrf.get_annotations();
1112 }
1113 
1114 
1115 /* JVM_GetMethodAnnotations */
1116 
1118 {
1119  TRACEJVMCALLS(("JVM_GetMethodAnnotations(env=%p, method=%p)", env, method));
1120 
1121  java_lang_reflect_Method jlrm(method);
1122 
1123  if (jlrm.is_null()) {
1125  return NULL;
1126  }
1127 
1128  return (jbyteArray) jlrm.get_annotations();
1129 }
1130 
1131 
1132 /* JVM_GetMethodDefaultAnnotationValue */
1133 
1135 {
1136  TRACEJVMCALLS(("JVM_GetMethodDefaultAnnotationValue(env=%p, method=%p)", env, method));
1137 
1138  java_lang_reflect_Method jlrm(method);
1139 
1140  if (jlrm.is_null()) {
1142  return NULL;
1143  }
1144 
1145  return (jbyteArray) jlrm.get_annotationDefault();
1146 }
1147 
1148 
1149 /* JVM_GetMethodParameterAnnotations */
1150 
1152 {
1153  TRACEJVMCALLS(("JVM_GetMethodParameterAnnotations(env=%p, method=%p)", env, method));
1154 
1155  java_lang_reflect_Method jlrm(method);
1156 
1157  if (jlrm.is_null()) {
1159  return NULL;
1160  }
1161 
1162  return (jbyteArray) jlrm.get_parameterAnnotations();
1163 }
1164 
1165 
1166 /* JVM_GetClassDeclaredFields */
1167 
1168 jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1169 {
1170  classinfo *c;
1172 
1173  TRACEJVMCALLS(("JVM_GetClassDeclaredFields(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1174 
1175  c = LLNI_classinfo_unwrap(ofClass);
1176 
1177  oa = class_get_declaredfields(c, publicOnly);
1178 
1179  return oa;
1180 }
1181 
1182 
1183 /* JVM_GetClassDeclaredMethods */
1184 
1185 jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1186 {
1187  TRACEJVMCALLS(("JVM_GetClassDeclaredMethods(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1188 
1189  classinfo* c = LLNI_classinfo_unwrap(ofClass);
1190 
1192 
1193  return oa;
1194 }
1195 
1196 
1197 /* JVM_GetClassDeclaredConstructors */
1198 
1199 jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
1200 {
1201  classinfo *c;
1203 
1204  TRACEJVMCALLS(("JVM_GetClassDeclaredConstructors(env=%p, ofClass=%p, publicOnly=%d)", env, ofClass, publicOnly));
1205 
1206  c = LLNI_classinfo_unwrap(ofClass);
1207 
1208  oa = class_get_declaredconstructors(c, publicOnly);
1209 
1210  return oa;
1211 }
1212 
1213 
1214 /* JVM_GetClassAccessFlags */
1215 
1217 {
1218  classinfo *c;
1219 
1220  TRACEJVMCALLS(("JVM_GetClassAccessFlags(env=%p, cls=%p)", env, cls));
1221 
1222  c = LLNI_classinfo_unwrap(cls);
1223 
1224  /* Primitive type classes have the correct access flags. */
1225 
1226  return c->flags & ACC_CLASS_REFLECT_MASK;
1227 }
1228 
1229 
1230 /* JVM_GetClassConstantPool */
1231 
1233 {
1234 #if defined(ENABLE_ANNOTATIONS)
1235  TRACEJVMCALLS(("JVM_GetClassConstantPool(env=%p, cls=%p)", env, cls));
1236 
1238  sun_reflect_ConstantPool cp(h, cls);
1239 
1240  if (cp.is_null()) {
1241  return NULL;
1242  }
1243 
1244  return (jobject) cp.get_handle();
1245 #else
1246  log_println("JVM_GetClassConstantPool(env=%p, cls=%p): not implemented in this configuration!", env, cls);
1247  return NULL;
1248 #endif
1249 }
1250 
1251 
1252 /* JVM_ConstantPoolGetSize */
1253 
1254 jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
1255 {
1256  classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1257 
1258  TRACEJVMCALLS(("JVM_ConstantPoolGetSize(env=%p, unused=%p, jcpool=%p)", env, unused, jcpool));
1259 
1260  c = LLNI_classinfo_unwrap(jcpool);
1261 
1262  return c->cpcount;
1263 }
1264 
1265 
1266 /* JVM_ConstantPoolGetClassAt */
1267 
1269 {
1270  constant_classref *ref; /* classref to the class at constant pool index 'index' */
1271  classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1272  classinfo *result; /* classinfo of the class at constant pool index 'index' */
1273 
1274  TRACEJVMCALLS(("JVM_ConstantPoolGetClassAt(env=%p, jcpool=%p, index=%d)", env, jcpool, index));
1275 
1276  c = LLNI_classinfo_unwrap(jcpool);
1277 
1278  ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1279 
1280  if (ref == NULL) {
1282  return NULL;
1283  }
1284 
1285  result = resolve_classref_eager(ref);
1286 
1287  return (jclass) LLNI_classinfo_wrap(result);
1288 }
1289 
1290 
1291 /* JVM_ConstantPoolGetClassAtIfLoaded */
1292 
1294 {
1295  constant_classref *ref; /* classref to the class at constant pool index 'index' */
1296  classinfo *c; /* classinfo of the class for which 'this' is the constant pool */
1297  classinfo *result; /* classinfo of the class at constant pool index 'index' */
1298 
1299  TRACEJVMCALLS(("JVM_ConstantPoolGetClassAtIfLoaded(env=%p, unused=%p, jcpool=%p, index=%d)", env, unused, jcpool, index));
1300 
1301  c = LLNI_classinfo_unwrap(jcpool);
1302 
1303  ref = (constant_classref *) class_getconstant(c, index, CONSTANT_Class);
1304 
1305  if (ref == NULL) {
1307  return NULL;
1308  }
1309 
1310  if (!resolve_classref(NULL, ref, resolveLazy, true, true, &result)) {
1311  return NULL;
1312  }
1313 
1314  if ((result == NULL) || !(result->state & CLASS_LOADED)) {
1315  return NULL;
1316  }
1317 
1318  return (jclass) LLNI_classinfo_wrap(result);
1319 }
1320 
1321 
1322 /* JVM_ConstantPoolGetMethodAt */
1323 
1325 {
1326  constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1327  classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1328 
1329  TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index));
1330 
1331  cls = LLNI_classinfo_unwrap(jcpool);
1333 
1334  if (ref == NULL) {
1336  return NULL;
1337  }
1338 
1339  // Create a new java.lang.reflect.Method Java object.
1340  /* XXX: is that right? or do I have to use resolve_method_*? */
1341  java_lang_reflect_Method jlrm(ref->p.method);
1342 
1343  return (jobject) jlrm.get_handle();
1344 }
1345 
1346 
1347 /* JVM_ConstantPoolGetMethodAtIfLoaded */
1348 
1350 {
1351  constant_FMIref *ref; /* reference to the method in constant pool at index 'index' */
1352  classinfo *c = NULL; /* resolved declaring class of the method */
1353  classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1354 
1355  TRACEJVMCALLS(("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1356 
1357  cls = LLNI_classinfo_unwrap(jcpool);
1359 
1360  if (ref == NULL) {
1362  return NULL;
1363  }
1364 
1365  if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1366  return NULL;
1367  }
1368 
1369  if (c == NULL || !(c->state & CLASS_LOADED)) {
1370  return NULL;
1371  }
1372 
1373  // Create a new java.lang.reflect.Method Java object.
1374  java_lang_reflect_Method jlrm(ref->p.method);
1375 
1376  return (jobject) jlrm.get_handle();
1377 }
1378 
1379 
1380 /* JVM_ConstantPoolGetFieldAt */
1381 
1383 {
1384  constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1385  classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1386 
1387  TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index));
1388 
1389  cls = LLNI_classinfo_unwrap(jcpool);
1391 
1392  if (ref == NULL) {
1394  return NULL;
1395  }
1396 
1397  // Create a new java.lang.reflect.Field Java object.
1398  java_lang_reflect_Field jlrf(ref->p.field);
1399 
1400  return (jobject) jlrf.get_handle();
1401 }
1402 
1403 
1404 /* JVM_ConstantPoolGetFieldAtIfLoaded */
1405 
1407 {
1408  constant_FMIref *ref; /* reference to the field in constant pool at index 'index' */
1409  classinfo *c; /* resolved declaring class for the field */
1410  classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1411 
1412  TRACEJVMCALLS(("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index));
1413 
1414  cls = LLNI_classinfo_unwrap(jcpool);
1416 
1417  if (ref == NULL) {
1419  return NULL;
1420  }
1421 
1422  if (!resolve_classref(NULL, ref->p.classref, resolveLazy, true, true, &c)) {
1423  return NULL;
1424  }
1425 
1426  if (c == NULL || !(c->state & CLASS_LOADED)) {
1427  return NULL;
1428  }
1429 
1430  // Create a new java.lang.reflect.Field Java object.
1431  java_lang_reflect_Field jlrf(ref->p.field);
1432 
1433  return (jobject) jlrf.get_handle();
1434 }
1435 
1436 
1437 /* JVM_ConstantPoolGetMemberRefInfoAt */
1438 
1440 {
1441  log_println("JVM_ConstantPoolGetMemberRefInfoAt: jcpool=%p, index=%d, IMPLEMENT ME!", jcpool, index);
1442 
1443  /* TODO: implement. (this is yet unused be OpenJDK but, so very low priority) */
1444 
1445  return NULL;
1446 }
1447 
1448 
1449 /* JVM_ConstantPoolGetIntAt */
1450 
1451 jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1452 {
1453  TRACEJVMCALLS(("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index));
1454 
1455  classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1456  int32_t *ref = (int32_t*) class_getconstant(cls, index, CONSTANT_Integer);
1457 
1458  if (ref == NULL) {
1460  return 0;
1461  }
1462 
1463  return *ref;
1464 }
1465 
1466 
1467 /* JVM_ConstantPoolGetLongAt */
1468 
1469 jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1470 {
1471  TRACEJVMCALLS(("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index));
1472 
1473  classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1474  int64_t *ref = (int64_t*) class_getconstant(cls, index, CONSTANT_Long);
1475 
1476  if (ref == NULL) {
1478  return 0;
1479  }
1480 
1481  return *ref;
1482 }
1483 
1484 
1485 /* JVM_ConstantPoolGetFloatAt */
1486 
1487 jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1488 {
1489  TRACEJVMCALLS(("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index));
1490 
1491  classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1492  float *ref = (float*) class_getconstant(cls, index, CONSTANT_Float);
1493 
1494  if (ref == NULL) {
1496  return 0;
1497  }
1498 
1499  return *ref;
1500 }
1501 
1502 
1503 /* JVM_ConstantPoolGetDoubleAt */
1504 
1505 jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
1506 {
1507  TRACEJVMCALLS(("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index));
1508 
1509  classinfo *cls = LLNI_classinfo_unwrap(jcpool);
1510  double *ref = (double*) class_getconstant(cls, index, CONSTANT_Double);
1511 
1512  if (ref == NULL) {
1514  return 0;
1515  }
1516 
1517  return *ref;
1518 }
1519 
1520 
1521 /* JVM_ConstantPoolGetStringAt */
1522 
1524 {
1525  Utf8String ref; /* utf object for the string in constant pool at index 'index' */
1526  classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1527 
1528  TRACEJVMCALLS(("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index));
1529 
1530  cls = LLNI_classinfo_unwrap(jcpool);
1531  ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
1532 
1533  if (ref == NULL) {
1535  return NULL;
1536  }
1537 
1538  /* XXX: I hope JavaString::literal is the right Function. */
1539  return (jstring)JavaString::literal(ref);
1540 }
1541 
1542 
1543 /* JVM_ConstantPoolGetUTF8At */
1544 
1546 {
1547  Utf8String ref; /* utf object for the utf8 data in constant pool at index 'index' */
1548  classinfo *cls; /* classinfo of the class for which 'this' is the constant pool */
1549 
1550  TRACEJVMCALLS(("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index));
1551 
1552  cls = LLNI_classinfo_unwrap(jcpool);
1553  ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
1554 
1555  if (ref == NULL) {
1557  return NULL;
1558  }
1559 
1560  /* XXX: I hope JavaString::literal is the right Function. */
1561  return (jstring)JavaString::literal(ref);
1562 }
1563 
1564 
1565 /* JVM_DesiredAssertionStatus */
1566 
1567 jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
1568 {
1569 #if defined(ENABLE_ASSERTION)
1570  classinfo *c;
1571  jboolean status;
1572 
1573  TRACEJVMCALLS(("JVM_DesiredAssertionStatus(env=%p, unused=%p, cls=%p)", env, unused, cls));
1574 
1575  c = LLNI_classinfo_unwrap(cls);
1576 
1577  if (c->classloader == NULL) {
1578  status = (jboolean)assertion_system_enabled;
1579  }
1580  else {
1581  status = (jboolean)assertion_user_enabled;
1582  }
1583 
1584  if (list_assertion_names != NULL) {
1586  it != list_assertion_names->end(); it++) {
1587  assertion_name_t* item = *it;
1588 
1590  if (name == c->packagename) {
1591  status = (jboolean)item->enabled;
1592  }
1593  else if (name == c->name) {
1594  status = (jboolean)item->enabled;
1595  }
1596  }
1597  }
1598 
1599  return status;
1600 #else
1601  return (jboolean)false;
1602 #endif
1603 }
1604 
1605 
1606 /* JVM_AssertionStatusDirectives */
1607 
1609 {
1610 #if defined(ENABLE_ASSERTION)
1611  java_handle_t* js;
1612  s4 i, j;
1613 #endif
1614 
1615  TRACEJVMCALLS(("JVM_AssertionStatusDirectives(env=%p, unused=%p)", env, unused));
1616 
1617 #if defined(ENABLE_ASSERTION)
1619 #else
1620  ObjectArray classes(0, class_java_lang_Object);
1621 #endif
1622  if (classes.is_null())
1623  return NULL;
1624 
1625 #if defined(ENABLE_ASSERTION)
1627 #else
1629 #endif
1630  if (packages.is_null())
1631  return NULL;
1632 
1633 #if defined(ENABLE_ASSERTION)
1634  BooleanArray classEnabled(assertion_class_count);
1635 #else
1636  BooleanArray classEnabled(0);
1637 #endif
1638  if (classEnabled.is_null())
1639  return NULL;
1640 
1641 #if defined(ENABLE_ASSERTION)
1642  BooleanArray packageEnabled(assertion_package_count);
1643 #else
1644  BooleanArray packageEnabled(0);
1645 #endif
1646  if (packageEnabled.is_null())
1647  return NULL;
1648 
1649 #if defined(ENABLE_ASSERTION)
1650  /* initialize arrays */
1651 
1652  if (list_assertion_names != NULL) {
1653  i = 0;
1654  j = 0;
1655 
1656  for (List<assertion_name_t*>::iterator it = list_assertion_names->begin(); it != list_assertion_names->end(); it++) {
1657  assertion_name_t* item = *it;
1658 
1659  js = JavaString::from_utf8(item->name);
1660  if (js == NULL) {
1661  return NULL;
1662  }
1663 
1664  if (item->package == false) {
1665  classes.set_element(i, js);
1666  classEnabled.set_element(i, (jboolean) item->enabled);
1667  i += 1;
1668  }
1669  else {
1670  packages.set_element(j, js);
1671  packageEnabled.set_element(j, (jboolean) item->enabled);
1672  j += 1;
1673  }
1674  }
1675  }
1676 #endif
1677 
1678  /* set instance fields */
1679 
1680  java_lang_AssertionStatusDirectives jlasd(
1681  classes.get_handle(),
1682  classEnabled.get_handle(),
1683  packages.get_handle(),
1684  packageEnabled.get_handle());
1685 
1686  return (jobject) jlasd.get_handle();
1687 }
1688 
1689 
1690 /* JVM_GetClassNameUTF */
1691 
1692 const char *JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
1693 {
1694  log_println("JVM_GetClassNameUTF: IMPLEMENT ME!");
1695 
1696  return NULL;
1697 }
1698 
1699 
1700 /* JVM_GetClassCPTypes */
1701 
1702 void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
1703 {
1704  log_println("JVM_GetClassCPTypes: IMPLEMENT ME!");
1705 }
1706 
1707 
1708 /* JVM_GetClassCPEntriesCount */
1709 
1711 {
1712  log_println("JVM_GetClassCPEntriesCount: IMPLEMENT ME!");
1713 
1714  return 0;
1715 }
1716 
1717 
1718 /* JVM_GetClassFieldsCount */
1719 
1721 {
1722  log_println("JVM_GetClassFieldsCount: IMPLEMENT ME!");
1723 
1724  return 0;
1725 }
1726 
1727 
1728 /* JVM_GetClassMethodsCount */
1729 
1731 {
1732  log_println("JVM_GetClassMethodsCount: IMPLEMENT ME!");
1733 
1734  return 0;
1735 }
1736 
1737 
1738 /* JVM_GetMethodIxExceptionIndexes */
1739 
1740 void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
1741 {
1742  log_println("JVM_GetMethodIxExceptionIndexes: IMPLEMENT ME!");
1743 }
1744 
1745 
1746 /* JVM_GetMethodIxExceptionsCount */
1747 
1748 jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
1749 {
1750  log_println("JVM_GetMethodIxExceptionsCount: IMPLEMENT ME!");
1751 
1752  return 0;
1753 }
1754 
1755 
1756 /* JVM_GetMethodIxByteCode */
1757 
1758 void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
1759 {
1760  log_println("JVM_GetMethodIxByteCode: IMPLEMENT ME!");
1761 }
1762 
1763 
1764 /* JVM_GetMethodIxByteCodeLength */
1765 
1766 jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
1767 {
1768  log_println("JVM_GetMethodIxByteCodeLength: IMPLEMENT ME!");
1769 
1770  return 0;
1771 }
1772 
1773 
1774 /* JVM_GetMethodIxExceptionTableEntry */
1775 
1776 void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
1777 {
1778  log_println("JVM_GetMethodIxExceptionTableEntry: IMPLEMENT ME!");
1779 }
1780 
1781 
1782 /* JVM_GetMethodIxExceptionTableLength */
1783 
1784 jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
1785 {
1786  log_println("JVM_GetMethodIxExceptionTableLength: IMPLEMENT ME!");
1787 
1788  return 0;
1789 }
1790 
1791 
1792 /* JVM_GetMethodIxModifiers */
1793 
1794 jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
1795 {
1796  log_println("JVM_GetMethodIxModifiers: IMPLEMENT ME!");
1797 
1798  return 0;
1799 }
1800 
1801 
1802 /* JVM_GetFieldIxModifiers */
1803 
1804 jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
1805 {
1806  log_println("JVM_GetFieldIxModifiers: IMPLEMENT ME!");
1807 
1808  return 0;
1809 }
1810 
1811 
1812 /* JVM_GetMethodIxLocalsCount */
1813 
1814 jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
1815 {
1816  log_println("JVM_GetMethodIxLocalsCount: IMPLEMENT ME!");
1817 
1818  return 0;
1819 }
1820 
1821 
1822 /* JVM_GetMethodIxArgsSize */
1823 
1824 jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
1825 {
1826  log_println("JVM_GetMethodIxArgsSize: IMPLEMENT ME!");
1827 
1828  return 0;
1829 }
1830 
1831 
1832 /* JVM_GetMethodIxMaxStack */
1833 
1834 jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
1835 {
1836  log_println("JVM_GetMethodIxMaxStack: IMPLEMENT ME!");
1837 
1838  return 0;
1839 }
1840 
1841 
1842 /* JVM_IsConstructorIx */
1843 
1844 jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
1845 {
1846  log_println("JVM_IsConstructorIx: IMPLEMENT ME!");
1847 
1848  return 0;
1849 }
1850 
1851 
1852 /* JVM_GetMethodIxNameUTF */
1853 
1854 const char *JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
1855 {
1856  log_println("JVM_GetMethodIxNameUTF: IMPLEMENT ME!");
1857 
1858  return NULL;
1859 }
1860 
1861 
1862 /* JVM_GetMethodIxSignatureUTF */
1863 
1864 const char *JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
1865 {
1866  log_println("JVM_GetMethodIxSignatureUTF: IMPLEMENT ME!");
1867 
1868  return NULL;
1869 }
1870 
1871 
1872 /* JVM_GetCPFieldNameUTF */
1873 
1874 const char *JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1875 {
1876  log_println("JVM_GetCPFieldNameUTF: IMPLEMENT ME!");
1877 
1878  return NULL;
1879 }
1880 
1881 
1882 /* JVM_GetCPMethodNameUTF */
1883 
1884 const char *JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1885 {
1886  log_println("JVM_GetCPMethodNameUTF: IMPLEMENT ME!");
1887 
1888  return NULL;
1889 }
1890 
1891 
1892 /* JVM_GetCPMethodSignatureUTF */
1893 
1894 const char *JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1895 {
1896  log_println("JVM_GetCPMethodSignatureUTF: IMPLEMENT ME!");
1897 
1898  return NULL;
1899 }
1900 
1901 
1902 /* JVM_GetCPFieldSignatureUTF */
1903 
1904 const char *JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
1905 {
1906  log_println("JVM_GetCPFieldSignatureUTF: IMPLEMENT ME!");
1907 
1908  return NULL;
1909 }
1910 
1911 
1912 /* JVM_GetCPClassNameUTF */
1913 
1914 const char *JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1915 {
1916  log_println("JVM_GetCPClassNameUTF: IMPLEMENT ME!");
1917 
1918  return NULL;
1919 }
1920 
1921 
1922 /* JVM_GetCPFieldClassNameUTF */
1923 
1924 const char *JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1925 {
1926  log_println("JVM_GetCPFieldClassNameUTF: IMPLEMENT ME!");
1927 
1928  return NULL;
1929 }
1930 
1931 
1932 /* JVM_GetCPMethodClassNameUTF */
1933 
1934 const char *JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
1935 {
1936  log_println("JVM_GetCPMethodClassNameUTF: IMPLEMENT ME!");
1937 
1938  return NULL;
1939 }
1940 
1941 
1942 /* JVM_GetCPFieldModifiers */
1943 
1944 jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1945 {
1946  log_println("JVM_GetCPFieldModifiers: IMPLEMENT ME!");
1947 
1948  return 0;
1949 }
1950 
1951 
1952 /* JVM_GetCPMethodModifiers */
1953 
1954 jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
1955 {
1956  log_println("JVM_GetCPMethodModifiers: IMPLEMENT ME!");
1957 
1958  return 0;
1959 }
1960 
1961 
1962 /* JVM_ReleaseUTF */
1963 
1964 void JVM_ReleaseUTF(const char *utf)
1965 {
1966  log_println("JVM_ReleaseUTF: IMPLEMENT ME!");
1967 }
1968 
1969 
1970 /* JVM_IsSameClassPackage */
1971 
1972 jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
1973 {
1974  log_println("JVM_IsSameClassPackage: IMPLEMENT ME!");
1975 
1976  return 0;
1977 }
1978 
1979 
1980 /* JVM_Open */
1981 #ifdef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
1982 /* Taken from openjdk/jdk/src/solaris/hpi/src/system_md.c of openjdk6 */
1983 
1984 int sysFfileMode(int fd, int *mode)
1985 {
1986  struct stat64 buf64;
1987  int ret = fstat64(fd, &buf64);
1988  (*mode) = buf64.st_mode;
1989  return ret;
1990 }
1991 
1992 int open64_w(const char *path, int oflag, int mode)
1993 {
1994  int fd = open64(path, oflag, mode);
1995  if (fd == -1) return -1;
1996 
1997  /* If the open succeeded, the file might still be a directory */
1998  {
1999  int st_mode;
2000  if (sysFfileMode(fd, &st_mode) != -1) {
2001  if ((st_mode & S_IFMT) == S_IFDIR) {
2002  errno = EISDIR;
2003  close(fd);
2004  return -1;
2005  }
2006  } else {
2007  close(fd);
2008  return -1;
2009  }
2010  }
2011 
2012  /*
2013  * All file descriptors that are opened in the JVM and not
2014  * specifically destined for a subprocess should have the
2015  * close-on-exec flag set. If we don't set it, then careless 3rd
2016  * party native code might fork and exec without closing all
2017  * appropriate file descriptors (e.g. as we do in closeDescriptors in
2018  * UNIXProcess.c), and this in turn might:
2019  *
2020  * - cause end-of-file to fail to be detected on some file
2021  * descriptors, resulting in mysterious hangs, or
2022  *
2023  * - might cause an fopen in the subprocess to fail on a system
2024  * suffering from bug 1085341.
2025  *
2026  * (Yes, the default setting of the close-on-exec flag is a Unix
2027  * design flaw)
2028  *
2029  * See:
2030  * 1085341: 32-bit stdio routines should support file descriptors >255
2031  * 4843136: (process) pipe file descriptor from Runtime.exec not being closed
2032  * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9
2033  */
2034 #ifdef FD_CLOEXEC
2035  {
2036  int flags = fcntl(fd, F_GETFD);
2037  if (flags != -1)
2038  fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
2039  }
2040 #endif
2041  return fd;
2042 }
2043 
2044 static jint _JVM_SocketAvailable(jint fd, jint *pbytes);
2045 
2046 #ifndef O_DELETE
2047 #define O_DELETE 0x10000
2048 #endif
2049 /*
2050  * Open a file. Unlink the file immediately after open returns
2051  * if the specified oflag has the O_DELETE flag set.
2052  */
2053 int sysOpen(const char *path, int oflag, int mode)
2054 {
2055  int fd;
2056  int del = (oflag & O_DELETE);
2057  oflag = oflag & ~O_DELETE;
2058  fd = open64_w(path, oflag, mode);
2059  if (del != 0) {
2060  unlink(path);
2061  }
2062  return fd;
2063 }
2064 #endif
2065 
2066 /* Taken from: hotspot/src/share/vm/prims/jvm.h */
2067 
2068 /*
2069  * JVM I/O error codes
2070  */
2071 #define JVM_EEXIST -100
2072 
2073 jint JVM_Open(const char* fname, jint flags, jint mode)
2074 {
2075  int result;
2076 
2077  TRACEJVMCALLS(("JVM_Open(fname=%s, flags=%d, mode=%d)", fname, flags, mode));
2078 
2079 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
2080  HPI& hpi = VM::get_current()->get_hpi();
2081  result = hpi.get_file().Open(fname, flags, mode);
2082 #else
2083  result = sysOpen(fname, flags, mode);
2084 #endif
2085 
2086  if (result >= 0) {
2087  return result;
2088  }
2089  else {
2090  switch (errno) {
2091  case EEXIST:
2092  return JVM_EEXIST;
2093  default:
2094  return -1;
2095  }
2096  }
2097 }
2098 
2099 
2100 /* JVM_Close */
2101 
2102 jint JVM_Close(jint fd)
2103 {
2104  TRACEJVMCALLS(("JVM_Close(fd=%d)", fd));
2105 
2106 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
2107  HPI& hpi = VM::get_current()->get_hpi();
2108  return hpi.get_file().Close(fd);
2109 #else
2110  return close(fd);
2111 #endif
2112 }
2113 
2114 
2115 /* JVM_Read */
2116 
2117 jint JVM_Read(jint fd, char* buf, jint nbytes)
2118 {
2119  TRACEJVMCALLS(("JVM_Read(fd=%d, buf=%p, nbytes=%d)", fd, buf, nbytes));
2120 
2121 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
2122  HPI& hpi = VM::get_current()->get_hpi();
2123  return (jint) hpi.get_file().Read(fd, buf, nbytes);
2124 #else
2125  return read(fd, buf, nbytes);
2126 #endif
2127 }
2128 
2129 
2130 /* JVM_Write */
2131 
2132 jint JVM_Write(jint fd, char* buf, jint nbytes)
2133 {
2134  TRACEJVMCALLS(("JVM_Write(fd=%d, buf=%s, nbytes=%d)", fd, buf, nbytes));
2135 
2136 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
2137  HPI& hpi = VM::get_current()->get_hpi();
2138  return (jint) hpi.get_file().Write(fd, buf, nbytes);
2139 #else
2140  return write(fd,buf,nbytes);
2141 #endif
2142 }
2143 
2144 
2145 /* JVM_Available */
2146 
2147 jint JVM_Available(jint fd, jlong* pbytes)
2148 {
2149  TRACEJVMCALLS(("JVM_Available(fd=%d, pbytes=%p)", fd, pbytes));
2150 
2151 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
2152  HPI& hpi = VM::get_current()->get_hpi();
2153  return hpi.get_file().Available(fd, pbytes);
2154 #else
2155  off64_t cur, end;
2156  int mode;
2157 
2158  if (sysFfileMode(fd, &mode) >= 0)
2159  if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) {
2160  jint bytes;
2161  if (_JVM_SocketAvailable(fd, &bytes)) {
2162  *pbytes = bytes;
2163  return 1;
2164  }
2165  }
2166  if ((cur = lseek64(fd, 0L, SEEK_CUR)) == -1)
2167  return 0;
2168  else if ((end = lseek64(fd, 0L, SEEK_END)) == -1)
2169  return 0;
2170  else if (lseek64(fd, cur, SEEK_SET) == -1)
2171  return 0;
2172  *pbytes = end - cur;
2173  return 1;
2174 #endif
2175 }
2176 
2177 
2178 /* JVM_Lseek */
2179 
2180 jlong JVM_Lseek(jint fd, jlong offset, jint whence)
2181 {
2182  TRACEJVMCALLS(("JVM_Lseek(fd=%d, offset=%ld, whence=%d)", fd, offset, whence));
2183 
2184 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
2185  HPI& hpi = VM::get_current()->get_hpi();
2186  return hpi.get_file().Seek(fd, (off_t) offset, whence);
2187 #else
2188  return lseek64(fd, (off_t) offset, whence);
2189 #endif
2190 }
2191 
2192 
2193 /* JVM_SetLength */
2194 
2195 jint JVM_SetLength(jint fd, jlong length)
2196 {
2197  TRACEJVMCALLS(("JVM_SetLength(fd=%d, length=%ld)", length));
2198 
2199 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
2200  HPI& hpi = VM::get_current()->get_hpi();
2201  return hpi.get_file().SetLength(fd, length);
2202 #else
2203  return ftruncate64(fd, length);
2204 #endif
2205 }
2206 
2207 
2208 /* JVM_Sync */
2209 
2210 jint JVM_Sync(jint fd)
2211 {
2212  TRACEJVMCALLS(("JVM_Sync(fd=%d)", fd));
2213 
2214 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
2215  HPI& hpi = VM::get_current()->get_hpi();
2216  return hpi.get_file().Sync(fd);
2217 #else
2218  return fsync(fd);
2219 #endif
2220 }
2221 
2222 
2223 /* JVM_StartThread */
2224 
2226 {
2227  TRACEJVMCALLS(("JVM_StartThread(env=%p, jthread=%p)", env, jthread));
2228 
2229  threads_thread_start((java_handle_t *) jthread);
2230 }
2231 
2232 
2233 /* JVM_StopThread */
2234 
2236 {
2237  log_println("JVM_StopThread: Deprecated. Not implemented.");
2238 }
2239 
2240 
2241 /* JVM_IsThreadAlive */
2242 
2244 {
2245  java_handle_t *h;
2246  threadobject *t;
2247  bool result;
2248 
2249  TRACEJVMCALLS(("JVM_IsThreadAlive(env=%p, jthread=%p)", env, jthread));
2250 
2251  h = (java_handle_t *) jthread;
2252  t = thread_get_thread(h);
2253 
2254  /* The threadobject is null when a thread is created in Java. */
2255 
2256  if (t == NULL)
2257  return 0;
2258 
2259  result = threads_thread_is_alive(t);
2260 
2261  return result;
2262 }
2263 
2264 
2265 /* JVM_SuspendThread */
2266 
2268 {
2269  java_handle_t *h;
2270  threadobject *t;
2271 
2272  TRACEJVMCALLS(("JVM_SuspendThread(env=%p, jthread=%p)", env, jthread));
2273 
2274  if (opt_PrintWarnings)
2275  log_println("JVM_SuspendThread: Deprecated, do not use!");
2276 
2277  h = (java_handle_t *) jthread;
2278  t = thread_get_thread(h);
2279 
2280  /* The threadobject is null when a thread is created in Java. */
2281 
2282  if (t == NULL)
2283  return;
2284 
2286 }
2287 
2288 
2289 /* JVM_ResumeThread */
2290 
2292 {
2293  java_handle_t *h;
2294  threadobject *t;
2295 
2296  TRACEJVMCALLS(("JVM_ResumeThread(env=%p, jthread=%p)", env, jthread));
2297 
2298  if (opt_PrintWarnings)
2299  log_println("JVM_ResumeThread: Deprecated, do not use!");
2300 
2301  h = (java_handle_t *) jthread;
2302  t = thread_get_thread(h);
2303 
2304  /* The threadobject is null when a thread is created in Java. */
2305 
2306  if (t == NULL)
2307  return;
2308 
2310 }
2311 
2312 
2313 /* JVM_SetThreadPriority */
2314 
2316 {
2317  java_handle_t *h;
2318  threadobject *t;
2319 
2320  TRACEJVMCALLS(("JVM_SetThreadPriority(env=%p, jthread=%p, prio=%d)", env, jthread, prio));
2321 
2322  h = (java_handle_t *) jthread;
2323  t = thread_get_thread(h);
2324 
2325  /* The threadobject is null when a thread is created in Java. The
2326  priority is set later during startup. */
2327 
2328  if (t == NULL)
2329  return;
2330 
2331  threads_set_thread_priority(t, prio);
2332 }
2333 
2334 
2335 /* JVM_SetNativeThreadName */
2336 
2338 {
2339  TRACEJVMCALLS(("JVM_SetNativeThreadName(env=%p, cls=%p, name=%p)", env, cls, name));
2340 }
2341 
2342 
2343 /* JVM_Yield */
2344 
2345 void JVM_Yield(JNIEnv *env, jclass threadClass)
2346 {
2347  TRACEJVMCALLS(("JVM_Yield(env=%p, threadClass=%p)", env, threadClass));
2348 
2349  threads_yield();
2350 }
2351 
2352 
2353 /* JVM_Sleep */
2354 
2355 void JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis)
2356 {
2357  TRACEJVMCALLS(("JVM_Sleep(env=%p, threadClass=%p, millis=%ld)", env, threadClass, millis));
2358 
2359  threads_sleep(millis, 0);
2360 }
2361 
2362 
2363 /* JVM_CurrentThread */
2364 
2366 {
2367  java_object_t *o;
2368 
2369  TRACEJVMCALLSVERBOSE(("JVM_CurrentThread(env=%p, threadClass=%p)", env, threadClass));
2370 
2372 
2373  return (jobject) o;
2374 }
2375 
2376 
2377 /* JVM_CountStackFrames */
2378 
2380 {
2381  log_println("JVM_CountStackFrames: Deprecated. Not implemented.");
2382 
2383  return 0;
2384 }
2385 
2386 
2387 /* JVM_Interrupt */
2388 
2390 {
2391  java_handle_t *h;
2392  threadobject *t;
2393 
2394  TRACEJVMCALLS(("JVM_Interrupt(env=%p, jthread=%p)", env, jthread));
2395 
2396  h = (java_handle_t *) jthread;
2397  t = thread_get_thread(h);
2398 
2399  /* The threadobject is null when a thread is created in Java. */
2400 
2401  if (t == NULL)
2402  return;
2403 
2405 }
2406 
2407 
2408 /* JVM_IsInterrupted */
2409 
2410 jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted)
2411 {
2412  java_handle_t *h;
2413  threadobject *t;
2414  jboolean interrupted;
2415 
2416  TRACEJVMCALLS(("JVM_IsInterrupted(env=%p, jthread=%p, clear_interrupted=%d)", env, jthread, clear_interrupted));
2417 
2418  h = (java_handle_t *) jthread;
2419  t = thread_get_thread(h);
2420 
2421  /* The threadobject is null when a thread is created in Java. */
2422 
2423  if (t == NULL)
2424  return JNI_FALSE;
2425 
2426  interrupted = thread_is_interrupted(t);
2427 
2428  if (interrupted && clear_interrupted)
2429  thread_set_interrupted(t, false);
2430 
2431  return interrupted;
2432 }
2433 
2434 
2435 /* JVM_HoldsLock */
2436 
2437 jboolean JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj)
2438 {
2439  java_handle_t *h;
2440  bool result;
2441 
2442  TRACEJVMCALLS(("JVM_HoldsLock(env=%p, threadClass=%p, obj=%p)", env, threadClass, obj));
2443 
2444  h = (java_handle_t *) obj;
2445 
2446  if (h == NULL) {
2448  return JNI_FALSE;
2449  }
2450 
2451  result = lock_is_held_by_current_thread(h);
2452 
2453  return result;
2454 }
2455 
2456 
2457 /* JVM_DumpAllStacks */
2458 
2459 void JVM_DumpAllStacks(JNIEnv* env, jclass unused)
2460 {
2461  log_println("JVM_DumpAllStacks: IMPLEMENT ME!");
2462 }
2463 
2464 
2465 /* JVM_CurrentLoadedClass */
2466 
2468 {
2469  log_println("JVM_CurrentLoadedClass: IMPLEMENT ME!");
2470 
2471  return NULL;
2472 }
2473 
2474 
2475 /* JVM_CurrentClassLoader */
2476 
2478 {
2479  TRACEJVMCALLS(("JVM_CurrentClassLoader(env=%p)", env));
2480  PRINTJVMWARNINGS(("JVM_CurrentClassLoader is deprecated, do not use it."));
2481 
2483 }
2484 
2485 
2486 /* JVM_GetClassContext */
2487 
2489 {
2490  TRACEJVMCALLS(("JVM_GetClassContext(env=%p)", env));
2491 
2492  return stacktrace_getClassContext();
2493 }
2494 
2495 
2496 /* JVM_ClassDepth */
2497 
2499 {
2500  log_println("JVM_ClassDepth: IMPLEMENT ME!");
2501 
2502  return 0;
2503 }
2504 
2505 
2506 /* JVM_ClassLoaderDepth */
2507 
2509 {
2510  log_println("JVM_ClassLoaderDepth: IMPLEMENT ME!");
2511 
2512  return 0;
2513 }
2514 
2515 
2516 /* JVM_GetSystemPackage */
2517 
2519 {
2520  TRACEJVMCALLS(("JVM_GetSystemPackage(env=%p, name=%p)", env, name));
2521 
2522  Utf8String u_ = JavaString((java_handle_t*) name).to_utf8();
2523  // strip off trailing slash
2525  Utf8String result = Package::find(u);
2526 
2527  return (jstring) (result ? JavaString::from_utf8(result) : NULL);
2528 }
2529 
2530 
2531 /* JVM_GetSystemPackages */
2532 
2534 {
2535  TRACEJVMCALLS(("JVM_GetSystemPackages(env=%p)", env));
2536 
2538  const std::set<Utf8String> &packages(Package::packages());
2539  int num = packages.size();
2540 
2541  ObjectArray result(num, class_java_lang_String);
2542  std::set<Utf8String>::const_iterator it = packages.begin();
2543  for (int i=0; it != packages.end(); ++it, i++) {
2544  // Make up the format expected by OpenJDK -- slash-separated
2545  // with extra trailing slash
2546  std::vector<char> temp;
2547  temp.reserve(it->size() + 1);
2548  const char *end = it->end();
2549  for (const char *c = it->begin(); c != end; ++c)
2550  temp.push_back(*c == '.' ? '/' : *c);
2551  temp.push_back('/');
2552 
2553  JavaString package_name = JavaString::from_utf8(&temp[0], temp.size());
2554  java_handle_t *hs = package_name;
2555  if (!hs)
2556  return NULL;
2557  result.set_element(i, hs);
2558  }
2559  return result.get_handle();
2560 }
2561 
2562 
2563 /* JVM_AllocateNewObject */
2564 
2565 jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
2566 {
2567  log_println("JVM_AllocateNewObject: IMPLEMENT ME!");
2568 
2569  return NULL;
2570 }
2571 
2572 
2573 /* JVM_AllocateNewArray */
2574 
2576 {
2577  log_println("JVM_AllocateNewArray: IMPLEMENT ME!");
2578 
2579  return NULL;
2580 }
2581 
2582 
2583 /* JVM_LatestUserDefinedLoader */
2584 
2586 {
2587  TRACEJVMCALLS(("JVM_LatestUserDefinedLoader(env=%p)", env));
2588 
2590 }
2591 
2592 
2593 /* JVM_LoadClass0 */
2594 
2595 jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
2596 {
2597  log_println("JVM_LoadClass0: IMPLEMENT ME!");
2598 
2599  return NULL;
2600 }
2601 
2602 
2603 /* JVM_GetArrayLength */
2604 
2606 {
2607  TRACEJVMCALLS(("JVM_GetArrayLength(arr=%p)", arr));
2608 
2609  if (arr == NULL) {
2611  return -1;
2612  }
2613 
2614  Array a(arr);
2615 
2616  // Check for exception in constructor.
2617  if (a.is_null()) {
2618  return -1;
2619  }
2620 
2621  return a.get_length();
2622 }
2623 
2624 
2625 /* JVM_GetArrayElement */
2626 
2628 {
2629  TRACEJVMCALLS(("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index));
2630 
2631  Array a(arr);
2632 
2633 /* if (!class_is_array(a->objheader.vftbl->class)) { */
2634 /* exceptions_throw_illegalargumentexception(); */
2635 /* return NULL; */
2636 /* } */
2637 
2638  return a.get_boxed_element(index);
2639 }
2640 
2641 
2642 /* JVM_GetPrimitiveArrayElement */
2643 
2644 jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
2645 {
2646  jvalue jv;
2647 
2648  log_println("JVM_GetPrimitiveArrayElement: IMPLEMENT ME!");
2649 
2650  jv.l = NULL;
2651 
2652  return jv;
2653 }
2654 
2655 
2656 /* JVM_SetArrayElement */
2657 
2658 void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
2659 {
2660  TRACEJVMCALLS(("JVM_SetArrayElement(env=%p, arr=%p, index=%d, val=%p)", env, arr, index, val));
2661 
2662  Array a(arr);
2663 
2664  a.set_boxed_element(index, val);
2665 }
2666 
2667 
2668 /* JVM_SetPrimitiveArrayElement */
2669 
2670 void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
2671 {
2672  log_println("JVM_SetPrimitiveArrayElement: IMPLEMENT ME!");
2673 }
2674 
2675 
2676 /* JVM_NewArray */
2677 
2678 jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
2679 {
2680  TRACEJVMCALLS(("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length));
2681 
2682  if (eltClass == NULL) {
2684  return NULL;
2685  }
2686 
2687  /* NegativeArraySizeException is checked by array constructor. */
2688 
2689  classinfo* c = LLNI_classinfo_unwrap(eltClass);
2690 
2691  /* Create primitive or object array. */
2692 
2693  if (class_is_primitive(c)) {
2695 
2696  /* void arrays are not allowed. */
2697 
2698  if (pc == NULL) {
2700  return NULL;
2701  }
2702 
2703  Array a(length, pc);
2704 
2705  return (jobject) a.get_handle();
2706  }
2707  else {
2708  ObjectArray oa(length, c);
2709 
2710  return (jobject) oa.get_handle();
2711  }
2712 }
2713 
2714 
2715 /* JVM_NewMultiArray */
2716 
2718 {
2719  classinfo *c;
2720  int32_t length;
2721  long *dims;
2722  int32_t value;
2723  int32_t i;
2724  classinfo *ac;
2726 
2727  TRACEJVMCALLS(("JVM_NewMultiArray(env=%p, eltClass=%p, dim=%p)", env, eltClass, dim));
2728 
2729  if (eltClass == NULL) {
2731  return NULL;
2732  }
2733 
2734  /* NegativeArraySizeException is checked in builtin_newarray. */
2735 
2736  c = LLNI_classinfo_unwrap(eltClass);
2737 
2738  IntArray ia(dim);
2739 
2740  /* We check here for exceptions thrown in array_length_get,
2741  otherwise these exceptions get overwritten by the following
2742  IllegalArgumentException. */
2743 
2744  if (ia.is_null())
2745  return NULL;
2746 
2747  length = ia.get_length();
2748 
2749  if ((length <= 0) || (length > /* MAX_DIM */ 255)) {
2751  return NULL;
2752  }
2753 
2754  /* XXX This is just a quick hack to get it working. */
2755 
2756  dims = MNEW(long, length);
2757 
2758  for (i = 0; i < length; i++) {
2759  value = ia.get_element(i);
2760  dims[i] = (long) value;
2761  }
2762 
2763  /* Create an array-class if necessary. */
2764 
2765  if (class_is_primitive(c)) {
2767 
2768  // Arrays of void are not allowed.
2769  if (ac == NULL) {
2771  return NULL;
2772  }
2773 
2774  if (length > 1)
2775  ac = class_multiarray_of((length - 1), ac, true);
2776  }
2777  else
2778  ac = class_multiarray_of(length, c, true);
2779 
2780  if (ac == NULL)
2781  return NULL;
2782 
2783  /* Allocate a new array on the heap. */
2784 
2785  a = builtin_multianewarray(length, (java_handle_t *) ac, dims);
2786 
2787  return (jobject) a;
2788 }
2789 
2790 
2791 /* JVM_InitializeSocketLibrary */
2792 
2794 {
2795  TRACEJVMCALLS(("JVM_InitializeSocketLibrary()"));
2796 
2797 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
2798  HPI& hpi = VM::get_current()->get_hpi();
2799  return hpi.initialize_socket_library();
2800 #else
2801  return 0;
2802 #endif
2803 }
2804 
2805 
2806 /* JVM_Socket */
2807 
2808 jint JVM_Socket(jint domain, jint type, jint protocol)
2809 {
2810  TRACEJVMCALLS(("JVM_Socket(domain=%d, type=%d, protocol=%d)", domain, type, protocol));
2811 
2812  return os::socket(domain, type, protocol);
2813 }
2814 
2815 
2816 /* JVM_SocketClose */
2817 
2818 jint JVM_SocketClose(jint fd)
2819 {
2820  TRACEJVMCALLS(("JVM_SocketClose(fd=%d)", fd));
2821 
2822  return os::close(fd);
2823 }
2824 
2825 
2826 /* JVM_SocketShutdown */
2827 
2828 jint JVM_SocketShutdown(jint fd, jint howto)
2829 {
2830  TRACEJVMCALLS(("JVM_SocketShutdown(fd=%d, howto=%d)", fd, howto));
2831 
2832  return os::shutdown(fd, howto);
2833 }
2834 
2835 
2836 /* JVM_Recv */
2837 
2838 jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
2839 {
2840  log_println("JVM_Recv: IMPLEMENT ME!");
2841 
2842  return 0;
2843 }
2844 
2845 
2846 /* JVM_Send */
2847 
2848 jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
2849 {
2850  TRACEJVMCALLSENTER(("JVM_Send(fd=%d, buf=%p, nBytes=%d, flags=%d", fd, buf, nBytes, flags));
2851 
2852  int result = os::send(fd, buf, nBytes, flags);
2853 
2854  TRACEJVMCALLSEXIT(("->%d", result));
2855 
2856  return result;
2857 }
2858 
2859 
2860 /* JVM_Timeout */
2861 
2862 jint JVM_Timeout(int fd, long timeout)
2863 {
2864  log_println("JVM_Timeout: IMPLEMENT ME!");
2865 
2866  return 0;
2867 }
2868 
2869 
2870 /* JVM_Listen */
2871 
2872 jint JVM_Listen(jint fd, jint count)
2873 {
2874  TRACEJVMCALLS(("JVM_Listen(fd=%d, count=%d)", fd, count));
2875 
2876  return os::listen(fd, count);
2877 }
2878 
2879 
2880 /* JVM_Connect */
2881 
2882 jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
2883 {
2884  TRACEJVMCALLS(("JVM_Connect(fd=%d, him=%p, len=%d)", fd, him, len));
2885 
2886  return os::connect(fd, him, len);
2887 }
2888 
2889 
2890 /* JVM_Bind */
2891 
2892 jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
2893 {
2894  log_println("JVM_Bind: IMPLEMENT ME!");
2895 
2896  return 0;
2897 }
2898 
2899 
2900 /* JVM_Accept */
2901 
2902 jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
2903 {
2904  TRACEJVMCALLS(("JVM_Accept(fd=%d, him=%p, len=%p)", fd, him, len));
2905 
2906  return os::accept(fd, him, (socklen_t *) len);
2907 }
2908 
2909 
2910 /* JVM_RecvFrom */
2911 
2912 jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
2913 {
2914  log_println("JVM_RecvFrom: IMPLEMENT ME!");
2915 
2916  return 0;
2917 }
2918 
2919 
2920 /* JVM_GetSockName */
2921 
2922 jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
2923 {
2924  TRACEJVMCALLS(("JVM_GetSockName(fd=%d, him=%p, len=%p)", fd, him, len));
2925 
2926  return os::getsockname(fd, him, (socklen_t *) len);
2927 }
2928 
2929 
2930 /* JVM_SendTo */
2931 
2932 jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
2933 {
2934  log_println("JVM_SendTo: IMPLEMENT ME!");
2935 
2936  return 0;
2937 }
2938 
2939 
2940 /* JVM_SocketAvailable */
2941 
2942 jint _JVM_SocketAvailable(jint fd, jint *pbytes)
2943 {
2944 #if defined(FIONREAD)
2945  int bytes;
2946  int result;
2947 
2948  *pbytes = 0;
2949 
2950  result = ioctl(fd, FIONREAD, &bytes);
2951 
2952  if (result < 0)
2953  return 0;
2954 
2955  *pbytes = bytes;
2956 
2957  return 1;
2958 #else
2959 # error FIONREAD not defined
2960 #endif
2961 }
2962 
2963 jint JVM_SocketAvailable(jint fd, jint *pbytes)
2964 {
2965  TRACEJVMCALLS(("JVM_SocketAvailable(fd=%d, pbytes=%p)", fd, pbytes));
2966  return _JVM_SocketAvailable(fd, pbytes);
2967 }
2968 
2969 
2970 /* JVM_GetSockOpt */
2971 
2972 jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
2973 {
2974  TRACEJVMCALLS(("JVM_GetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%p)", fd, level, optname, optval, optlen));
2975 
2976  return os::getsockopt(fd, level, optname, optval, (socklen_t *) optlen);
2977 }
2978 
2979 
2980 /* JVM_SetSockOpt */
2981 
2982 jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
2983 {
2984  TRACEJVMCALLS(("JVM_SetSockOpt(fd=%d, level=%d, optname=%d, optval=%s, optlen=%d)", fd, level, optname, optval, optlen));
2985 
2986  return os::setsockopt(fd, level, optname, optval, optlen);
2987 }
2988 
2989 
2990 /* JVM_GetHostName */
2991 
2992 int JVM_GetHostName(char *name, int namelen)
2993 {
2994  int result;
2995 
2996  TRACEJVMCALLSENTER(("JVM_GetHostName(name=%s, namelen=%d)", name, namelen));
2997 
2998  result = os::gethostname(name, namelen);
2999 
3000  TRACEJVMCALLSEXIT(("->%d (name=%s)", result, name));
3001 
3002  return result;
3003 }
3004 
3005 
3006 /* JVM_GetHostByAddr */
3007 
3008 struct hostent *JVM_GetHostByAddr(const char* name, int len, int type)
3009 {
3010  log_println("JVM_GetHostByAddr: IMPLEMENT ME!");
3011 
3012  return NULL;
3013 }
3014 
3015 
3016 /* JVM_GetHostByName */
3017 
3018 struct hostent *JVM_GetHostByName(char* name)
3019 {
3020  log_println("JVM_GetHostByName: IMPLEMENT ME!");
3021 
3022  return NULL;
3023 }
3024 
3025 
3026 /* JVM_GetProtoByName */
3027 
3028 struct protoent *JVM_GetProtoByName(char* name)
3029 {
3030  log_println("JVM_GetProtoByName: IMPLEMENT ME!");
3031 
3032  return NULL;
3033 }
3034 
3035 
3036 /* JVM_LoadLibrary */
3037 
3038 void* JVM_LoadLibrary(const char* name)
3039 {
3040  TRACEJVMCALLSENTER(("JVM_LoadLibrary(name=%s)", name));
3041 
3043 
3044  NativeLibrary nl(u);
3045  void* handle = nl.open();
3046 
3047  TRACEJVMCALLSEXIT(("->%p", handle));
3048 
3049  return handle;
3050 }
3051 
3052 
3053 /* JVM_UnloadLibrary */
3054 
3055 void JVM_UnloadLibrary(void* handle)
3056 {
3057  TRACEJVMCALLS(("JVM_UnloadLibrary(handle=%p)", handle));
3058 
3059  NativeLibrary nl(handle);
3060  nl.close();
3061 }
3062 
3063 
3064 /* JVM_FindLibraryEntry */
3065 
3066 void *JVM_FindLibraryEntry(void* handle, const char* name)
3067 {
3068  void* symbol;
3069 
3070  TRACEJVMCALLSENTER(("JVM_FindLibraryEntry(handle=%p, name=%s)", handle, name));
3071 
3072 #ifndef WITH_JAVA_RUNTIME_LIBRARY_OPENJDK_7
3073  HPI& hpi = VM::get_current()->get_hpi();
3074  symbol = hpi.get_library().FindLibraryEntry(handle, name);
3075 #else
3076  //because we use glibc we need a mutex here
3077  VM::get_current()->get_jniMutex().lock();
3078  symbol = dlsym(handle, name);
3079  VM::get_current()->get_jniMutex().unlock();
3080 #endif
3081 
3082  TRACEJVMCALLSEXIT(("->%p", symbol));
3083 
3084  return symbol;
3085 }
3086 
3087 
3088 /* JVM_IsNaN */
3089 
3090 jboolean JVM_IsNaN(jdouble d)
3091 {
3092  bool result;
3093 
3094  TRACEJVMCALLSENTER(("JVM_IsNaN(d=%f)", d));
3095 
3096  result = isnan(d);
3097 
3098  TRACEJVMCALLSEXIT(("->%d", result));
3099 
3100  return result;
3101 }
3102 
3103 
3104 /* JVM_IsSupportedJNIVersion */
3105 
3107 {
3108  TRACEJVMCALLS(("JVM_IsSupportedJNIVersion(version=%d)", version));
3109 
3110  return jni_version_check(version);
3111 }
3112 
3113 
3114 /* JVM_InternString */
3115 
3117 {
3118  TRACEJVMCALLS(("JVM_InternString(env=%p, str=%p)", env, str));
3119 
3120  return (jstring) JavaString((java_handle_t*) str).intern();
3121 }
3122 
3123 
3124 /* JVM_RawMonitorCreate */
3125 
3126 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void)
3127 {
3128  TRACEJVMCALLS(("JVM_RawMonitorCreate()"));
3129 
3130  Mutex* m = new Mutex();
3131 
3132  return m;
3133 }
3134 
3135 
3136 /* JVM_RawMonitorDestroy */
3137 
3138 JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void* mon)
3139 {
3140  TRACEJVMCALLS(("JVM_RawMonitorDestroy(mon=%p)", mon));
3141 
3142  delete ((Mutex*) mon);
3143 }
3144 
3145 
3146 /* JVM_RawMonitorEnter */
3147 
3148 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void* mon)
3149 {
3150  TRACEJVMCALLS(("JVM_RawMonitorEnter(mon=%p)", mon));
3151 
3152  ((Mutex*) mon)->lock();
3153 
3154  return 0;
3155 }
3156 
3157 
3158 /* JVM_RawMonitorExit */
3159 
3160 JNIEXPORT void JNICALL JVM_RawMonitorExit(void* mon)
3161 {
3162  TRACEJVMCALLS(("JVM_RawMonitorExit(mon=%p)", mon));
3163 
3164  ((Mutex*) mon)->unlock();
3165 }
3166 
3167 
3168 /* JVM_SetPrimitiveFieldValues */
3169 
3170 void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3171 {
3172  log_println("JVM_SetPrimitiveFieldValues: IMPLEMENT ME!");
3173 }
3174 
3175 
3176 /* JVM_GetPrimitiveFieldValues */
3177 
3178 void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
3179 {
3180  log_println("JVM_GetPrimitiveFieldValues: IMPLEMENT ME!");
3181 }
3182 
3183 
3184 /* JVM_AccessVMBooleanFlag */
3185 
3186 jboolean JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get)
3187 {
3188  log_println("JVM_AccessVMBooleanFlag: IMPLEMENT ME!");
3189 
3190  return 0;
3191 }
3192 
3193 
3194 /* JVM_AccessVMIntFlag */
3195 
3196 jboolean JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get)
3197 {
3198  log_println("JVM_AccessVMIntFlag: IMPLEMENT ME!");
3199 
3200  return 0;
3201 }
3202 
3203 
3204 /* JVM_VMBreakPoint */
3205 
3207 {
3208  log_println("JVM_VMBreakPoint: IMPLEMENT ME!");
3209 }
3210 
3211 
3212 /* JVM_GetClassFields */
3213 
3215 {
3216  log_println("JVM_GetClassFields: IMPLEMENT ME!");
3217 
3218  return NULL;
3219 }
3220 
3221 
3222 /* JVM_GetClassMethods */
3223 
3225 {
3226  log_println("JVM_GetClassMethods: IMPLEMENT ME!");
3227 
3228  return NULL;
3229 }
3230 
3231 
3232 /* JVM_GetClassConstructors */
3233 
3235 {
3236  log_println("JVM_GetClassConstructors: IMPLEMENT ME!");
3237 
3238  return NULL;
3239 }
3240 
3241 
3242 /* JVM_GetClassField */
3243 
3245 {
3246  log_println("JVM_GetClassField: IMPLEMENT ME!");
3247 
3248  return NULL;
3249 }
3250 
3251 
3252 /* JVM_GetClassMethod */
3253 
3255 {
3256  log_println("JVM_GetClassMethod: IMPLEMENT ME!");
3257 
3258  return NULL;
3259 }
3260 
3261 
3262 /* JVM_GetClassConstructor */
3263 
3265 {
3266  log_println("JVM_GetClassConstructor: IMPLEMENT ME!");
3267 
3268  return NULL;
3269 }
3270 
3271 
3272 /* JVM_NewInstance */
3273 
3275 {
3276  log_println("JVM_NewInstance: IMPLEMENT ME!");
3277 
3278  return NULL;
3279 }
3280 
3281 
3282 /* JVM_GetField */
3283 
3285 {
3286  log_println("JVM_GetField: IMPLEMENT ME!");
3287 
3288  return NULL;
3289 }
3290 
3291 
3292 /* JVM_GetPrimitiveField */
3293 
3294 jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
3295 {
3296  jvalue jv;
3297 
3298  log_println("JVM_GetPrimitiveField: IMPLEMENT ME!");
3299 
3300  jv.l = NULL;
3301 
3302  return jv;
3303 }
3304 
3305 
3306 /* JVM_SetField */
3307 
3309 {
3310  log_println("JVM_SetField: IMPLEMENT ME!");
3311 }
3312 
3313 
3314 /* JVM_SetPrimitiveField */
3315 
3316 void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
3317 {
3318  log_println("JVM_SetPrimitiveField: IMPLEMENT ME!");
3319 }
3320 
3321 
3322 /* JVM_InvokeMethod */
3323 
3325 {
3326  TRACEJVMCALLS(("JVM_InvokeMethod(env=%p, method=%p, obj=%p, args0=%p)", env, method, obj, args0));
3327 
3328  java_lang_reflect_Method jlrm(method);
3329 
3330  java_handle_t* result = jlrm.invoke((java_handle_t*) obj, (java_handle_objectarray_t*) args0);
3331 
3332  return (jobject) result;
3333 }
3334 
3335 
3336 /* JVM_NewInstanceFromConstructor */
3337 
3339 {
3340  TRACEJVMCALLS(("JVM_NewInstanceFromConstructor(env=%p, c=%p, args0=%p)", env, con, args0));
3341 
3344 
3345  return (jobject) o;
3346 }
3347 
3348 
3349 /* JVM_SupportsCX8 */
3350 
3352 {
3353  TRACEJVMCALLS(("JVM_SupportsCX8()"));
3354 
3355  /* IMPLEMENT ME */
3356 
3357  return 0;
3358 }
3359 
3360 
3361 /* JVM_CX8Field */
3362 
3363 jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
3364 {
3365  log_println("JVM_CX8Field: IMPLEMENT ME!");
3366 
3367  return 0;
3368 }
3369 
3370 
3371 /* JVM_GetAllThreads */
3372 
3374 {
3375  // Get a list of all active threads.
3376  List<threadobject*> active_threads;
3377  ThreadList::get()->get_active_java_threads(active_threads);
3378 
3379  // Allocate array to hold the java.lang.Thread objects.
3380  int32_t length = active_threads.size();
3381  ObjectArray oa(length, class_java_lang_Thread);
3382 
3383  if (oa.is_null())
3384  return NULL;
3385 
3386  // Iterate over all threads (which were active just a second ago).
3387  int32_t index = 0;
3388  for (List<threadobject*>::iterator it = active_threads.begin(); it != active_threads.end(); it++) {
3389  threadobject* t = *it;
3390 
3391  java_handle_t* h = LLNI_WRAP(t->object);
3392  assert(h != NULL);
3393 
3394  oa.set_element(index, h);
3395 
3396  index++;
3397  }
3398 
3399  return oa.get_handle();
3400 }
3401 
3402 
3403 /* JVM_DumpThreads */
3404 
3406 {
3407  int32_t i;
3408 
3409  TRACEJVMCALLS(("JVM_DumpThreads((env=%p, threadClass=%p, threads=%p)", env, threadClass, threads));
3410 
3411  if (threads == NULL) {
3413  return NULL;
3414  }
3415 
3416  ObjectArray oa(threads);
3417 
3418  // Get length of the threads array.
3419  int32_t length = oa.get_length();
3420 
3421  if (length <= 0) {
3423  return NULL;
3424  }
3425 
3426  // Allocate array to hold stacktraces.
3428  ObjectArray oaresult(length, arrayclass);
3429 
3430  if (oaresult.is_null()) {
3431  return NULL;
3432  }
3433 
3434  // Iterate over all passed thread objects.
3435  for (i = 0; i < length; i++) {
3436  java_handle_t* thread = oa.get_element(i);
3437 
3438  // Get thread for the given thread object.
3439  threadobject* t = thread_get_thread(thread);
3440 
3441  // The threadobject is null when a thread is created in Java.
3442  if (t == NULL)
3443  continue;
3444 
3445  // Get stacktrace for given thread.
3447 
3448  // Convert stacktrace into array of StackTraceElements.
3450 
3451  if (oaste == NULL)
3452  return NULL;
3453 
3454  oaresult.set_element(i, oaste);
3455  }
3456 
3457  return oaresult.get_handle();
3458 }
3459 
3460 
3461 /* JVM_GetManagement */
3462 
3464 {
3465  TRACEJVMCALLS(("JVM_GetManagement(version=%d)", version));
3466 
3467  return Management::get_jmm_interface(version);
3468 }
3469 
3470 
3471 /* JVM_InitAgentProperties */
3472 
3474 {
3475  log_println("JVM_InitAgentProperties: IMPLEMENT ME!");
3476 
3477  return NULL;
3478 }
3479 
3480 
3481 /* JVM_GetEnclosingMethodInfo */
3482 
3484 {
3485  TRACEJVMCALLS(("JVM_GetEnclosingMethodInfo(env=%p, ofClass=%p)", env, ofClass));
3486 
3487  classinfo* c = LLNI_classinfo_unwrap(ofClass);
3488 
3489  if ((c == NULL) || class_is_primitive(c))
3490  return NULL;
3491 
3493 
3494  if (m == NULL)
3495  return NULL;
3496 
3498 
3499  if (oa.is_null())
3500  return NULL;
3501 
3505 
3506  return oa.get_handle();
3507 }
3508 
3509 
3510 /* JVM_GetThreadStateValues */
3511 
3512 jintArray JVM_GetThreadStateValues(JNIEnv* env, jint javaThreadState)
3513 {
3514  TRACEJVMCALLS(("JVM_GetThreadStateValues(env=%p, javaThreadState=%d)",
3515  env, javaThreadState));
3516 
3517  /* If new thread states are added in future JDK and VM versions,
3518  this should check if the JDK version is compatible with thread
3519  states supported by the VM. Return NULL if not compatible.
3520 
3521  This function must map the VM java_lang_Thread::ThreadStatus
3522  to the Java thread state that the JDK supports. */
3523 
3524  switch (javaThreadState) {
3525  case THREAD_STATE_NEW:
3526  {
3527  IntArray ia(1);
3528 
3529  if (ia.is_null())
3530  return NULL;
3531 
3533  return ia.get_handle();
3534  }
3535 
3536  case THREAD_STATE_RUNNABLE:
3537  {
3538  IntArray ia(1);
3539 
3540  if (ia.is_null())
3541  return NULL;
3542 
3544  return ia.get_handle();
3545  }
3546 
3547  case THREAD_STATE_BLOCKED:
3548  {
3549  IntArray ia(1);
3550 
3551  if (ia.is_null())
3552  return NULL;
3553 
3555  return ia.get_handle();
3556  }
3557 
3558  case THREAD_STATE_WAITING:
3559  {
3560  IntArray ia(2);
3561 
3562  if (ia.is_null())
3563  return NULL;
3564 
3567  return ia.get_handle();
3568  }
3569 
3571  {
3572  IntArray ia(2);
3573 
3574  if (ia.is_null())
3575  return NULL;
3576 
3577  /* XXX Not sure about that one. */
3578 /* ia.set_element(0, SLEEPING); */
3581  return ia.get_handle();
3582  }
3583 
3585  {
3586  IntArray ia(1);
3587 
3588  if (ia.is_null())
3589  return NULL;
3590 
3592  return ia.get_handle();
3593  }
3594 
3595  default:
3596  /* Unknown state - probably incompatible JDK version */
3597  return NULL;
3598  }
3599 }
3600 
3601 
3602 /* JVM_GetThreadStateNames */
3603 
3604 jobjectArray JVM_GetThreadStateNames(JNIEnv* env, jint javaThreadState, jintArray values)
3605 {
3606  java_object_t* s;
3607 
3608  TRACEJVMCALLS(("JVM_GetThreadStateNames(env=%p, javaThreadState=%d, values=%p)",
3609  env, javaThreadState, values));
3610 
3611  IntArray ia(values);
3612 
3613  /* If new thread states are added in future JDK and VM versions,
3614  this should check if the JDK version is compatible with thread
3615  states supported by the VM. Return NULL if not compatible.
3616 
3617  This function must map the VM java_lang_Thread::ThreadStatus
3618  to the Java thread state that the JDK supports. */
3619 
3620  if (values == NULL) {
3622  return NULL;
3623  }
3624 
3625  switch (javaThreadState) {
3626  case THREAD_STATE_NEW:
3627  {
3628  assert(ia.get_length() == 1 && ia.get_element(0) == THREAD_STATE_NEW);
3629 
3631 
3632  if (oa.is_null())
3633  return NULL;
3634 
3635  s = JavaString::from_utf8("NEW");
3636 
3637  if (s == NULL)
3638  return NULL;
3639 
3640  oa.set_element(0, s);
3641  return oa.get_handle();
3642  }
3643 
3644  case THREAD_STATE_RUNNABLE:
3645  {
3647 
3648  if (oa.is_null())
3649  return NULL;
3650 
3651  s = JavaString::from_utf8("RUNNABLE");
3652 
3653  if (s == NULL)
3654  return NULL;
3655 
3656  oa.set_element(0, s);
3657  return oa.get_handle();
3658  }
3659 
3660  case THREAD_STATE_BLOCKED:
3661  {
3663 
3664  if (oa.is_null())
3665  return NULL;
3666 
3667  s = JavaString::from_utf8("BLOCKED");
3668 
3669  if (s == NULL)
3670  return NULL;
3671 
3672  oa.set_element(0, s);
3673  return oa.get_handle();
3674  }
3675 
3676  case THREAD_STATE_WAITING:
3677  {
3679 
3680  if (oa.is_null())
3681  return NULL;
3682 
3683  s = JavaString::from_utf8("WAITING.OBJECT_WAIT");
3684 
3685  if (s == NULL)
3686  return NULL;
3687 
3688  oa.set_element(0, s);
3689 
3690  s = JavaString::from_utf8("WAITING.PARKED");
3691 
3692  if (s == NULL)
3693  return NULL;
3694 
3695  oa.set_element(1, s);
3696  return oa.get_handle();
3697  }
3698 
3700  {
3702 
3703  if (oa.is_null())
3704  return NULL;
3705 
3706 /* s = JavaString::from_utf8("TIMED_WAITING.SLEEPING"); */
3707  s = JavaString::from_utf8("TIMED_WAITING.OBJECT_WAIT");
3708 
3709  if (s == NULL)
3710  return NULL;
3711 
3712  oa.set_element(0, s);
3713 
3714  s = JavaString::from_utf8("TIMED_WAITING.PARKED");
3715 
3716  if (s == NULL)
3717  return NULL;
3718 
3719  oa.set_element(1, s);
3720  return oa.get_handle();
3721  }
3722 
3724  {
3726 
3727  if (oa.is_null())
3728  return NULL;
3729 
3730  s = JavaString::from_utf8("TERMINATED");
3731 
3732  if (s == NULL)
3733  return NULL;
3734 
3735  oa.set_element(0, s);
3736  return oa.get_handle();
3737  }
3738 
3739  default:
3740  /* Unknown state - probably incompatible JDK version */
3741  return NULL;
3742  }
3743 }
3744 
3745 
3746 /* JVM_GetVersionInfo */
3747 
3748 void JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)
3749 {
3750  TRACEJVMCALLS(("JVM_GetVersionInfo(env=%p, info=%p, info_size=%zd)", env, info, info_size));
3751 
3752  memset(info, 0, info_size);
3753 
3754  info->jvm_version = ((VERSION_MAJOR & 0xff) << 24) | ((VERSION_MINOR & 0xff) << 16) | (VERSION_MICRO & 0xff);
3755  info->update_version = 0;
3756  info->special_update_version = 0;
3757  info->is_attach_supported = 0;
3758  info->is_kernel_jvm = 0;
3759 }
3760 
3761 
3762 /* OS: JVM_RegisterSignal */
3763 
3764 void *JVM_RegisterSignal(jint sig, void *handler)
3765 {
3766  functionptr newHandler;
3767 
3768  TRACEJVMCALLS(("JVM_RegisterSignal(sig=%d, handler=%p)", sig, handler));
3769 
3770  if (handler == (void *) 2)
3771  newHandler = (functionptr) signal_thread_handler;
3772  else
3773  newHandler = (functionptr) (uintptr_t) handler;
3774 
3775  switch (sig) {
3776  case SIGILL:
3777  case SIGFPE:
3778  case SIGUSR1:
3779  case SIGSEGV:
3780  /* These signals are already used by the VM. */
3781  return (void *) -1;
3782 
3783  case SIGQUIT:
3784  /* This signal is used by the VM to dump thread stacks unless
3785  ReduceSignalUsage is set, in which case the user is allowed
3786  to set his own _native_ handler for this signal; thus, in
3787  either case, we do not allow JVM_RegisterSignal to change
3788  the handler. */
3789  return (void *) -1;
3790 
3791  case SIGHUP:
3792  case SIGINT:
3793  case SIGTERM:
3794  break;
3795  }
3796 
3797  signal_register_signal(sig, newHandler, SA_RESTART | SA_SIGINFO);
3798 
3799  /* XXX Should return old handler. */
3800 
3801  return (void *) 2;
3802 }
3803 
3804 
3805 /* OS: JVM_RaiseSignal */
3806 
3807 jboolean JVM_RaiseSignal(jint sig)
3808 {
3809  log_println("JVM_RaiseSignal: IMPLEMENT ME! sig=%s", sig);
3810 
3811  return false;
3812 }
3813 
3814 
3815 /* OS: JVM_FindSignal */
3816 
3817 jint JVM_FindSignal(const char *name)
3818 {
3819  TRACEJVMCALLS(("JVM_FindSignal(name=%s)", name));
3820 
3821 #if defined(__LINUX__)
3822  if (strcmp(name, "HUP") == 0)
3823  return SIGHUP;
3824 
3825  if (strcmp(name, "INT") == 0)
3826  return SIGINT;
3827 
3828  if (strcmp(name, "TERM") == 0)
3829  return SIGTERM;
3830 #elif defined(__SOLARIS__)
3831  int signum;
3832 
3833  if (os::str2sig(name, &signum) == -1)
3834  return -1;
3835 
3836  return signum;
3837 #else
3838 # error Not implemented for this OS.
3839 #endif
3840 
3841  return -1;
3842 }
3843 
3844 } // extern "C"
3845 
3846 
3847 /*
3848  * These are local overrides for various environment variables in Emacs.
3849  * Please do not remove this and leave it at the end of the file, where
3850  * Emacs will automagically detect them.
3851  * ---------------------------------------------------------------------
3852  * Local variables:
3853  * mode: c++
3854  * indent-tabs-mode: t
3855  * c-basic-offset: 4
3856  * tab-width: 4
3857  * End:
3858  * vim:noexpandtab:sw=4:ts=4:
3859  */
void exceptions_throw_illegalargumentexception(void)
jobject JVM_GetProtectionDomain(JNIEnv *env, jclass cls)
Definition: jvm.cpp:856
java_handle_objectarray_t * class_get_declaredfields(classinfo *c, bool publicOnly)
Definition: class.cpp:1765
jobject JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused)
Definition: jvm.cpp:1608
jobjectArray JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly)
Definition: jvm.cpp:1199
jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1487
void gc_call(void)
Definition: gc.c:492
bool builtin_instanceof(java_handle_t *o, classinfo *c)
Definition: builtin.cpp:403
Utf8String name
Definition: method.hpp:71
jint JVM_Open(const char *fname, jint flags, jint mode)
Definition: jvm.cpp:2073
jclass JVM_FindClassFromCaller(JNIEnv *env, const char *name, jboolean init, jobject loader, jclass caller)
Definition: jvm.cpp:660
std::size_t index
jint JVM_Accept(jint fd, struct sockaddr *him, jint *len)
Definition: jvm.cpp:2902
void * JVM_GetManagement(jint version)
Definition: jvm.cpp:3463
jstring JVM_GetClassName(JNIEnv *env, jclass cls)
Definition: jvm.cpp:760
JNIEnv jthread jmethodID jlocation jclass jobject jfieldID field
Definition: jvmti.h:221
jobject JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)
Definition: jvm.cpp:949
JNIEnv jclass jobject const char jobject protection_domain
Definition: jvmti.h:312
classinfo * stacktrace_get_caller_class(int depth)
Definition: stacktrace.cpp:784
static int processors_online()
Returns the number of online processors in the system.
Definition: os.cpp:278
methodinfo * class_resolveclassmethod(classinfo *c, Utf8String name, Utf8String desc, classinfo *referer, bool throwexception)
Definition: class.cpp:1211
official tags from JVM spec
Definition: global.hpp:164
static int socket(int domain, int type, int protocol)
Definition: os.hpp:598
virtual java_handle_t * get_handle() const
void * open()
Open this native library.
Definition: native.cpp:398
void threads_thread_interrupt(threadobject *t)
const char * JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index)
Definition: jvm.cpp:1884
jobjectArray JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly)
Definition: jvm.cpp:1168
bool threads_suspend_thread(threadobject *thread, SuspendReason reason)
Suspend the passed thread.
void * class_getconstant(classinfo *c, u4 pos, ConstantPoolTag ctype)
Definition: class.cpp:679
const char * JVM_GetClassNameUTF(JNIEnv *env, jclass cls)
Definition: jvm.cpp:1692
classinfo * classcache_lookup(classloader_t *initloader, Utf8String classname)
Definition: classcache.cpp:564
jint _JVM_SocketAvailable(jint fd, jint *pbytes)
Definition: jvm.cpp:2942
classloader_t * stacktrace_first_nonsystem_classloader(void)
Returns the first non-system (user-defined) classloader on the stack.
Definition: stacktrace.cpp:926
const char * JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
Definition: jvm.cpp:1914
bool is_null() const
classinfo * class_java_lang_RuntimeException
Definition: globals.cpp:56
jboolean JVM_RaiseSignal(jint sig)
Definition: jvm.cpp:3807
jobject JVM_CurrentClassLoader(JNIEnv *env)
Definition: jvm.cpp:2477
jboolean JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)
Definition: jvm.cpp:529
jint JVM_Bind(jint fd, struct sockaddr *him, jint len)
Definition: jvm.cpp:2892
void JVM_InitializeCompiler(JNIEnv *env, jclass compCls)
Definition: jvm.cpp:511
jint JVM_Sync(jint fd)
Definition: jvm.cpp:2210
void JVM_UnloadLibrary(void *handle)
Definition: jvm.cpp:3055
int32_t get_hashcode() const
void JVM_TraceMethodCalls(jboolean on)
Definition: jvm.cpp:333
struct protoent * JVM_GetProtoByName(char *name)
Definition: jvm.cpp:3028
Utf8String to_utf8() const
Definition: string.cpp:437
jobjectArray JVM_GetAllThreads(JNIEnv *env, jclass dummy)
Definition: jvm.cpp:3373
jint JVM_Send(jint fd, char *buf, jint nBytes, jint flags)
Definition: jvm.cpp:2848
jlong JVM_FreeMemory(void)
Definition: jvm.cpp:351
argument_type from
methodinfo * class_get_enclosingmethod_raw(classinfo *c)
Definition: class.cpp:1995
_Jv_JNIEnv JNIEnv
Definition: jni.hpp:112
virtual java_handle_array_t * get_handle() const
Definition: array.hpp:103
JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon)
Definition: jvm.cpp:3160
const char * JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
Definition: jvm.cpp:1924
void JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types)
Definition: jvm.cpp:1702
jint JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index)
Definition: jvm.cpp:1834
jint JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)
Definition: jvm.cpp:2982
JavaString intern() const
Definition: string.cpp:336
jint JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)
Definition: jvm.cpp:2912
static void * get_jmm_interface(int version)
Return the requested management interface.
Definition: management.cpp:458
static Utf8String from_utf8_slash_to_dot(const char *, size_t)
Definition: utf8.cpp:343
void JVM_GetVersionInfo(JNIEnv *env, jvm_version_info *info, size_t info_size)
Definition: jvm.cpp:3748
void close()
Close this native library.
Definition: native.cpp:434
jstring JVM_GetClassSignature(JNIEnv *env, jclass cls)
Definition: jvm.cpp:1059
classloader_t * stacktrace_first_nonnull_classloader(void)
Returns the first non-null (user-defined) classloader on the stack.
Definition: stacktrace.cpp:851
jboolean JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)
Definition: jvm.cpp:539
static int listen(int sockfd, int backlog)
Definition: os.hpp:465
jobject JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1406
void JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code)
Definition: jvm.cpp:1758
JNIEXPORT void JNICALL JVM_RawMonitorDestroy(void *mon)
Definition: jvm.cpp:3138
Utf8String packagename
Definition: class.hpp:132
static JavaString from_utf8(Utf8String)
Definition: string.cpp:184
jboolean JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)
Definition: jvm.cpp:3363
void JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions)
Definition: jvm.cpp:1740
int jio_vfprintf(FILE *f, const char *fmt, va_list args)
Definition: jvm.cpp:186
jobject JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)
Definition: jvm.cpp:2678
jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
Definition: jvm.cpp:2605
jobject JVM_GetClassField(JNIEnv *env, jclass cls, jstring name, jint which)
Definition: jvm.cpp:3244
jint JVM_ClassLoaderDepth(JNIEnv *env)
Definition: jvm.cpp:2508
size_t size() const
Definition: utf8.hpp:161
jclass JVM_FindClassFromBootLoader(JNIEnv *env, const char *name)
Definition: jvm.cpp:644
classinfo * class_array_of(classinfo *component, bool link)
Definition: class.cpp:832
int32_t class_get_modifiers(classinfo *c, bool ignoreInnerClassesAttrib)
Definition: class.cpp:2126
void signal_register_signal(int signum, functionptr handler, int flags)
Definition: signal.cpp:204
HPI_FileInterface & get_file() const
Definition: hpi.hpp:64
s4 state
Definition: class.hpp:115
static java_handle_t * thread_get_current_object(void)
Definition: thread.hpp:226
void get_active_java_threads(List< threadobject * > &list)
Fills the passed list with all currently active threads which should be visible to Java...
Definition: threadlist.cpp:111
#define JVM_INTERFACE_VERSION
bool resolve_classref(methodinfo *refmethod, constant_classref *ref, resolve_mode_t mode, bool checkaccess, bool link, classinfo **result)
Definition: resolve.cpp:309
Utf8String class_get_signature(classinfo *c)
Definition: class.cpp:2183
OpenJDK sun/reflect/ConstantPool.
classinfo * class_get_declaringclass(classinfo *c)
Definition: class.cpp:1882
int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
Definition: jvm.cpp:156
classloader_t * classloader
Definition: class.hpp:151
Actual implementation of access class for Java Object arrays.
Definition: array.hpp:381
jclass JVM_CurrentLoadedClass(JNIEnv *env)
Definition: jvm.cpp:2467
jint JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index)
Definition: jvm.cpp:1794
List< assertion_name_t * > * list_assertion_names
Definition: assertion.cpp:42
void JVM_MonitorWait(JNIEnv *env, jobject handle, jlong ms)
Definition: jvm.cpp:466
static int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
Definition: os.hpp:580
jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1451
void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
Definition: jvm.cpp:381
struct hostent * JVM_GetHostByName(char *name)
Definition: jvm.cpp:3018
jobjectArray JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass)
Definition: jvm.cpp:1025
jint JVM_Close(jint fd)
Definition: jvm.cpp:2102
T get_element(int32_t index)
Definition: array.hpp:238
jint JVM_Read(jint fd, char *buf, jint nbytes)
Definition: jvm.cpp:2117
GNU Classpath java/lang/reflect/Field.
jlong JVM_MaxObjectInspectionAge(void)
Definition: jvm.cpp:315
union constant_FMIref::@26 p
Actual implementations of common Java array access classes.
Definition: array.hpp:322
jint JVM_CountStackFrames(JNIEnv *env, jobject jthread)
Definition: jvm.cpp:2379
jint JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index)
Definition: jvm.cpp:1784
jobject JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)
Definition: jvm.cpp:2575
jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
Definition: jvm.cpp:437
jobject JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)
Definition: jvm.cpp:549
jclass JVM_FindPrimitiveClass(JNIEnv *env, const char *s)
Definition: jvm.cpp:622
Dummy implementation of a mutex.
Definition: mutex-none.hpp:33
int64_t opt_MaxDirectMemorySize
Definition: options.cpp:156
jclass JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1293
jint JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)
Definition: jvm.cpp:2932
#define LLNI_CRITICAL_END
Definition: llni.hpp:141
jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
Definition: jvm.cpp:991
#define TRACEJVMCALLSEXIT(x)
Definition: jvm.cpp:120
java_handle_t * vm_call_method(methodinfo *m, java_handle_t *o,...)
jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
Definition: jvm.cpp:2627
jobjectArray JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly)
Definition: jvm.cpp:1185
jint JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index)
Definition: jvm.cpp:1766
jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1545
static bool class_is_array(classinfo *c)
Definition: class.hpp:341
static int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen)
Definition: os.hpp:456
static classinfo * get_class_by_name(Utf8String name)
Returns the primitive class of the given class name.
Definition: primitive.cpp:231
JNIEnv jclass jobject const char * name
Definition: jvmti.h:312
void threads_set_thread_priority(threadobject *t, int priority)
Definition: thread-none.cpp:77
void set_element(int32_t index, T value)
Definition: array.hpp:255
methodinfo * method
Definition: references.hpp:101
classinfo * class_java_lang_Object
Definition: globals.cpp:28
jint JVM_GetClassFieldsCount(JNIEnv *env, jclass cls)
Definition: jvm.cpp:1720
void log_println(const char *text,...)
Definition: logging.cpp:193
jboolean JVM_IsInterrupted(JNIEnv *env, jobject jthread, jboolean clear_interrupted)
Definition: jvm.cpp:2410
void JVM_MonitorNotify(JNIEnv *env, jobject handle)
Definition: jvm.cpp:481
JNIEnv jthread jobject jlong timeout
Definition: jvmti.h:373
void JVM_Yield(JNIEnv *env, jclass threadClass)
Definition: jvm.cpp:2345
jobject JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)
Definition: jvm.cpp:2565
jobject JVM_LatestUserDefinedLoader(JNIEnv *env)
Definition: jvm.cpp:2585
jclass JVM_FindClassFromClass(JNIEnv *env, const char *name, jboolean init, jclass from)
Definition: jvm.cpp:709
static classloader_t * class_get_classloader(classinfo *c)
Definition: class.hpp:402
void JVM_ResolveClass(JNIEnv *env, jclass cls)
Definition: jvm.cpp:635
static std::set< Utf8String > & packages()
Definition: package.cpp:40
jobjectArray JVM_GetClassMethods(JNIEnv *env, jclass cls, jint which)
Definition: jvm.cpp:3224
jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
Definition: jvm.cpp:1134
const char * JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
Definition: jvm.cpp:1894
void vm_shutdown()
Hook point before the VM is actually destroyed.
Definition: hook.hpp:168
jobjectArray JVM_GetClassContext(JNIEnv *env)
Definition: jvm.cpp:2488
s8 gc_get_free_bytes(void)
Definition: gc.c:553
classinfo * class_multiarray_of(s4 dim, classinfo *element, bool link)
Definition: class.cpp:881
jobject JVM_InitAgentProperties(JNIEnv *env, jobject properties)
Definition: jvm.cpp:3473
void JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers)
Definition: jvm.cpp:833
HPI_SystemInterface & get_system() const
Definition: hpi.hpp:67
jobjectArray JVM_GetClassConstructors(JNIEnv *env, jclass cls, jint which)
Definition: jvm.cpp:3234
s8 gc_get_max_heap_size(void)
Definition: gc.c:555
classloader_t * loader_hashtable_classloader_add(java_handle_t *cl)
Definition: loader.cpp:305
void JVM_Sleep(JNIEnv *env, jclass threadClass, jlong millis)
Definition: jvm.cpp:2355
static Mutex lock
Definition: atomic.cpp:34
void JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length)
Definition: jvm.cpp:236
static int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
Definition: os.hpp:205
GNU Classpath java/lang/reflect/Constructor.
jint JVM_FindSignal(const char *name)
Definition: jvm.cpp:3817
void(* functionptr)(void)
Definition: global.hpp:39
bool assertion_user_enabled
Definition: assertion.cpp:45
jint JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)
Definition: jvm.cpp:2972
const char * JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index)
Definition: jvm.cpp:1864
classinfo * class_sun_reflect_ConstantPool
Definition: globals.cpp:97
jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1469
jboolean JVM_AccessVMBooleanFlag(const char *name, jboolean *value, jboolean is_get)
Definition: jvm.cpp:3186
java_handle_t * invoke(java_handle_t *o, java_handle_objectarray_t *args)
Invokes the given method.
java_handle_t * stacktrace_get_StackTraceElement(stacktrace_t *st, int32_t index)
Creates a java.lang.StackTraceElement for one element of the given stacktrace.
Definition: stacktrace.cpp:656
java_handle_objectarray_t * class_get_declaredconstructors(classinfo *c, bool publicOnly)
Return an array of declared constructors of the given class.
Definition: class.cpp:1708
jobject JVM_CurrentThread(JNIEnv *env, jclass threadClass)
Definition: jvm.cpp:2365
jboolean JVM_SupportsCX8()
Definition: jvm.cpp:3351
java_handle_t * class_get_classname(classinfo *c)
Returns the classname of the class, where slashes (&#39;/&#39;) are replaced by dots (&#39;.
Definition: class.cpp:86
#define LLNI_classinfo_wrap(classinfo)
Definition: llni.hpp:110
#define LLNI_class_get(obj, variable)
Definition: llni.hpp:60
java_handle_objectarray_t * stacktrace_get_StackTraceElements(stacktrace_t *st)
Creates a complete array of java.lang.StackTraceElement objects for the given stacktrace.
Definition: stacktrace.cpp:740
void lock_notify_all_object(java_handle_t *o)
Definition: lock.cpp:1359
static int getsockname(int s, struct sockaddr *name, socklen_t *namelen)
Definition: os.hpp:447
void threads_thread_start(java_handle_t *object)
Definition: thread.cpp:445
JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon)
Definition: jvm.cpp:3148
Host Porting Interface (HPI).
Definition: hpi.hpp:53
const char * JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index)
Definition: jvm.cpp:1904
int JVM_GetHostName(char *name, int namelen)
Definition: jvm.cpp:2992
jlong jlong jlong jlong jint depth
Definition: jvmti.h:497
void JVM_SuspendThread(JNIEnv *env, jobject jthread)
Definition: jvm.cpp:2267
jobject JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1349
Utf8String descriptor
Definition: method.hpp:72
jobject JVM_NewInstance(JNIEnv *env, jclass cls)
Definition: jvm.cpp:3274
JNIEnv void * arg
Definition: jvmti.h:405
jint JVM_IHashCode(JNIEnv *env, jobject handle)
Definition: jvm.cpp:454
int jio_fprintf(FILE *f, const char *fmt,...)
Definition: jvm.cpp:178
#define TRACEJVMCALLS(x)
Definition: jvm.cpp:105
java_handle_objectarray_t * class_get_declaredclasses(classinfo *c, bool publicOnly)
Definition: class.cpp:1626
jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1324
#define LLNI_WRAP(obj)
Definition: llni.hpp:51
java/lang/Object
jboolean JVM_AccessVMIntFlag(const char *name, jint *value, jboolean is_get)
Definition: jvm.cpp:3196
static ThreadList * get()
Provides access to singleton.
Definition: threadlist.hpp:62
void JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry)
Definition: jvm.cpp:1776
void JVM_Interrupt(JNIEnv *env, jobject jthread)
Definition: jvm.cpp:2389
int32_t get_length() const
Definition: array.hpp:189
jint JVM_SocketAvailable(jint fd, jint *pbytes)
Definition: jvm.cpp:2963
jboolean JVM_IsSupportedJNIVersion(jint version)
Definition: jvm.cpp:3106
jclass JVM_FindClassFromClassLoader(JNIEnv *env, const char *name, jboolean init, jobject loader, jboolean throwError)
Definition: jvm.cpp:681
JNIEnv jthread jmethodID method
Definition: jvmti.h:207
List implementation.
Definition: lock.hpp:35
java_handle_objectarray_t * class_get_interfaces(classinfo *c)
Definition: class.cpp:2065
void JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain)
Definition: jvm.cpp:880
stacktrace_t * stacktrace_get_of_thread(threadobject *t)
Creates a stacktrace for the given thread.
jint JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
Definition: jvm.cpp:1954
jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1505
jobject JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException)
Definition: jvm.cpp:888
java_handle_bytearray_t * class_get_annotations(classinfo *c)
Definition: class.cpp:2100
int32_t length
Definition: stacktrace.hpp:76
jboolean JVM_IsArrayClass(JNIEnv *env, jclass cls)
Definition: jvm.cpp:963
jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
Definition: jvm.cpp:1254
jint JVM_SocketShutdown(jint fd, jint howto)
Definition: jvm.cpp:2828
void JVM_SetThreadPriority(JNIEnv *env, jobject jthread, jint prio)
Definition: jvm.cpp:2315
classinfo * clazz
Definition: method.hpp:80
static void version(bool opt_exit)
Definition: vm.cpp:529
void JVM_ReleaseUTF(const char *utf)
Definition: jvm.cpp:1964
java_handle_objectarray_t * class_get_declaredmethods(classinfo *c, bool publicOnly)
Definition: class.cpp:1818
char * JVM_NativePath(char *path)
Definition: jvm.cpp:593
Utf8String name
Definition: class.hpp:91
void lock_notify_object(java_handle_t *o)
Definition: lock.cpp:1340
void JVM_VMBreakPoint(JNIEnv *env, jobject obj)
Definition: jvm.cpp:3206
static int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen)
Definition: os.hpp:270
void exceptions_throw_nullpointerexception(void)
void JVM_GC(void)
Definition: jvm.cpp:305
jboolean JVM_IsThreadAlive(JNIEnv *env, jobject jthread)
Definition: jvm.cpp:2243
void JVM_MonitorNotifyAll(JNIEnv *env, jobject handle)
Definition: jvm.cpp:491
GNU Classpath java/lang/reflect/Method.
static bool class_is_interface(classinfo *c)
Definition: class.hpp:357
s8 builtin_nanotime(void)
Definition: builtin.cpp:2043
void JVM_EnableCompiler(JNIEnv *env, jclass compCls)
Definition: jvm.cpp:559
jint JVM_Listen(jint fd, jint count)
Definition: jvm.cpp:2872
void exceptions_throw_internalerror(const char *message,...)
Definition: exceptions.cpp:805
jclass JVM_GetCallerClass(JNIEnv *env, int depth)
Definition: jvm.cpp:608
void JVM_StartThread(JNIEnv *env, jobject jthread)
Definition: jvm.cpp:2225
jint JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)
Definition: jvm.cpp:1944
void JVM_Halt(jint code)
Definition: jvm.cpp:286
JNIEnv jthread thread
Definition: jvmti.h:207
s4 flags
Definition: class.hpp:90
jint JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)
Definition: jvm.cpp:1730
java_handle_objectarray_t * stacktrace_getClassContext(void)
Definition: stacktrace.cpp:978
jclass JVM_LoadClass0(JNIEnv *env, jobject receiver, jclass currClass, jstring currClassName)
Definition: jvm.cpp:2595
int jio_snprintf(char *str, size_t count, const char *fmt,...)
Definition: jvm.cpp:165
#define TRACEJVMCALLSENTER(x)
Definition: jvm.cpp:112
Properties & get_properties()
Definition: vm.hpp:113
jobject JVM_NewInstanceFromConstructor(JNIEnv *env, jobject con, jobjectArray args0)
Definition: jvm.cpp:3338
static Utf8String find(Utf8String packagename)
Find a package in the list.
Definition: package.cpp:77
jlong JVM_NanoTime(JNIEnv *env, jclass ignored)
Definition: jvm.cpp:226
static Utf8String from_utf8(const char *, size_t)
Definition: utf8.cpp:335
JNIEXPORT void *JNICALL JVM_RawMonitorCreate(void)
Definition: jvm.cpp:3126
jobject JVM_InitProperties(JNIEnv *env, jobject properties)
Definition: jvm.cpp:252
bool thread_is_interrupted(threadobject *t)
Definition: thread.cpp:926
int32_t assertion_class_count
Definition: assertion.cpp:43
jobjectArray JVM_GetClassFields(JNIEnv *env, jclass cls, jint which)
Definition: jvm.cpp:3214
MIIterator i
Fieldref, Methodref and InterfaceMethodref.
Definition: references.hpp:86
jint JVM_InitializeSocketLibrary()
Definition: jvm.cpp:2793
jint JVM_GetSockName(jint fd, struct sockaddr *him, int *len)
Definition: jvm.cpp:2922
void JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode)
Definition: jvm.cpp:2670
jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
Definition: jvm.cpp:1042
jobject JVM_GetField(JNIEnv *env, jobject field, jobject obj)
Definition: jvm.cpp:3284
int32_t s4
Definition: types.hpp:45
#define JVM_EEXIST
Definition: jvm.cpp:2071
JNIEnv jclass jobject loader
Definition: jvmti.h:312
GNU Classpath java/lang/Throwable.
jboolean JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)
Definition: jvm.cpp:1972
jlong JVM_Lseek(jint fd, jlong offset, jint whence)
Definition: jvm.cpp:2180
s4 cpcount
Definition: class.hpp:94
jint JVM_Write(jint fd, char *buf, jint nbytes)
Definition: jvm.cpp:2132
Represents a native library.
Definition: native.hpp:60
#define TRACEJVMCALLSVERBOSE(x)
Definition: jvm.cpp:128
jint JVM_GetLastErrorString(char *buf, int len)
Definition: jvm.cpp:577
bool initialize_class(classinfo *c)
Definition: initialize.cpp:110
void JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable)
Definition: jvm.cpp:396
void JVM_SetField(JNIEnv *env, jobject field, jobject obj, jobject val)
Definition: jvm.cpp:3308
jlong JVM_MaxMemory(void)
Definition: jvm.cpp:361
void lock_wait_for_object(java_handle_t *o, s8 millis, s4 nanos)
Definition: lock.cpp:1321
void fill(java_handle_t *p)
Fill the given Java system properties with all properties from the internal properties map...
Definition: properties.cpp:611
jint JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index)
Definition: jvm.cpp:1748
jobjectArray JVM_GetThreadStateNames(JNIEnv *env, jint javaThreadState, jintArray values)
Definition: jvm.cpp:3604
threadobject * thread_get_thread(java_handle_t *h)
Definition: thread.cpp:874
jstring JVM_GetSystemPackage(JNIEnv *env, jstring name)
Definition: jvm.cpp:2518
bool threads_thread_is_alive(threadobject *t)
Definition: thread.cpp:886
jboolean JVM_IsPrimitiveClass(JNIEnv *env, jclass cls)
Definition: jvm.cpp:977
jvalue JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode)
Definition: jvm.cpp:2644
void exceptions_throw_privilegedactionexception(java_handle_t *exception)
MIIterator e
jint JVM_ActiveProcessorCount(void)
Definition: jvm.cpp:371
static const std::set< Utf8String > & packages()
Definition: package.cpp:90
jobjectArray JVM_GetSystemPackages(JNIEnv *env)
Definition: jvm.cpp:2533
java_handle_t * native_new_and_init(classinfo *c)
Registers a new native agent by specified by it&#39;s library name and with an optional options string...
Definition: native.cpp:729
This is a generic accessor class for Java arrays (of unspecified type), which can be used to safely o...
Definition: array.hpp:87
#define LLNI_classinfo_field_set(cls, field, variable)
Definition: llni.hpp:94
static ssize_t send(int s, const void *buf, size_t len, int flags)
Definition: os.hpp:570
jobjectArray JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1439
classinfo * class_java_lang_String
Definition: globals.cpp:39
void thread_set_interrupted(threadobject *t, bool interrupted)
Definition: thread.cpp:949
HPI_LibraryInterface & get_library() const
Definition: hpi.hpp:66
jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
Definition: jvm.cpp:404
byte_iterator begin() const
Definition: utf8.hpp:106
java_handle_t * new_instance(java_handle_objectarray_t *args)
Constructs a Java object with the given java.lang.reflect.Constructor.
struct hostent * JVM_GetHostByAddr(const char *name, int len, int type)
Definition: jvm.cpp:3008
jobject JVM_GetClassLoader(JNIEnv *env, jclass cls)
Definition: jvm.cpp:791
s8 gc_get_heap_size(void)
Definition: gc.c:552
void JVM_ResumeThread(JNIEnv *env, jobject jthread)
Definition: jvm.cpp:2291
jclass JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd)
Definition: jvm.cpp:719
#define pc
Definition: md-asm.hpp:56
int opt_PrintWarnings
Definition: options.cpp:198
#define MNEW(type, num)
Definition: memory.hpp:96
jint JVM_GetInterfaceVersion()
Definition: jvm.cpp:204
jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1268
jobject JVM_GetClassConstantPool(JNIEnv *env, jclass cls)
Definition: jvm.cpp:1232
jint JVM_Connect(jint fd, struct sockaddr *him, jint len)
Definition: jvm.cpp:2882
jint JVM_SetLength(jint fd, jlong length)
Definition: jvm.cpp:2195
static int shutdown(int s, int how)
Definition: os.hpp:589
void JVM_DisableCompiler(JNIEnv *env, jclass compCls)
Definition: jvm.cpp:568
bool lock_is_held_by_current_thread(java_handle_t *o)
Definition: lock.cpp:1280
jobjectArray JVM_GetClassInterfaces(JNIEnv *env, jclass cls)
Definition: jvm.cpp:774
classinfo * class_java_lang_Exception
Definition: globals.cpp:54
jint JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index)
Definition: jvm.cpp:1824
jlong JVM_TotalMemory(void)
Definition: jvm.cpp:341
jint JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)
Definition: jvm.cpp:1814
#define JNI_FALSE
Definition: jni.hpp:109
bool assertion_system_enabled
Definition: assertion.cpp:46
void * JVM_RegisterSignal(jint sig, void *handler)
Definition: jvm.cpp:3764
void builtin_arraycopy(java_handle_t *src, s4 srcStart, java_handle_t *dest, s4 destStart, s4 len)
Definition: builtin.cpp:1946
jlong JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored)
Definition: jvm.cpp:216
static classinfo * get_arrayclass_by_name(Utf8String name)
Returns the primitive array-class of the given primitive class name.
Definition: primitive.cpp:314
jobject JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls)
Definition: jvm.cpp:939
void JVM_TraceInstructions(jboolean on)
Definition: jvm.cpp:325
#define LLNI_CRITICAL_START
Definition: llni.hpp:140
void exceptions_clear_exception(void)
Definition: exceptions.cpp:127
java_handle_objectarray_t * builtin_multianewarray(int n, java_handle_t *arrayclazz, long *dims)
Definition: builtin.cpp:1154
jboolean JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)
Definition: jvm.cpp:519
void JVM_DumpAllStacks(JNIEnv *env, jclass unused)
Definition: jvm.cpp:2459
jint JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)
Definition: jvm.cpp:1804
constant_classref * classref
Definition: references.hpp:97
jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
Definition: jvm.cpp:1100
jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1382
void JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
Definition: jvm.cpp:3170
void JVM_SetPrimitiveField(JNIEnv *env, jobject field, jobject obj, jvalue v, unsigned char vCode)
Definition: jvm.cpp:3316
java_handle_t * exceptions_get_exception(void)
Definition: exceptions.cpp:76
void * JVM_FindLibraryEntry(void *handle, const char *name)
Definition: jvm.cpp:3066
void JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val)
Definition: jvm.cpp:2658
jclass JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name)
Definition: jvm.cpp:746
jintArray JVM_GetThreadStateValues(JNIEnv *env, jint javaThreadState)
Definition: jvm.cpp:3512
s8 builtin_currenttimemillis(void)
Definition: builtin.cpp:2063
jobjectArray JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads)
Definition: jvm.cpp:3405
jint JVM_Available(jint fd, jlong *pbytes)
Definition: jvm.cpp:2147
void JVM_Exit(jint code)
Definition: jvm.cpp:278
classinfo * load_class_from_classloader(Utf8String name, classloader_t *cl)
Definition: loader.cpp:1071
java_object_t * object
Definition: thread.hpp:93
jobject JVM_Clone(JNIEnv *env, jobject handle)
Definition: jvm.cpp:501
classinfo * resolve_classref_eager(constant_classref *ref)
Definition: resolve.cpp:961
jint JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls)
Definition: jvm.cpp:1710
jint JVM_GetClassModifiers(JNIEnv *env, jclass cls)
Definition: jvm.cpp:1008
java_handle_t * builtin_clone(void *env, java_handle_t *o)
Definition: builtin.cpp:2081
void JVM_OnExit(void(*func)(void))
Definition: jvm.cpp:297
classinfo * class_java_lang_Thread
Definition: globals.cpp:41
jvalue JVM_GetPrimitiveField(JNIEnv *env, jobject field, jobject obj, unsigned char wCode)
Definition: jvm.cpp:3294
#define LLNI_classinfo_unwrap(clazz)
Definition: llni.hpp:113
void JVM_SetNativeThreadName(JNIEnv *env, jclass cls, jobject name)
Definition: jvm.cpp:2337
jint JVM_Timeout(int fd, long timeout)
Definition: jvm.cpp:2862
jboolean JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index)
Definition: jvm.cpp:1844
classinfo * class_java_lang_StackTraceElement
Definition: globals.cpp:80
static bool class_is_primitive(classinfo *c)
Definition: class.hpp:311
jstring JVM_InternString(JNIEnv *env, jstring str)
Definition: jvm.cpp:3116
void threads_sleep(int64_t millis, int32_t nanos)
jobjectArray JVM_GetClassSigners(JNIEnv *env, jclass cls)
Definition: jvm.cpp:823
jint JVM_GetClassAccessFlags(JNIEnv *env, jclass cls)
Definition: jvm.cpp:1216
jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
Definition: jvm.cpp:1080
jint JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)
Definition: jvm.cpp:2838
jint JVM_ClassDepth(JNIEnv *env, jstring name)
Definition: jvm.cpp:2498
#define str(x)
s4 flags
Definition: method.hpp:70
void JVM_StopThread(JNIEnv *env, jobject jthread, jobject throwable)
Definition: jvm.cpp:2235
java_handle_t * get_boxed_element(int32_t index)
Returns a boxed element of the given Java array.
Definition: array.cpp:44
fieldinfo * field
Definition: references.hpp:100
jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
Definition: jvm.cpp:1151
jint JVM_SocketClose(jint fd)
Definition: jvm.cpp:2818
bool jni_version_check(int version)
Definition: jni.cpp:282
bool is_null() const
Definition: array.hpp:203
jboolean JVM_IsInterface(JNIEnv *env, jclass cls)
Definition: jvm.cpp:809
void * JVM_LoadLibrary(const char *name)
Definition: jvm.cpp:3038
jint JVM_Socket(jint domain, jint type, jint protocol)
Definition: jvm.cpp:2808
const char * JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index)
Definition: jvm.cpp:1934
static JavaString literal(Utf8String)
Definition: string.cpp:257
jobjectArray JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass)
Definition: jvm.cpp:3483
const char * JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index)
Definition: jvm.cpp:1854
Nl nl
Definition: OStream.cpp:56
int initialize_socket_library()
Initialize the Host Porting Interface (HPI) socket library.
Definition: hpi.cpp:141
static int close(int fd)
Definition: os.hpp:261
static void put(java_handle_t *p, const char *key, const char *value)
Add the given property to the given Java system properties.
Definition: properties.cpp:531
const char const void jint length
Definition: jvmti.h:352
const char * JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index)
Definition: jvm.cpp:1874
int32_t assertion_package_count
Definition: assertion.cpp:44
jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
Definition: jvm.cpp:1117
classinfo * class_define(Utf8String name, classloader_t *cl, int32_t length, uint8_t *data, java_handle_t *pd)
Definition: class.cpp:243
void signal_thread_handler(int sig)
Definition: signal.cpp:285
jobject JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)
Definition: jvm.cpp:2717
static int gethostname(char *name, size_t len)
Definition: os.hpp:415
jboolean JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls)
Definition: jvm.cpp:1567
classinfo * class_get_componenttype(classinfo *c)
Definition: class.cpp:1594
java_handle_bytearray_t * stacktrace_get_current(void)
Definition: stacktrace.cpp:635
jboolean JVM_IsNaN(jdouble d)
Definition: jvm.cpp:3090
void threads_yield(void)
jboolean JVM_HoldsLock(JNIEnv *env, jclass threadClass, jobject obj)
Definition: jvm.cpp:2437
jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
Definition: jvm.cpp:1523
int jio_printf(const char *fmt,...)
Definition: jvm.cpp:194
jobject JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0)
Definition: jvm.cpp:3324
static VM * get_current()
Definition: vm.hpp:99
void JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj, jlongArray fieldIDs, jcharArray typecodes, jbyteArray data)
Definition: jvm.cpp:3178
#define PRINTJVMWARNINGS(x)
Definition: jvm.cpp:135
jclass JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source)
Definition: jvm.cpp:729
bool threads_resume_thread(threadobject *thread, SuspendReason reason)
Resumes execution of the passed thread.
void set_boxed_element(int32_t index, java_handle_t *o)
Sets a boxed element in the given Java array.
Definition: array.cpp:71
jobject JVM_GetClassMethod(JNIEnv *env, jclass cls, jstring name, jobjectArray types, jint which)
Definition: jvm.cpp:3254
Utf8String to_utf8_dot_to_slash() const
Definition: string.cpp:450
jobject JVM_GetClassConstructor(JNIEnv *env, jclass cls, jobjectArray types, jint which)
Definition: jvm.cpp:3264