398 * Return the temporary directory that the VM uses for the attach 399 * and perf data files. 400 * 401 * It is important that this directory is well-known and the 402 * same for all VM instances. It cannot be affected by configuration 403 * variables such as java.io.tmpdir. 404 */ 405 JVM_ENTRY(jstring, JVM_GetTemporaryDirectory(JNIEnv *env)) 406 JVMWrapper("JVM_GetTemporaryDirectory"); 407 HandleMark hm(THREAD); 408 const char* temp_dir = os::get_temp_directory(); 409 Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL); 410 return (jstring) JNIHandles::make_local(env, h()); 411 JVM_END 412 413 414 // java.lang.Runtime ///////////////////////////////////////////////////////////////////////// 415 416 extern volatile jint vm_created; 417 418 JVM_ENTRY_NO_ENV(void, JVM_Exit(jint code)) 419 if (vm_created != 0 && (code == 0)) { 420 // The VM is about to exit. We call back into Java to check whether finalizers should be run 421 Universe::run_finalizers_on_exit(); 422 } 423 before_exit(thread); 424 vm_exit(code); 425 JVM_END 426 427 428 JVM_ENTRY_NO_ENV(void, JVM_Halt(jint code)) 429 before_exit(thread); 430 vm_exit(code); 431 JVM_END 432 433 434 JVM_LEAF(void, JVM_OnExit(void (*func)(void))) 435 register_on_exit_function(func); 436 JVM_END 437 438 439 JVM_ENTRY_NO_ENV(void, JVM_GC(void)) 440 JVMWrapper("JVM_GC"); 441 if (!DisableExplicitGC) { 442 Universe::heap()->collect(GCCause::_java_lang_system_gc); 443 } 444 JVM_END 445 446 447 JVM_LEAF(jlong, JVM_MaxObjectInspectionAge(void)) 448 JVMWrapper("JVM_MaxObjectInspectionAge"); 449 return Universe::heap()->millis_since_last_gc(); 450 JVM_END 451 452 453 JVM_LEAF(void, JVM_TraceInstructions(jboolean on)) 454 if (PrintJVMWarnings) warning("JVM_TraceInstructions not supported"); 455 JVM_END 456 457 458 JVM_LEAF(void, JVM_TraceMethodCalls(jboolean on)) 459 if (PrintJVMWarnings) warning("JVM_TraceMethodCalls not supported"); 460 JVM_END 461 462 static inline jlong convert_size_t_to_jlong(size_t val) { 463 // In the 64-bit vm, a size_t can overflow a jlong (which is signed). 464 NOT_LP64 (return (jlong)val;) 465 LP64_ONLY(return (jlong)MIN2(val, (size_t)max_jlong);) 466 } 467 468 JVM_ENTRY_NO_ENV(jlong, JVM_TotalMemory(void)) 469 JVMWrapper("JVM_TotalMemory"); 470 size_t n = Universe::heap()->capacity(); 471 return convert_size_t_to_jlong(n); 472 JVM_END 473 474 475 JVM_ENTRY_NO_ENV(jlong, JVM_FreeMemory(void)) 476 JVMWrapper("JVM_FreeMemory"); 477 CollectedHeap* ch = Universe::heap(); 478 size_t n; 479 { 480 MutexLocker x(Heap_lock); 481 n = ch->capacity() - ch->used(); 611 Copy::conjoint_jlongs_atomic((jlong*)obj(), (jlong*)new_obj, 612 (size_t)align_object_size(size) / HeapWordsPerLong); 613 // Clear the header 614 new_obj->init_mark(); 615 616 // Store check (mark entire object and let gc sort it out) 617 BarrierSet* bs = Universe::heap()->barrier_set(); 618 assert(bs->has_write_region_opt(), "Barrier set does not have write_region"); 619 bs->write_region(MemRegion((HeapWord*)new_obj, size)); 620 621 // Caution: this involves a java upcall, so the clone should be 622 // "gc-robust" by this stage. 623 if (klass->has_finalizer()) { 624 assert(obj->is_instance(), "should be instanceOop"); 625 new_obj = InstanceKlass::register_finalizer(instanceOop(new_obj), CHECK_NULL); 626 } 627 628 return JNIHandles::make_local(env, oop(new_obj)); 629 JVM_END 630 631 // java.lang.Compiler //////////////////////////////////////////////////// 632 633 // The initial cuts of the HotSpot VM will not support JITs, and all existing 634 // JITs would need extensive changes to work with HotSpot. The JIT-related JVM 635 // functions are all silently ignored unless JVM warnings are printed. 636 637 JVM_LEAF(void, JVM_InitializeCompiler (JNIEnv *env, jclass compCls)) 638 if (PrintJVMWarnings) warning("JVM_InitializeCompiler not supported"); 639 JVM_END 640 641 642 JVM_LEAF(jboolean, JVM_IsSilentCompiler(JNIEnv *env, jclass compCls)) 643 if (PrintJVMWarnings) warning("JVM_IsSilentCompiler not supported"); 644 return JNI_FALSE; 645 JVM_END 646 647 648 JVM_LEAF(jboolean, JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls)) 649 if (PrintJVMWarnings) warning("JVM_CompileClass not supported"); 650 return JNI_FALSE; 651 JVM_END 652 653 654 JVM_LEAF(jboolean, JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname)) 655 if (PrintJVMWarnings) warning("JVM_CompileClasses not supported"); 656 return JNI_FALSE; 657 JVM_END 658 659 660 JVM_LEAF(jobject, JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg)) 661 if (PrintJVMWarnings) warning("JVM_CompilerCommand not supported"); 662 return NULL; 663 JVM_END 664 665 666 JVM_LEAF(void, JVM_EnableCompiler(JNIEnv *env, jclass compCls)) 667 if (PrintJVMWarnings) warning("JVM_EnableCompiler not supported"); 668 JVM_END 669 670 671 JVM_LEAF(void, JVM_DisableCompiler(JNIEnv *env, jclass compCls)) 672 if (PrintJVMWarnings) warning("JVM_DisableCompiler not supported"); 673 JVM_END 674 675 676 677 // Error message support ////////////////////////////////////////////////////// 678 679 JVM_LEAF(jint, JVM_GetLastErrorString(char *buf, int len)) 680 JVMWrapper("JVM_GetLastErrorString"); 681 return (jint)os::lasterror(buf, len); 682 JVM_END 683 684 685 // java.io.File /////////////////////////////////////////////////////////////// 686 687 JVM_LEAF(char*, JVM_NativePath(char* path)) 688 JVMWrapper2("JVM_NativePath (%s)", path); 689 return os::native_path(path); 690 JVM_END 691 692 693 // Misc. class handling /////////////////////////////////////////////////////////// 694 695 696 JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth)) 697 JVMWrapper("JVM_GetCallerClass"); 698 699 // Pre-JDK 8 and early builds of JDK 8 don't have a CallerSensitive annotation; or 700 // sun.reflect.Reflection.getCallerClass with a depth parameter is provided 701 // temporarily for existing code to use until a replacement API is defined. 702 if (SystemDictionary::reflect_CallerSensitive_klass() == NULL || depth != JVM_CALLER_DEPTH) { 703 Klass* k = thread->security_get_caller_class(depth); 704 return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, k->java_mirror()); 740 } 741 return NULL; 742 JVM_END 743 744 745 JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf)) 746 JVMWrapper("JVM_FindPrimitiveClass"); 747 oop mirror = NULL; 748 BasicType t = name2type(utf); 749 if (t != T_ILLEGAL && t != T_OBJECT && t != T_ARRAY) { 750 mirror = Universe::java_mirror(t); 751 } 752 if (mirror == NULL) { 753 THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf); 754 } else { 755 return (jclass) JNIHandles::make_local(env, mirror); 756 } 757 JVM_END 758 759 760 JVM_ENTRY(void, JVM_ResolveClass(JNIEnv* env, jclass cls)) 761 JVMWrapper("JVM_ResolveClass"); 762 if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented"); 763 JVM_END 764 765 766 // Returns a class loaded by the bootstrap class loader; or null 767 // if not found. ClassNotFoundException is not thrown. 768 // 769 // Rationale behind JVM_FindClassFromBootLoader 770 // a> JVM_FindClassFromClassLoader was never exported in the export tables. 771 // b> because of (a) java.dll has a direct dependecy on the unexported 772 // private symbol "_JVM_FindClassFromClassLoader@20". 773 // c> the launcher cannot use the private symbol as it dynamically opens 774 // the entry point, so if something changes, the launcher will fail 775 // unexpectedly at runtime, it is safest for the launcher to dlopen a 776 // stable exported interface. 777 // d> re-exporting JVM_FindClassFromClassLoader as public, will cause its 778 // signature to change from _JVM_FindClassFromClassLoader@20 to 779 // JVM_FindClassFromClassLoader and will not be backward compatible 780 // with older JDKs. 781 // Thus a public/stable exported entry point is the right solution, 782 // public here means public in linker semantics, and is exported only 783 // to the JDK, and is not intended to be a public API. 784 785 JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env, 1597 KlassHandle kh(THREAD, k); 1598 intptr_t offset = InstanceKlass::cast(kh())->field_offset(slot); 1599 1600 if (modifiers & JVM_ACC_STATIC) { 1601 // for static fields we only look in the current class 1602 if (!InstanceKlass::cast(kh())->find_local_field_from_offset(offset, true, &fd)) { 1603 assert(false, "cannot find static field"); 1604 return false; 1605 } 1606 } else { 1607 // for instance fields we start with the current class and work 1608 // our way up through the superclass chain 1609 if (!InstanceKlass::cast(kh())->find_field_from_offset(offset, false, &fd)) { 1610 assert(false, "cannot find instance field"); 1611 return false; 1612 } 1613 } 1614 return true; 1615 } 1616 1617 JVM_ENTRY(jbyteArray, JVM_GetFieldAnnotations(JNIEnv *env, jobject field)) 1618 // field is a handle to a java.lang.reflect.Field object 1619 assert(field != NULL, "illegal field"); 1620 JVMWrapper("JVM_GetFieldAnnotations"); 1621 1622 fieldDescriptor fd; 1623 bool gotFd = jvm_get_field_common(field, fd, CHECK_NULL); 1624 if (!gotFd) { 1625 return NULL; 1626 } 1627 1628 return (jbyteArray) JNIHandles::make_local(env, Annotations::make_java_array(fd.annotations(), THREAD)); 1629 JVM_END 1630 1631 1632 static Method* jvm_get_method_common(jobject method) { 1633 // some of this code was adapted from from jni_FromReflectedMethod 1634 1635 oop reflected = JNIHandles::resolve_non_null(method); 1636 oop mirror = NULL; 1637 int slot = 0; 1638 1639 if (reflected->klass() == SystemDictionary::reflect_Constructor_klass()) { 1640 mirror = java_lang_reflect_Constructor::clazz(reflected); 1641 slot = java_lang_reflect_Constructor::slot(reflected); 1642 } else { 1643 assert(reflected->klass() == SystemDictionary::reflect_Method_klass(), 1644 "wrong type"); 1645 mirror = java_lang_reflect_Method::clazz(reflected); 1646 slot = java_lang_reflect_Method::slot(reflected); 1647 } 1648 Klass* k = java_lang_Class::as_Klass(mirror); 1649 1650 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); 1651 assert(m != NULL, "cannot find method"); 1652 return m; // caller has to deal with NULL in product mode 1653 } 1654 1655 1656 JVM_ENTRY(jbyteArray, JVM_GetMethodAnnotations(JNIEnv *env, jobject method)) 1657 JVMWrapper("JVM_GetMethodAnnotations"); 1658 1659 // method is a handle to a java.lang.reflect.Method object 1660 Method* m = jvm_get_method_common(method); 1661 if (m == NULL) { 1662 return NULL; 1663 } 1664 1665 return (jbyteArray) JNIHandles::make_local(env, 1666 Annotations::make_java_array(m->annotations(), THREAD)); 1667 JVM_END 1668 1669 1670 JVM_ENTRY(jbyteArray, JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)) 1671 JVMWrapper("JVM_GetMethodDefaultAnnotationValue"); 1672 1673 // method is a handle to a java.lang.reflect.Method object 1674 Method* m = jvm_get_method_common(method); 1675 if (m == NULL) { 1676 return NULL; 1677 } 1678 1679 return (jbyteArray) JNIHandles::make_local(env, 1680 Annotations::make_java_array(m->annotation_default(), THREAD)); 1681 JVM_END 1682 1683 1684 JVM_ENTRY(jbyteArray, JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)) 1685 JVMWrapper("JVM_GetMethodParameterAnnotations"); 1686 1687 // method is a handle to a java.lang.reflect.Method object 1688 Method* m = jvm_get_method_common(method); 1689 if (m == NULL) { 1690 return NULL; 1691 } 1692 1693 return (jbyteArray) JNIHandles::make_local(env, 1694 Annotations::make_java_array(m->parameter_annotations(), THREAD)); 1695 JVM_END 1696 1697 /* Type use annotations support (JDK 1.8) */ 1698 1699 JVM_ENTRY(jbyteArray, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls)) 1700 assert (cls != NULL, "illegal class"); 1701 JVMWrapper("JVM_GetClassTypeAnnotations"); 1702 ResourceMark rm(THREAD); 1703 // Return null for arrays and primitives 1704 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { 1705 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); 1706 if (k->oop_is_instance()) { 1707 AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations(); 1708 if (type_annotations != NULL) { 1709 typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL); 1710 return (jbyteArray) JNIHandles::make_local(env, a); 1711 } 1712 } 1713 } 1714 return NULL; 1715 JVM_END 1716 2663 return 0; 2664 JVM_END 2665 2666 2667 // Misc ////////////////////////////////////////////////////////////////////////////////////////////// 2668 2669 JVM_LEAF(void, JVM_ReleaseUTF(const char *utf)) 2670 // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything 2671 JVM_END 2672 2673 2674 JVM_ENTRY(jboolean, JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)) 2675 JVMWrapper("JVM_IsSameClassPackage"); 2676 oop class1_mirror = JNIHandles::resolve_non_null(class1); 2677 oop class2_mirror = JNIHandles::resolve_non_null(class2); 2678 Klass* klass1 = java_lang_Class::as_Klass(class1_mirror); 2679 Klass* klass2 = java_lang_Class::as_Klass(class2_mirror); 2680 return (jboolean) Reflection::is_same_class_package(klass1, klass2); 2681 JVM_END 2682 2683 2684 // IO functions //////////////////////////////////////////////////////////////////////////////////////// 2685 2686 JVM_LEAF(jint, JVM_Open(const char *fname, jint flags, jint mode)) 2687 JVMWrapper2("JVM_Open (%s)", fname); 2688 2689 //%note jvm_r6 2690 int result = os::open(fname, flags, mode); 2691 if (result >= 0) { 2692 return result; 2693 } else { 2694 switch(errno) { 2695 case EEXIST: 2696 return JVM_EEXIST; 2697 default: 2698 return -1; 2699 } 2700 } 2701 JVM_END 2702 2703 2704 JVM_LEAF(jint, JVM_Close(jint fd)) 2705 JVMWrapper2("JVM_Close (0x%x)", fd); 2706 //%note jvm_r6 2707 return os::close(fd); 2708 JVM_END 2709 2710 2711 JVM_LEAF(jint, JVM_Read(jint fd, char *buf, jint nbytes)) 2712 JVMWrapper2("JVM_Read (0x%x)", fd); 2713 2714 //%note jvm_r6 2715 return (jint)os::restartable_read(fd, buf, nbytes); 2716 JVM_END 2717 2718 2719 JVM_LEAF(jint, JVM_Write(jint fd, char *buf, jint nbytes)) 2720 JVMWrapper2("JVM_Write (0x%x)", fd); 2721 2722 //%note jvm_r6 2723 return (jint)os::write(fd, buf, nbytes); 2724 JVM_END 2725 2726 2727 JVM_LEAF(jint, JVM_Available(jint fd, jlong *pbytes)) 2728 JVMWrapper2("JVM_Available (0x%x)", fd); 2729 //%note jvm_r6 2730 return os::available(fd, pbytes); 2731 JVM_END 2732 2733 2734 JVM_LEAF(jlong, JVM_Lseek(jint fd, jlong offset, jint whence)) 2735 JVMWrapper4("JVM_Lseek (0x%x, " INT64_FORMAT ", %d)", fd, (int64_t) offset, whence); 2736 //%note jvm_r6 2737 return os::lseek(fd, offset, whence); 2738 JVM_END 2739 2740 2741 JVM_LEAF(jint, JVM_SetLength(jint fd, jlong length)) 2742 JVMWrapper3("JVM_SetLength (0x%x, " INT64_FORMAT ")", fd, (int64_t) length); 2743 return os::ftruncate(fd, length); 2744 JVM_END 2745 2746 2747 JVM_LEAF(jint, JVM_Sync(jint fd)) 2748 JVMWrapper2("JVM_Sync (0x%x)", fd); 2749 //%note jvm_r6 2750 return os::fsync(fd); 2751 JVM_END 2752 2753 2754 // Printing support ////////////////////////////////////////////////// 2755 extern "C" { 2756 2757 ATTRIBUTE_PRINTF(3, 0) 2758 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) { 2759 // see bug 4399518, 4417214 2760 if ((intptr_t)count <= 0) return -1; 2761 return vsnprintf(str, count, fmt, args); 2762 } 2763 2764 ATTRIBUTE_PRINTF(3, 0) 2765 int jio_snprintf(char *str, size_t count, const char *fmt, ...) { 2766 va_list args; 2767 int len; 2768 va_start(args, fmt); 2769 len = jio_vsnprintf(str, count, fmt, args); 2770 va_end(args); 2771 return len; 2772 } 2773 3405 // ObjectInputStream /////////////////////////////////////////////////////////////// 3406 3407 bool force_verify_field_access(Klass* current_class, Klass* field_class, AccessFlags access, bool classloader_only) { 3408 if (current_class == NULL) { 3409 return true; 3410 } 3411 if ((current_class == field_class) || access.is_public()) { 3412 return true; 3413 } 3414 3415 if (access.is_protected()) { 3416 // See if current_class is a subclass of field_class 3417 if (current_class->is_subclass_of(field_class)) { 3418 return true; 3419 } 3420 } 3421 3422 return (!access.is_private() && InstanceKlass::cast(current_class)->is_same_class_package(field_class)); 3423 } 3424 3425 3426 // JVM_AllocateNewObject and JVM_AllocateNewArray are unused as of 1.4 3427 JVM_ENTRY(jobject, JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass)) 3428 JVMWrapper("JVM_AllocateNewObject"); 3429 JvmtiVMObjectAllocEventCollector oam; 3430 // Receiver is not used 3431 oop curr_mirror = JNIHandles::resolve_non_null(currClass); 3432 oop init_mirror = JNIHandles::resolve_non_null(initClass); 3433 3434 // Cannot instantiate primitive types 3435 if (java_lang_Class::is_primitive(curr_mirror) || java_lang_Class::is_primitive(init_mirror)) { 3436 ResourceMark rm(THREAD); 3437 THROW_0(vmSymbols::java_lang_InvalidClassException()); 3438 } 3439 3440 // Arrays not allowed here, must use JVM_AllocateNewArray 3441 if (java_lang_Class::as_Klass(curr_mirror)->oop_is_array() || 3442 java_lang_Class::as_Klass(init_mirror)->oop_is_array()) { 3443 ResourceMark rm(THREAD); 3444 THROW_0(vmSymbols::java_lang_InvalidClassException()); 3445 } 3446 3447 instanceKlassHandle curr_klass (THREAD, java_lang_Class::as_Klass(curr_mirror)); 3448 instanceKlassHandle init_klass (THREAD, java_lang_Class::as_Klass(init_mirror)); 3449 3450 assert(curr_klass->is_subclass_of(init_klass()), "just checking"); 3451 3452 // Interfaces, abstract classes, and java.lang.Class classes cannot be instantiated directly. 3453 curr_klass->check_valid_for_instantiation(false, CHECK_NULL); 3454 3455 // Make sure klass is initialized, since we are about to instantiate one of them. 3456 curr_klass->initialize(CHECK_NULL); 3457 3458 methodHandle m (THREAD, 3459 init_klass->find_method(vmSymbols::object_initializer_name(), 3460 vmSymbols::void_method_signature())); 3461 if (m.is_null()) { 3462 ResourceMark rm(THREAD); 3463 THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), 3464 Method::name_and_sig_as_C_string(init_klass(), 3465 vmSymbols::object_initializer_name(), 3466 vmSymbols::void_method_signature())); 3467 } 3468 3469 if (curr_klass == init_klass && !m->is_public()) { 3470 // Calling the constructor for class 'curr_klass'. 3471 // Only allow calls to a public no-arg constructor. 3472 // This path corresponds to creating an Externalizable object. 3473 THROW_0(vmSymbols::java_lang_IllegalAccessException()); 3474 } 3475 3476 if (!force_verify_field_access(curr_klass(), init_klass(), m->access_flags(), false)) { 3477 // subclass 'curr_klass' does not have access to no-arg constructor of 'initcb' 3478 THROW_0(vmSymbols::java_lang_IllegalAccessException()); 3479 } 3480 3481 Handle obj = curr_klass->allocate_instance_handle(CHECK_NULL); 3482 // Call constructor m. This might call a constructor higher up in the hierachy 3483 JavaCalls::call_default_constructor(thread, m, obj, CHECK_NULL); 3484 3485 return JNIHandles::make_local(obj()); 3486 JVM_END 3487 3488 3489 JVM_ENTRY(jobject, JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length)) 3490 JVMWrapper("JVM_AllocateNewArray"); 3491 JvmtiVMObjectAllocEventCollector oam; 3492 oop mirror = JNIHandles::resolve_non_null(currClass); 3493 3494 if (java_lang_Class::is_primitive(mirror)) { 3495 THROW_0(vmSymbols::java_lang_InvalidClassException()); 3496 } 3497 Klass* k = java_lang_Class::as_Klass(mirror); 3498 oop result; 3499 3500 if (k->oop_is_typeArray()) { 3501 // typeArray 3502 result = TypeArrayKlass::cast(k)->allocate(length, CHECK_NULL); 3503 } else if (k->oop_is_objArray()) { 3504 // objArray 3505 ObjArrayKlass* oak = ObjArrayKlass::cast(k); 3506 oak->initialize(CHECK_NULL); // make sure class is initialized (matches Classic VM behavior) 3507 result = oak->allocate(length, CHECK_NULL); 3508 } else { 3509 THROW_0(vmSymbols::java_lang_InvalidClassException()); 3510 } 3511 return JNIHandles::make_local(env, result); 3512 JVM_END 3513 3514 3515 // Return the first non-null class loader up the execution stack, or null 3516 // if only code from the null class loader is on the stack. 3517 3518 JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env)) 3519 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) { 3520 vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection 3521 oop loader = vfst.method()->method_holder()->class_loader(); 3522 if (loader != NULL) { 3523 return JNIHandles::make_local(env, loader); 3524 } 3525 } 3526 return NULL; 3527 JVM_END 3528 3529 3530 // Load a class relative to the most recent class on the stack with a non-null 3531 // classloader. 3532 // This function has been deprecated and should not be considered part of the 3533 // specified JVM interface. 3534 3535 JVM_ENTRY(jclass, JVM_LoadClass0(JNIEnv *env, jobject receiver, 3536 jclass currClass, jstring currClassName)) 3537 JVMWrapper("JVM_LoadClass0"); 3538 // Receiver is not used 3539 ResourceMark rm(THREAD); 3540 3541 // Class name argument is not guaranteed to be in internal format 3542 Handle classname (THREAD, JNIHandles::resolve_non_null(currClassName)); 3543 Handle string = java_lang_String::internalize_classname(classname, CHECK_NULL); 3544 3545 const char* str = java_lang_String::as_utf8_string(string()); 3546 3547 if (str == NULL || (int)strlen(str) > Symbol::max_length()) { 3548 // It's impossible to create this class; the name cannot fit 3549 // into the constant pool. 3550 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), str); 3551 } 3552 3553 TempNewSymbol name = SymbolTable::new_symbol(str, CHECK_NULL); 3554 Handle curr_klass (THREAD, JNIHandles::resolve(currClass)); 3555 // Find the most recent class on the stack with a non-null classloader 3556 oop loader = NULL; 3557 oop protection_domain = NULL; 3558 if (curr_klass.is_null()) { 3559 for (vframeStream vfst(thread); 3560 !vfst.at_end() && loader == NULL; 3561 vfst.next()) { 3562 if (!vfst.method()->is_native()) { 3563 InstanceKlass* holder = vfst.method()->method_holder(); 3564 loader = holder->class_loader(); 3565 protection_domain = holder->protection_domain(); 3566 } 3567 } 3568 } else { 3569 Klass* curr_klass_oop = java_lang_Class::as_Klass(curr_klass()); 3570 loader = InstanceKlass::cast(curr_klass_oop)->class_loader(); 3571 protection_domain = InstanceKlass::cast(curr_klass_oop)->protection_domain(); 3572 } 3573 Handle h_loader(THREAD, loader); 3574 Handle h_prot (THREAD, protection_domain); 3575 jclass result = find_class_from_class_loader(env, name, true, h_loader, h_prot, 3576 false, thread); 3577 if (TraceClassResolution && result != NULL) { 3578 trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result))); 3579 } 3580 return result; 3581 JVM_END 3582 3583 3584 // Array /////////////////////////////////////////////////////////////////////////////////////////// 3585 3586 3587 // resolve array handle and check arguments 3588 static inline arrayOop check_array(JNIEnv *env, jobject arr, bool type_array_only, TRAPS) { 3589 if (arr == NULL) { 3590 THROW_0(vmSymbols::java_lang_NullPointerException()); 3591 } 3592 oop a = JNIHandles::resolve_non_null(arr); 3593 if (!a->is_array() || (type_array_only && !a->is_typeArray())) { 3594 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array"); 3595 } 3596 return arrayOop(a); 3597 } 3598 3599 3600 JVM_ENTRY(jint, JVM_GetArrayLength(JNIEnv *env, jobject arr)) 3601 JVMWrapper("JVM_GetArrayLength"); 3602 arrayOop a = check_array(env, arr, false, CHECK_0); 3603 return a->length(); 3659 JVM_ENTRY(jobject, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)) 3660 JVMWrapper("JVM_NewArray"); 3661 JvmtiVMObjectAllocEventCollector oam; 3662 oop element_mirror = JNIHandles::resolve(eltClass); 3663 oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL); 3664 return JNIHandles::make_local(env, result); 3665 JVM_END 3666 3667 3668 JVM_ENTRY(jobject, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)) 3669 JVMWrapper("JVM_NewMultiArray"); 3670 JvmtiVMObjectAllocEventCollector oam; 3671 arrayOop dim_array = check_array(env, dim, true, CHECK_NULL); 3672 oop element_mirror = JNIHandles::resolve(eltClass); 3673 assert(dim_array->is_typeArray(), "just checking"); 3674 oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL); 3675 return JNIHandles::make_local(env, result); 3676 JVM_END 3677 3678 3679 // Networking library support //////////////////////////////////////////////////////////////////// 3680 3681 JVM_LEAF(jint, JVM_InitializeSocketLibrary()) 3682 JVMWrapper("JVM_InitializeSocketLibrary"); 3683 return 0; 3684 JVM_END 3685 3686 3687 JVM_LEAF(jint, JVM_Socket(jint domain, jint type, jint protocol)) 3688 JVMWrapper("JVM_Socket"); 3689 return os::socket(domain, type, protocol); 3690 JVM_END 3691 3692 3693 JVM_LEAF(jint, JVM_SocketClose(jint fd)) 3694 JVMWrapper2("JVM_SocketClose (0x%x)", fd); 3695 //%note jvm_r6 3696 return os::socket_close(fd); 3697 JVM_END 3698 3699 3700 JVM_LEAF(jint, JVM_SocketShutdown(jint fd, jint howto)) 3701 JVMWrapper2("JVM_SocketShutdown (0x%x)", fd); 3702 //%note jvm_r6 3703 return os::socket_shutdown(fd, howto); 3704 JVM_END 3705 3706 3707 JVM_LEAF(jint, JVM_Recv(jint fd, char *buf, jint nBytes, jint flags)) 3708 JVMWrapper2("JVM_Recv (0x%x)", fd); 3709 //%note jvm_r6 3710 return os::recv(fd, buf, (size_t)nBytes, (uint)flags); 3711 JVM_END 3712 3713 3714 JVM_LEAF(jint, JVM_Send(jint fd, char *buf, jint nBytes, jint flags)) 3715 JVMWrapper2("JVM_Send (0x%x)", fd); 3716 //%note jvm_r6 3717 return os::send(fd, buf, (size_t)nBytes, (uint)flags); 3718 JVM_END 3719 3720 3721 JVM_LEAF(jint, JVM_Timeout(int fd, long timeout)) 3722 JVMWrapper2("JVM_Timeout (0x%x)", fd); 3723 //%note jvm_r6 3724 return os::timeout(fd, timeout); 3725 JVM_END 3726 3727 3728 JVM_LEAF(jint, JVM_Listen(jint fd, jint count)) 3729 JVMWrapper2("JVM_Listen (0x%x)", fd); 3730 //%note jvm_r6 3731 return os::listen(fd, count); 3732 JVM_END 3733 3734 3735 JVM_LEAF(jint, JVM_Connect(jint fd, struct sockaddr *him, jint len)) 3736 JVMWrapper2("JVM_Connect (0x%x)", fd); 3737 //%note jvm_r6 3738 return os::connect(fd, him, (socklen_t)len); 3739 JVM_END 3740 3741 3742 JVM_LEAF(jint, JVM_Bind(jint fd, struct sockaddr *him, jint len)) 3743 JVMWrapper2("JVM_Bind (0x%x)", fd); 3744 //%note jvm_r6 3745 return os::bind(fd, him, (socklen_t)len); 3746 JVM_END 3747 3748 3749 JVM_LEAF(jint, JVM_Accept(jint fd, struct sockaddr *him, jint *len)) 3750 JVMWrapper2("JVM_Accept (0x%x)", fd); 3751 //%note jvm_r6 3752 socklen_t socklen = (socklen_t)(*len); 3753 jint result = os::accept(fd, him, &socklen); 3754 *len = (jint)socklen; 3755 return result; 3756 JVM_END 3757 3758 3759 JVM_LEAF(jint, JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen)) 3760 JVMWrapper2("JVM_RecvFrom (0x%x)", fd); 3761 //%note jvm_r6 3762 socklen_t socklen = (socklen_t)(*fromlen); 3763 jint result = os::recvfrom(fd, buf, (size_t)nBytes, (uint)flags, from, &socklen); 3764 *fromlen = (int)socklen; 3765 return result; 3766 JVM_END 3767 3768 3769 JVM_LEAF(jint, JVM_GetSockName(jint fd, struct sockaddr *him, int *len)) 3770 JVMWrapper2("JVM_GetSockName (0x%x)", fd); 3771 //%note jvm_r6 3772 socklen_t socklen = (socklen_t)(*len); 3773 jint result = os::get_sock_name(fd, him, &socklen); 3774 *len = (int)socklen; 3775 return result; 3776 JVM_END 3777 3778 3779 JVM_LEAF(jint, JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen)) 3780 JVMWrapper2("JVM_SendTo (0x%x)", fd); 3781 //%note jvm_r6 3782 return os::sendto(fd, buf, (size_t)len, (uint)flags, to, (socklen_t)tolen); 3783 JVM_END 3784 3785 3786 JVM_LEAF(jint, JVM_SocketAvailable(jint fd, jint *pbytes)) 3787 JVMWrapper2("JVM_SocketAvailable (0x%x)", fd); 3788 //%note jvm_r6 3789 return os::socket_available(fd, pbytes); 3790 JVM_END 3791 3792 3793 JVM_LEAF(jint, JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen)) 3794 JVMWrapper2("JVM_GetSockOpt (0x%x)", fd); 3795 //%note jvm_r6 3796 socklen_t socklen = (socklen_t)(*optlen); 3797 jint result = os::get_sock_opt(fd, level, optname, optval, &socklen); 3798 *optlen = (int)socklen; 3799 return result; 3800 JVM_END 3801 3802 3803 JVM_LEAF(jint, JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen)) 3804 JVMWrapper2("JVM_GetSockOpt (0x%x)", fd); 3805 //%note jvm_r6 3806 return os::set_sock_opt(fd, level, optname, optval, (socklen_t)optlen); 3807 JVM_END 3808 3809 3810 JVM_LEAF(int, JVM_GetHostName(char* name, int namelen)) 3811 JVMWrapper("JVM_GetHostName"); 3812 return os::get_host_name(name, namelen); 3813 JVM_END 3814 3815 3816 // Library support /////////////////////////////////////////////////////////////////////////// 3817 3818 JVM_ENTRY_NO_ENV(void*, JVM_LoadLibrary(const char* name)) 3819 //%note jvm_ct 3820 JVMWrapper2("JVM_LoadLibrary (%s)", name); 3821 char ebuf[1024]; 3822 void *load_result; 3823 { 3824 ThreadToNativeFromVM ttnfvm(thread); 3825 load_result = os::dll_load(name, ebuf, sizeof ebuf); 3826 } 3827 if (load_result == NULL) { 3828 char msg[1024]; 3829 jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf); 3830 // Since 'ebuf' may contain a string encoded using 3831 // platform encoding scheme, we need to pass 3832 // Exceptions::unsafe_to_utf8 to the new_exception method 3833 // as the last argument. See bug 6367357. 3834 Handle h_exception = 3835 Exceptions::new_exception(thread, 3837 msg, Exceptions::unsafe_to_utf8); 3838 3839 THROW_HANDLE_0(h_exception); 3840 } 3841 return load_result; 3842 JVM_END 3843 3844 3845 JVM_LEAF(void, JVM_UnloadLibrary(void* handle)) 3846 JVMWrapper("JVM_UnloadLibrary"); 3847 os::dll_unload(handle); 3848 JVM_END 3849 3850 3851 JVM_LEAF(void*, JVM_FindLibraryEntry(void* handle, const char* name)) 3852 JVMWrapper2("JVM_FindLibraryEntry (%s)", name); 3853 return os::dll_lookup(handle, name); 3854 JVM_END 3855 3856 3857 // Floating point support //////////////////////////////////////////////////////////////////// 3858 3859 JVM_LEAF(jboolean, JVM_IsNaN(jdouble a)) 3860 JVMWrapper("JVM_IsNaN"); 3861 return g_isnan(a); 3862 JVM_END 3863 3864 3865 // JNI version /////////////////////////////////////////////////////////////////////////////// 3866 3867 JVM_LEAF(jboolean, JVM_IsSupportedJNIVersion(jint version)) 3868 JVMWrapper2("JVM_IsSupportedJNIVersion (%d)", version); 3869 return Threads::is_supported_jni_version_including_1_1(version); 3870 JVM_END 3871 3872 3873 // String support /////////////////////////////////////////////////////////////////////////// 3874 3875 JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str)) 3876 JVMWrapper("JVM_InternString"); 3877 JvmtiVMObjectAllocEventCollector oam; 3878 if (str == NULL) return NULL; 3879 oop string = JNIHandles::resolve_non_null(str); 3880 oop result = StringTable::intern(string, CHECK_NULL); 3881 return (jstring) JNIHandles::make_local(env, result); 3882 JVM_END 3883 3884 3965 3966 JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)) 3967 JVMWrapper("JVM_NewInstanceFromConstructor"); 3968 oop constructor_mirror = JNIHandles::resolve(c); 3969 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0))); 3970 oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL); 3971 jobject res = JNIHandles::make_local(env, result); 3972 if (JvmtiExport::should_post_vm_object_alloc()) { 3973 JvmtiExport::post_vm_object_alloc(JavaThread::current(), result); 3974 } 3975 return res; 3976 JVM_END 3977 3978 // Atomic /////////////////////////////////////////////////////////////////////////////////////////// 3979 3980 JVM_LEAF(jboolean, JVM_SupportsCX8()) 3981 JVMWrapper("JVM_SupportsCX8"); 3982 return VM_Version::supports_cx8(); 3983 JVM_END 3984 3985 3986 JVM_ENTRY(jboolean, JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal)) 3987 JVMWrapper("JVM_CX8Field"); 3988 jlong res; 3989 oop o = JNIHandles::resolve(obj); 3990 intptr_t fldOffs = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid); 3991 volatile jlong* addr = (volatile jlong*)((address)o + fldOffs); 3992 3993 assert(VM_Version::supports_cx8(), "cx8 not supported"); 3994 res = Atomic::cmpxchg(newVal, addr, oldVal); 3995 3996 return res == oldVal; 3997 JVM_END 3998 3999 // DTrace /////////////////////////////////////////////////////////////////// 4000 4001 JVM_ENTRY(jint, JVM_DTraceGetVersion(JNIEnv* env)) 4002 JVMWrapper("JVM_DTraceGetVersion"); 4003 return (jint)JVM_TRACING_DTRACE_VERSION; 4004 JVM_END 4005 4006 JVM_ENTRY(jlong,JVM_DTraceActivate( 4007 JNIEnv* env, jint version, jstring module_name, jint providers_count, 4008 JVM_DTraceProvider* providers)) 4009 JVMWrapper("JVM_DTraceActivate"); 4010 return DTraceJSDT::activate( 4011 version, module_name, providers_count, providers, CHECK_0); 4012 JVM_END 4013 4014 JVM_ENTRY(jboolean,JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method)) 4015 JVMWrapper("JVM_DTraceIsProbeEnabled"); 4016 return DTraceJSDT::is_probe_enabled(method); 4017 JVM_END 4018 4133 objArrayHandle dest(THREAD, dest_o); 4134 Klass* enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL); 4135 dest->obj_at_put(0, enc_k->java_mirror()); 4136 int encl_method_method_idx = ik_h->enclosing_method_method_index(); 4137 if (encl_method_method_idx != 0) { 4138 Symbol* sym = ik_h->constants()->symbol_at( 4139 extract_low_short_from_int( 4140 ik_h->constants()->name_and_type_at(encl_method_method_idx))); 4141 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); 4142 dest->obj_at_put(1, str()); 4143 sym = ik_h->constants()->symbol_at( 4144 extract_high_short_from_int( 4145 ik_h->constants()->name_and_type_at(encl_method_method_idx))); 4146 str = java_lang_String::create_from_symbol(sym, CHECK_NULL); 4147 dest->obj_at_put(2, str()); 4148 } 4149 return (jobjectArray) JNIHandles::make_local(dest()); 4150 } 4151 JVM_END 4152 4153 JVM_ENTRY(jintArray, JVM_GetThreadStateValues(JNIEnv* env, 4154 jint javaThreadState)) 4155 { 4156 // If new thread states are added in future JDK and VM versions, 4157 // this should check if the JDK version is compatible with thread 4158 // states supported by the VM. Return NULL if not compatible. 4159 // 4160 // This function must map the VM java_lang_Thread::ThreadStatus 4161 // to the Java thread state that the JDK supports. 4162 // 4163 4164 typeArrayHandle values_h; 4165 switch (javaThreadState) { 4166 case JAVA_THREAD_STATE_NEW : { 4167 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL); 4168 values_h = typeArrayHandle(THREAD, r); 4169 values_h->int_at_put(0, java_lang_Thread::NEW); 4170 break; 4171 } 4172 case JAVA_THREAD_STATE_RUNNABLE : { 4173 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL); 4174 values_h = typeArrayHandle(THREAD, r); 4175 values_h->int_at_put(0, java_lang_Thread::RUNNABLE); 4176 break; 4177 } 4178 case JAVA_THREAD_STATE_BLOCKED : { 4179 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL); 4180 values_h = typeArrayHandle(THREAD, r); 4181 values_h->int_at_put(0, java_lang_Thread::BLOCKED_ON_MONITOR_ENTER); 4182 break; 4183 } 4184 case JAVA_THREAD_STATE_WAITING : { 4185 typeArrayOop r = oopFactory::new_typeArray(T_INT, 2, CHECK_NULL); 4186 values_h = typeArrayHandle(THREAD, r); 4187 values_h->int_at_put(0, java_lang_Thread::IN_OBJECT_WAIT); 4188 values_h->int_at_put(1, java_lang_Thread::PARKED); 4189 break; 4190 } 4191 case JAVA_THREAD_STATE_TIMED_WAITING : { 4192 typeArrayOop r = oopFactory::new_typeArray(T_INT, 3, CHECK_NULL); 4193 values_h = typeArrayHandle(THREAD, r); 4194 values_h->int_at_put(0, java_lang_Thread::SLEEPING); 4195 values_h->int_at_put(1, java_lang_Thread::IN_OBJECT_WAIT_TIMED); 4196 values_h->int_at_put(2, java_lang_Thread::PARKED_TIMED); 4197 break; 4198 } 4199 case JAVA_THREAD_STATE_TERMINATED : { 4200 typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL); 4201 values_h = typeArrayHandle(THREAD, r); 4202 values_h->int_at_put(0, java_lang_Thread::TERMINATED); 4203 break; 4204 } 4205 default: 4206 // Unknown state - probably incompatible JDK version 4207 return NULL; 4208 } 4209 4210 return (jintArray) JNIHandles::make_local(env, values_h()); 4211 } 4212 JVM_END 4213 4214 4215 JVM_ENTRY(jobjectArray, JVM_GetThreadStateNames(JNIEnv* env, 4216 jint javaThreadState, 4217 jintArray values)) 4218 { 4219 // If new thread states are added in future JDK and VM versions, 4220 // this should check if the JDK version is compatible with thread 4221 // states supported by the VM. Return NULL if not compatible. 4222 // 4223 // This function must map the VM java_lang_Thread::ThreadStatus 4224 // to the Java thread state that the JDK supports. 4225 // 4226 4227 ResourceMark rm; 4228 4229 // Check if threads is null 4230 if (values == NULL) { 4231 THROW_(vmSymbols::java_lang_NullPointerException(), 0); 4232 } 4233 4234 typeArrayOop v = typeArrayOop(JNIHandles::resolve_non_null(values)); 4235 typeArrayHandle values_h(THREAD, v); 4236 4237 objArrayHandle names_h; 4238 switch (javaThreadState) { 4239 case JAVA_THREAD_STATE_NEW : { 4240 assert(values_h->length() == 1 && 4241 values_h->int_at(0) == java_lang_Thread::NEW, 4242 "Invalid threadStatus value"); 4243 4244 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(), 4245 1, /* only 1 substate */ 4246 CHECK_NULL); 4247 names_h = objArrayHandle(THREAD, r); 4248 Handle name = java_lang_String::create_from_str("NEW", CHECK_NULL); 4249 names_h->obj_at_put(0, name()); 4250 break; 4251 } 4252 case JAVA_THREAD_STATE_RUNNABLE : { 4253 assert(values_h->length() == 1 && 4254 values_h->int_at(0) == java_lang_Thread::RUNNABLE, 4255 "Invalid threadStatus value"); 4256 4257 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(), 4258 1, /* only 1 substate */ 4259 CHECK_NULL); 4260 names_h = objArrayHandle(THREAD, r); 4261 Handle name = java_lang_String::create_from_str("RUNNABLE", CHECK_NULL); 4262 names_h->obj_at_put(0, name()); 4263 break; 4264 } 4265 case JAVA_THREAD_STATE_BLOCKED : { 4266 assert(values_h->length() == 1 && 4267 values_h->int_at(0) == java_lang_Thread::BLOCKED_ON_MONITOR_ENTER, 4268 "Invalid threadStatus value"); 4269 4270 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(), 4271 1, /* only 1 substate */ 4272 CHECK_NULL); 4273 names_h = objArrayHandle(THREAD, r); 4274 Handle name = java_lang_String::create_from_str("BLOCKED", CHECK_NULL); 4275 names_h->obj_at_put(0, name()); 4276 break; 4277 } 4278 case JAVA_THREAD_STATE_WAITING : { 4279 assert(values_h->length() == 2 && 4280 values_h->int_at(0) == java_lang_Thread::IN_OBJECT_WAIT && 4281 values_h->int_at(1) == java_lang_Thread::PARKED, 4282 "Invalid threadStatus value"); 4283 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(), 4284 2, /* number of substates */ 4285 CHECK_NULL); 4286 names_h = objArrayHandle(THREAD, r); 4287 Handle name0 = java_lang_String::create_from_str("WAITING.OBJECT_WAIT", 4288 CHECK_NULL); 4289 Handle name1 = java_lang_String::create_from_str("WAITING.PARKED", 4290 CHECK_NULL); 4291 names_h->obj_at_put(0, name0()); 4292 names_h->obj_at_put(1, name1()); 4293 break; 4294 } 4295 case JAVA_THREAD_STATE_TIMED_WAITING : { 4296 assert(values_h->length() == 3 && 4297 values_h->int_at(0) == java_lang_Thread::SLEEPING && 4298 values_h->int_at(1) == java_lang_Thread::IN_OBJECT_WAIT_TIMED && 4299 values_h->int_at(2) == java_lang_Thread::PARKED_TIMED, 4300 "Invalid threadStatus value"); 4301 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(), 4302 3, /* number of substates */ 4303 CHECK_NULL); 4304 names_h = objArrayHandle(THREAD, r); 4305 Handle name0 = java_lang_String::create_from_str("TIMED_WAITING.SLEEPING", 4306 CHECK_NULL); 4307 Handle name1 = java_lang_String::create_from_str("TIMED_WAITING.OBJECT_WAIT", 4308 CHECK_NULL); 4309 Handle name2 = java_lang_String::create_from_str("TIMED_WAITING.PARKED", 4310 CHECK_NULL); 4311 names_h->obj_at_put(0, name0()); 4312 names_h->obj_at_put(1, name1()); 4313 names_h->obj_at_put(2, name2()); 4314 break; 4315 } 4316 case JAVA_THREAD_STATE_TERMINATED : { 4317 assert(values_h->length() == 1 && 4318 values_h->int_at(0) == java_lang_Thread::TERMINATED, 4319 "Invalid threadStatus value"); 4320 objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(), 4321 1, /* only 1 substate */ 4322 CHECK_NULL); 4323 names_h = objArrayHandle(THREAD, r); 4324 Handle name = java_lang_String::create_from_str("TERMINATED", CHECK_NULL); 4325 names_h->obj_at_put(0, name()); 4326 break; 4327 } 4328 default: 4329 // Unknown state - probably incompatible JDK version 4330 return NULL; 4331 } 4332 return (jobjectArray) JNIHandles::make_local(env, names_h()); 4333 } 4334 JVM_END 4335 4336 JVM_ENTRY(void, JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)) 4337 { 4338 memset(info, 0, info_size); 4339 4340 info->jvm_version = Abstract_VM_Version::jvm_version(); 4341 info->update_version = 0; /* 0 in HotSpot Express VM */ 4342 info->special_update_version = 0; /* 0 in HotSpot Express VM */ 4343 4344 // when we add a new capability in the jvm_version_info struct, we should also 4345 // consider to expose this new capability in the sun.rt.jvmCapabilities jvmstat 4346 // counter defined in runtimeService.cpp. 4347 info->is_attachable = AttachListener::is_attach_supported(); 4348 } 4349 JVM_END | 398 * Return the temporary directory that the VM uses for the attach 399 * and perf data files. 400 * 401 * It is important that this directory is well-known and the 402 * same for all VM instances. It cannot be affected by configuration 403 * variables such as java.io.tmpdir. 404 */ 405 JVM_ENTRY(jstring, JVM_GetTemporaryDirectory(JNIEnv *env)) 406 JVMWrapper("JVM_GetTemporaryDirectory"); 407 HandleMark hm(THREAD); 408 const char* temp_dir = os::get_temp_directory(); 409 Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL); 410 return (jstring) JNIHandles::make_local(env, h()); 411 JVM_END 412 413 414 // java.lang.Runtime ///////////////////////////////////////////////////////////////////////// 415 416 extern volatile jint vm_created; 417 418 JVM_ENTRY_NO_ENV(void, JVM_Halt(jint code)) 419 before_exit(thread); 420 vm_exit(code); 421 JVM_END 422 423 424 JVM_ENTRY_NO_ENV(void, JVM_GC(void)) 425 JVMWrapper("JVM_GC"); 426 if (!DisableExplicitGC) { 427 Universe::heap()->collect(GCCause::_java_lang_system_gc); 428 } 429 JVM_END 430 431 432 JVM_LEAF(jlong, JVM_MaxObjectInspectionAge(void)) 433 JVMWrapper("JVM_MaxObjectInspectionAge"); 434 return Universe::heap()->millis_since_last_gc(); 435 JVM_END 436 437 438 static inline jlong convert_size_t_to_jlong(size_t val) { 439 // In the 64-bit vm, a size_t can overflow a jlong (which is signed). 440 NOT_LP64 (return (jlong)val;) 441 LP64_ONLY(return (jlong)MIN2(val, (size_t)max_jlong);) 442 } 443 444 JVM_ENTRY_NO_ENV(jlong, JVM_TotalMemory(void)) 445 JVMWrapper("JVM_TotalMemory"); 446 size_t n = Universe::heap()->capacity(); 447 return convert_size_t_to_jlong(n); 448 JVM_END 449 450 451 JVM_ENTRY_NO_ENV(jlong, JVM_FreeMemory(void)) 452 JVMWrapper("JVM_FreeMemory"); 453 CollectedHeap* ch = Universe::heap(); 454 size_t n; 455 { 456 MutexLocker x(Heap_lock); 457 n = ch->capacity() - ch->used(); 587 Copy::conjoint_jlongs_atomic((jlong*)obj(), (jlong*)new_obj, 588 (size_t)align_object_size(size) / HeapWordsPerLong); 589 // Clear the header 590 new_obj->init_mark(); 591 592 // Store check (mark entire object and let gc sort it out) 593 BarrierSet* bs = Universe::heap()->barrier_set(); 594 assert(bs->has_write_region_opt(), "Barrier set does not have write_region"); 595 bs->write_region(MemRegion((HeapWord*)new_obj, size)); 596 597 // Caution: this involves a java upcall, so the clone should be 598 // "gc-robust" by this stage. 599 if (klass->has_finalizer()) { 600 assert(obj->is_instance(), "should be instanceOop"); 601 new_obj = InstanceKlass::register_finalizer(instanceOop(new_obj), CHECK_NULL); 602 } 603 604 return JNIHandles::make_local(env, oop(new_obj)); 605 JVM_END 606 607 // java.io.File /////////////////////////////////////////////////////////////// 608 609 JVM_LEAF(char*, JVM_NativePath(char* path)) 610 JVMWrapper2("JVM_NativePath (%s)", path); 611 return os::native_path(path); 612 JVM_END 613 614 615 // Misc. class handling /////////////////////////////////////////////////////////// 616 617 618 JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth)) 619 JVMWrapper("JVM_GetCallerClass"); 620 621 // Pre-JDK 8 and early builds of JDK 8 don't have a CallerSensitive annotation; or 622 // sun.reflect.Reflection.getCallerClass with a depth parameter is provided 623 // temporarily for existing code to use until a replacement API is defined. 624 if (SystemDictionary::reflect_CallerSensitive_klass() == NULL || depth != JVM_CALLER_DEPTH) { 625 Klass* k = thread->security_get_caller_class(depth); 626 return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, k->java_mirror()); 662 } 663 return NULL; 664 JVM_END 665 666 667 JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf)) 668 JVMWrapper("JVM_FindPrimitiveClass"); 669 oop mirror = NULL; 670 BasicType t = name2type(utf); 671 if (t != T_ILLEGAL && t != T_OBJECT && t != T_ARRAY) { 672 mirror = Universe::java_mirror(t); 673 } 674 if (mirror == NULL) { 675 THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf); 676 } else { 677 return (jclass) JNIHandles::make_local(env, mirror); 678 } 679 JVM_END 680 681 682 // Returns a class loaded by the bootstrap class loader; or null 683 // if not found. ClassNotFoundException is not thrown. 684 // 685 // Rationale behind JVM_FindClassFromBootLoader 686 // a> JVM_FindClassFromClassLoader was never exported in the export tables. 687 // b> because of (a) java.dll has a direct dependecy on the unexported 688 // private symbol "_JVM_FindClassFromClassLoader@20". 689 // c> the launcher cannot use the private symbol as it dynamically opens 690 // the entry point, so if something changes, the launcher will fail 691 // unexpectedly at runtime, it is safest for the launcher to dlopen a 692 // stable exported interface. 693 // d> re-exporting JVM_FindClassFromClassLoader as public, will cause its 694 // signature to change from _JVM_FindClassFromClassLoader@20 to 695 // JVM_FindClassFromClassLoader and will not be backward compatible 696 // with older JDKs. 697 // Thus a public/stable exported entry point is the right solution, 698 // public here means public in linker semantics, and is exported only 699 // to the JDK, and is not intended to be a public API. 700 701 JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env, 1513 KlassHandle kh(THREAD, k); 1514 intptr_t offset = InstanceKlass::cast(kh())->field_offset(slot); 1515 1516 if (modifiers & JVM_ACC_STATIC) { 1517 // for static fields we only look in the current class 1518 if (!InstanceKlass::cast(kh())->find_local_field_from_offset(offset, true, &fd)) { 1519 assert(false, "cannot find static field"); 1520 return false; 1521 } 1522 } else { 1523 // for instance fields we start with the current class and work 1524 // our way up through the superclass chain 1525 if (!InstanceKlass::cast(kh())->find_field_from_offset(offset, false, &fd)) { 1526 assert(false, "cannot find instance field"); 1527 return false; 1528 } 1529 } 1530 return true; 1531 } 1532 1533 static Method* jvm_get_method_common(jobject method) { 1534 // some of this code was adapted from from jni_FromReflectedMethod 1535 1536 oop reflected = JNIHandles::resolve_non_null(method); 1537 oop mirror = NULL; 1538 int slot = 0; 1539 1540 if (reflected->klass() == SystemDictionary::reflect_Constructor_klass()) { 1541 mirror = java_lang_reflect_Constructor::clazz(reflected); 1542 slot = java_lang_reflect_Constructor::slot(reflected); 1543 } else { 1544 assert(reflected->klass() == SystemDictionary::reflect_Method_klass(), 1545 "wrong type"); 1546 mirror = java_lang_reflect_Method::clazz(reflected); 1547 slot = java_lang_reflect_Method::slot(reflected); 1548 } 1549 Klass* k = java_lang_Class::as_Klass(mirror); 1550 1551 Method* m = InstanceKlass::cast(k)->method_with_idnum(slot); 1552 assert(m != NULL, "cannot find method"); 1553 return m; // caller has to deal with NULL in product mode 1554 } 1555 1556 /* Type use annotations support (JDK 1.8) */ 1557 1558 JVM_ENTRY(jbyteArray, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls)) 1559 assert (cls != NULL, "illegal class"); 1560 JVMWrapper("JVM_GetClassTypeAnnotations"); 1561 ResourceMark rm(THREAD); 1562 // Return null for arrays and primitives 1563 if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) { 1564 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls)); 1565 if (k->oop_is_instance()) { 1566 AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations(); 1567 if (type_annotations != NULL) { 1568 typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL); 1569 return (jbyteArray) JNIHandles::make_local(env, a); 1570 } 1571 } 1572 } 1573 return NULL; 1574 JVM_END 1575 2522 return 0; 2523 JVM_END 2524 2525 2526 // Misc ////////////////////////////////////////////////////////////////////////////////////////////// 2527 2528 JVM_LEAF(void, JVM_ReleaseUTF(const char *utf)) 2529 // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything 2530 JVM_END 2531 2532 2533 JVM_ENTRY(jboolean, JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2)) 2534 JVMWrapper("JVM_IsSameClassPackage"); 2535 oop class1_mirror = JNIHandles::resolve_non_null(class1); 2536 oop class2_mirror = JNIHandles::resolve_non_null(class2); 2537 Klass* klass1 = java_lang_Class::as_Klass(class1_mirror); 2538 Klass* klass2 = java_lang_Class::as_Klass(class2_mirror); 2539 return (jboolean) Reflection::is_same_class_package(klass1, klass2); 2540 JVM_END 2541 2542 // Printing support ////////////////////////////////////////////////// 2543 extern "C" { 2544 2545 ATTRIBUTE_PRINTF(3, 0) 2546 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) { 2547 // see bug 4399518, 4417214 2548 if ((intptr_t)count <= 0) return -1; 2549 return vsnprintf(str, count, fmt, args); 2550 } 2551 2552 ATTRIBUTE_PRINTF(3, 0) 2553 int jio_snprintf(char *str, size_t count, const char *fmt, ...) { 2554 va_list args; 2555 int len; 2556 va_start(args, fmt); 2557 len = jio_vsnprintf(str, count, fmt, args); 2558 va_end(args); 2559 return len; 2560 } 2561 3193 // ObjectInputStream /////////////////////////////////////////////////////////////// 3194 3195 bool force_verify_field_access(Klass* current_class, Klass* field_class, AccessFlags access, bool classloader_only) { 3196 if (current_class == NULL) { 3197 return true; 3198 } 3199 if ((current_class == field_class) || access.is_public()) { 3200 return true; 3201 } 3202 3203 if (access.is_protected()) { 3204 // See if current_class is a subclass of field_class 3205 if (current_class->is_subclass_of(field_class)) { 3206 return true; 3207 } 3208 } 3209 3210 return (!access.is_private() && InstanceKlass::cast(current_class)->is_same_class_package(field_class)); 3211 } 3212 3213 // Return the first non-null class loader up the execution stack, or null 3214 // if only code from the null class loader is on the stack. 3215 3216 JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env)) 3217 for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) { 3218 vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection 3219 oop loader = vfst.method()->method_holder()->class_loader(); 3220 if (loader != NULL) { 3221 return JNIHandles::make_local(env, loader); 3222 } 3223 } 3224 return NULL; 3225 JVM_END 3226 3227 3228 // Array /////////////////////////////////////////////////////////////////////////////////////////// 3229 3230 3231 // resolve array handle and check arguments 3232 static inline arrayOop check_array(JNIEnv *env, jobject arr, bool type_array_only, TRAPS) { 3233 if (arr == NULL) { 3234 THROW_0(vmSymbols::java_lang_NullPointerException()); 3235 } 3236 oop a = JNIHandles::resolve_non_null(arr); 3237 if (!a->is_array() || (type_array_only && !a->is_typeArray())) { 3238 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array"); 3239 } 3240 return arrayOop(a); 3241 } 3242 3243 3244 JVM_ENTRY(jint, JVM_GetArrayLength(JNIEnv *env, jobject arr)) 3245 JVMWrapper("JVM_GetArrayLength"); 3246 arrayOop a = check_array(env, arr, false, CHECK_0); 3247 return a->length(); 3303 JVM_ENTRY(jobject, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length)) 3304 JVMWrapper("JVM_NewArray"); 3305 JvmtiVMObjectAllocEventCollector oam; 3306 oop element_mirror = JNIHandles::resolve(eltClass); 3307 oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL); 3308 return JNIHandles::make_local(env, result); 3309 JVM_END 3310 3311 3312 JVM_ENTRY(jobject, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim)) 3313 JVMWrapper("JVM_NewMultiArray"); 3314 JvmtiVMObjectAllocEventCollector oam; 3315 arrayOop dim_array = check_array(env, dim, true, CHECK_NULL); 3316 oop element_mirror = JNIHandles::resolve(eltClass); 3317 assert(dim_array->is_typeArray(), "just checking"); 3318 oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL); 3319 return JNIHandles::make_local(env, result); 3320 JVM_END 3321 3322 3323 // Library support /////////////////////////////////////////////////////////////////////////// 3324 3325 JVM_ENTRY_NO_ENV(void*, JVM_LoadLibrary(const char* name)) 3326 //%note jvm_ct 3327 JVMWrapper2("JVM_LoadLibrary (%s)", name); 3328 char ebuf[1024]; 3329 void *load_result; 3330 { 3331 ThreadToNativeFromVM ttnfvm(thread); 3332 load_result = os::dll_load(name, ebuf, sizeof ebuf); 3333 } 3334 if (load_result == NULL) { 3335 char msg[1024]; 3336 jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf); 3337 // Since 'ebuf' may contain a string encoded using 3338 // platform encoding scheme, we need to pass 3339 // Exceptions::unsafe_to_utf8 to the new_exception method 3340 // as the last argument. See bug 6367357. 3341 Handle h_exception = 3342 Exceptions::new_exception(thread, 3344 msg, Exceptions::unsafe_to_utf8); 3345 3346 THROW_HANDLE_0(h_exception); 3347 } 3348 return load_result; 3349 JVM_END 3350 3351 3352 JVM_LEAF(void, JVM_UnloadLibrary(void* handle)) 3353 JVMWrapper("JVM_UnloadLibrary"); 3354 os::dll_unload(handle); 3355 JVM_END 3356 3357 3358 JVM_LEAF(void*, JVM_FindLibraryEntry(void* handle, const char* name)) 3359 JVMWrapper2("JVM_FindLibraryEntry (%s)", name); 3360 return os::dll_lookup(handle, name); 3361 JVM_END 3362 3363 3364 // JNI version /////////////////////////////////////////////////////////////////////////////// 3365 3366 JVM_LEAF(jboolean, JVM_IsSupportedJNIVersion(jint version)) 3367 JVMWrapper2("JVM_IsSupportedJNIVersion (%d)", version); 3368 return Threads::is_supported_jni_version_including_1_1(version); 3369 JVM_END 3370 3371 3372 // String support /////////////////////////////////////////////////////////////////////////// 3373 3374 JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str)) 3375 JVMWrapper("JVM_InternString"); 3376 JvmtiVMObjectAllocEventCollector oam; 3377 if (str == NULL) return NULL; 3378 oop string = JNIHandles::resolve_non_null(str); 3379 oop result = StringTable::intern(string, CHECK_NULL); 3380 return (jstring) JNIHandles::make_local(env, result); 3381 JVM_END 3382 3383 3464 3465 JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0)) 3466 JVMWrapper("JVM_NewInstanceFromConstructor"); 3467 oop constructor_mirror = JNIHandles::resolve(c); 3468 objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0))); 3469 oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL); 3470 jobject res = JNIHandles::make_local(env, result); 3471 if (JvmtiExport::should_post_vm_object_alloc()) { 3472 JvmtiExport::post_vm_object_alloc(JavaThread::current(), result); 3473 } 3474 return res; 3475 JVM_END 3476 3477 // Atomic /////////////////////////////////////////////////////////////////////////////////////////// 3478 3479 JVM_LEAF(jboolean, JVM_SupportsCX8()) 3480 JVMWrapper("JVM_SupportsCX8"); 3481 return VM_Version::supports_cx8(); 3482 JVM_END 3483 3484 // DTrace /////////////////////////////////////////////////////////////////// 3485 3486 JVM_ENTRY(jint, JVM_DTraceGetVersion(JNIEnv* env)) 3487 JVMWrapper("JVM_DTraceGetVersion"); 3488 return (jint)JVM_TRACING_DTRACE_VERSION; 3489 JVM_END 3490 3491 JVM_ENTRY(jlong,JVM_DTraceActivate( 3492 JNIEnv* env, jint version, jstring module_name, jint providers_count, 3493 JVM_DTraceProvider* providers)) 3494 JVMWrapper("JVM_DTraceActivate"); 3495 return DTraceJSDT::activate( 3496 version, module_name, providers_count, providers, CHECK_0); 3497 JVM_END 3498 3499 JVM_ENTRY(jboolean,JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method)) 3500 JVMWrapper("JVM_DTraceIsProbeEnabled"); 3501 return DTraceJSDT::is_probe_enabled(method); 3502 JVM_END 3503 3618 objArrayHandle dest(THREAD, dest_o); 3619 Klass* enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL); 3620 dest->obj_at_put(0, enc_k->java_mirror()); 3621 int encl_method_method_idx = ik_h->enclosing_method_method_index(); 3622 if (encl_method_method_idx != 0) { 3623 Symbol* sym = ik_h->constants()->symbol_at( 3624 extract_low_short_from_int( 3625 ik_h->constants()->name_and_type_at(encl_method_method_idx))); 3626 Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL); 3627 dest->obj_at_put(1, str()); 3628 sym = ik_h->constants()->symbol_at( 3629 extract_high_short_from_int( 3630 ik_h->constants()->name_and_type_at(encl_method_method_idx))); 3631 str = java_lang_String::create_from_symbol(sym, CHECK_NULL); 3632 dest->obj_at_put(2, str()); 3633 } 3634 return (jobjectArray) JNIHandles::make_local(dest()); 3635 } 3636 JVM_END 3637 3638 JVM_ENTRY(void, JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size)) 3639 { 3640 memset(info, 0, info_size); 3641 3642 info->jvm_version = Abstract_VM_Version::jvm_version(); 3643 info->update_version = 0; /* 0 in HotSpot Express VM */ 3644 info->special_update_version = 0; /* 0 in HotSpot Express VM */ 3645 3646 // when we add a new capability in the jvm_version_info struct, we should also 3647 // consider to expose this new capability in the sun.rt.jvmCapabilities jvmstat 3648 // counter defined in runtimeService.cpp. 3649 info->is_attachable = AttachListener::is_attach_supported(); 3650 } 3651 JVM_END |