< prev index next >

src/hotspot/share/prims/whitebox.cpp

Print this page

  34 #include "classfile/classPrinter.hpp"
  35 #include "classfile/javaClasses.inline.hpp"
  36 #include "classfile/modules.hpp"
  37 #include "classfile/protectionDomainCache.hpp"
  38 #include "classfile/stringTable.hpp"
  39 #include "classfile/symbolTable.hpp"
  40 #include "classfile/systemDictionary.hpp"
  41 #include "classfile/vmSymbols.hpp"
  42 #include "code/codeCache.hpp"
  43 #include "compiler/compilationPolicy.hpp"
  44 #include "compiler/directivesParser.hpp"
  45 #include "compiler/methodMatcher.hpp"
  46 #include "gc/shared/concurrentGCBreakpoints.hpp"
  47 #include "gc/shared/gcConfig.hpp"
  48 #include "gc/shared/gcLocker.inline.hpp"
  49 #include "gc/shared/genArguments.hpp"
  50 #include "jvmtifiles/jvmtiEnv.hpp"
  51 #include "logging/log.hpp"
  52 #include "memory/iterator.hpp"
  53 #include "memory/metadataFactory.hpp"

  54 #include "memory/metaspace/testHelpers.hpp"
  55 #include "memory/metaspaceUtils.hpp"
  56 #include "memory/oopFactory.hpp"
  57 #include "memory/resourceArea.hpp"
  58 #include "memory/universe.hpp"
  59 #include "nmt/mallocSiteTable.hpp"
  60 #include "nmt/memTracker.hpp"
  61 #include "oops/array.hpp"
  62 #include "oops/compressedOops.hpp"

  63 #include "oops/constantPool.inline.hpp"
  64 #include "oops/klass.inline.hpp"
  65 #include "oops/method.inline.hpp"
  66 #include "oops/methodData.inline.hpp"
  67 #include "oops/objArrayKlass.hpp"
  68 #include "oops/objArrayOop.inline.hpp"
  69 #include "oops/oop.inline.hpp"

  70 #include "oops/typeArrayOop.inline.hpp"
  71 #include "prims/jvmtiEnvBase.hpp"
  72 #include "prims/resolvedMethodTable.hpp"
  73 #include "prims/wbtestmethods/parserTests.hpp"
  74 #include "prims/whitebox.inline.hpp"
  75 #include "runtime/arguments.hpp"
  76 #include "runtime/atomic.hpp"
  77 #include "runtime/deoptimization.hpp"
  78 #include "runtime/fieldDescriptor.inline.hpp"
  79 #include "runtime/flags/jvmFlag.hpp"
  80 #include "runtime/flags/jvmFlagAccess.hpp"
  81 #include "runtime/frame.inline.hpp"
  82 #include "runtime/handles.inline.hpp"
  83 #include "runtime/handshake.hpp"
  84 #include "runtime/interfaceSupport.inline.hpp"
  85 #include "runtime/javaCalls.hpp"
  86 #include "runtime/javaThread.inline.hpp"
  87 #include "runtime/jniHandles.inline.hpp"
  88 #include "runtime/lockStack.hpp"
  89 #include "runtime/os.hpp"

1870   nullStream dev_null;
1871   ClassLoaderStatsVMOperation force_op(&dev_null);
1872   VMThread::execute(&force_op);
1873 WB_END
1874 
1875 WB_ENTRY(jlong, WB_GetConstantPool(JNIEnv* env, jobject wb, jclass klass))
1876   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1877   return (jlong) ik->constants();
1878 WB_END
1879 
1880 WB_ENTRY(jobjectArray, WB_GetResolvedReferences(JNIEnv* env, jobject wb, jclass klass))
1881   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1882   objArrayOop resolved_refs= ik->constants()->resolved_references();
1883   return (jobjectArray)JNIHandles::make_local(THREAD, resolved_refs);
1884 WB_END
1885 
1886 WB_ENTRY(jint, WB_ConstantPoolEncodeIndyIndex(JNIEnv* env, jobject wb, jint index))
1887   return ConstantPool::encode_invokedynamic_index(index);
1888 WB_END
1889 























































































1890 WB_ENTRY(jint, WB_getFieldEntriesLength(JNIEnv* env, jobject wb, jclass klass))
1891   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1892   ConstantPool* cp = ik->constants();
1893   if (cp->cache() == nullptr) {
1894     return -1;
1895   }
1896   return cp->resolved_field_entries_length();
1897 WB_END
1898 
1899 WB_ENTRY(jint, WB_getFieldCPIndex(JNIEnv* env, jobject wb, jclass klass, jint index))
1900   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1901   ConstantPool* cp = ik->constants();
1902   if (cp->cache() == nullptr) {
1903       return -1;
1904   }
1905   return cp->resolved_field_entry_at(index)->constant_pool_index();
1906 WB_END
1907 
1908 WB_ENTRY(jint, WB_getMethodEntriesLength(JNIEnv* env, jobject wb, jclass klass))
1909   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));

2829   {CC"DefineModule",       CC"(Ljava/lang/Object;ZLjava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V",
2830                                                       (void*)&WB_DefineModule },
2831   {CC"AddModuleExports",   CC"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V",
2832                                                       (void*)&WB_AddModuleExports },
2833   {CC"AddReadsModule",     CC"(Ljava/lang/Object;Ljava/lang/Object;)V",
2834                                                       (void*)&WB_AddReadsModule },
2835   {CC"AddModuleExportsToAllUnnamed", CC"(Ljava/lang/Object;Ljava/lang/String;)V",
2836                                                       (void*)&WB_AddModuleExportsToAllUnnamed },
2837   {CC"AddModuleExportsToAll", CC"(Ljava/lang/Object;Ljava/lang/String;)V",
2838                                                       (void*)&WB_AddModuleExportsToAll },
2839   {CC"deflateIdleMonitors", CC"()Z",                  (void*)&WB_DeflateIdleMonitors },
2840   {CC"isMonitorInflated0", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsMonitorInflated  },
2841   {CC"getLockStackCapacity", CC"()I",                 (void*)&WB_getLockStackCapacity },
2842   {CC"supportsRecursiveLightweightLocking", CC"()Z",  (void*)&WB_supportsRecursiveLightweightLocking },
2843   {CC"forceSafepoint",     CC"()V",                   (void*)&WB_ForceSafepoint     },
2844   {CC"forceClassLoaderStatsSafepoint", CC"()V",       (void*)&WB_ForceClassLoaderStatsSafepoint },
2845   {CC"getConstantPool0",   CC"(Ljava/lang/Class;)J",  (void*)&WB_GetConstantPool    },
2846   {CC"getResolvedReferences0", CC"(Ljava/lang/Class;)[Ljava/lang/Object;", (void*)&WB_GetResolvedReferences},
2847   {CC"encodeConstantPoolIndyIndex0",
2848       CC"(I)I",                      (void*)&WB_ConstantPoolEncodeIndyIndex},






2849   {CC"getFieldEntriesLength0", CC"(Ljava/lang/Class;)I",  (void*)&WB_getFieldEntriesLength},
2850   {CC"getFieldCPIndex0",    CC"(Ljava/lang/Class;I)I", (void*)&WB_getFieldCPIndex},
2851   {CC"getMethodEntriesLength0", CC"(Ljava/lang/Class;)I",  (void*)&WB_getMethodEntriesLength},
2852   {CC"getMethodCPIndex0",    CC"(Ljava/lang/Class;I)I", (void*)&WB_getMethodCPIndex},
2853   {CC"getIndyInfoLength0", CC"(Ljava/lang/Class;)I",  (void*)&WB_getIndyInfoLength},
2854   {CC"getIndyCPIndex0",    CC"(Ljava/lang/Class;I)I", (void*)&WB_getIndyCPIndex},
2855   {CC"printClasses0",      CC"(Ljava/lang/String;I)Ljava/lang/String;", (void*)&WB_printClasses},
2856   {CC"printMethods0",      CC"(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;", (void*)&WB_printMethods},
2857   {CC"getMethodBooleanOption",
2858       CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Boolean;",
2859                                                       (void*)&WB_GetMethodBooleaneOption},
2860   {CC"getMethodIntxOption",
2861       CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;",
2862                                                       (void*)&WB_GetMethodIntxOption},
2863   {CC"getMethodUintxOption",
2864       CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;",
2865                                                       (void*)&WB_GetMethodUintxOption},
2866   {CC"getMethodDoubleOption",
2867       CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Double;",
2868                                                       (void*)&WB_GetMethodDoubleOption},

  34 #include "classfile/classPrinter.hpp"
  35 #include "classfile/javaClasses.inline.hpp"
  36 #include "classfile/modules.hpp"
  37 #include "classfile/protectionDomainCache.hpp"
  38 #include "classfile/stringTable.hpp"
  39 #include "classfile/symbolTable.hpp"
  40 #include "classfile/systemDictionary.hpp"
  41 #include "classfile/vmSymbols.hpp"
  42 #include "code/codeCache.hpp"
  43 #include "compiler/compilationPolicy.hpp"
  44 #include "compiler/directivesParser.hpp"
  45 #include "compiler/methodMatcher.hpp"
  46 #include "gc/shared/concurrentGCBreakpoints.hpp"
  47 #include "gc/shared/gcConfig.hpp"
  48 #include "gc/shared/gcLocker.inline.hpp"
  49 #include "gc/shared/genArguments.hpp"
  50 #include "jvmtifiles/jvmtiEnv.hpp"
  51 #include "logging/log.hpp"
  52 #include "memory/iterator.hpp"
  53 #include "memory/metadataFactory.hpp"
  54 #include "memory/iterator.inline.hpp"
  55 #include "memory/metaspace/testHelpers.hpp"
  56 #include "memory/metaspaceUtils.hpp"
  57 #include "memory/oopFactory.hpp"
  58 #include "memory/resourceArea.hpp"
  59 #include "memory/universe.hpp"
  60 #include "nmt/mallocSiteTable.hpp"
  61 #include "nmt/memTracker.hpp"
  62 #include "oops/array.hpp"
  63 #include "oops/compressedOops.hpp"
  64 #include "oops/compressedOops.inline.hpp"
  65 #include "oops/constantPool.inline.hpp"
  66 #include "oops/klass.inline.hpp"
  67 #include "oops/method.inline.hpp"
  68 #include "oops/methodData.inline.hpp"
  69 #include "oops/objArrayKlass.hpp"
  70 #include "oops/objArrayOop.inline.hpp"
  71 #include "oops/oop.inline.hpp"
  72 #include "oops/objArrayOop.inline.hpp"
  73 #include "oops/typeArrayOop.inline.hpp"
  74 #include "prims/jvmtiEnvBase.hpp"
  75 #include "prims/resolvedMethodTable.hpp"
  76 #include "prims/wbtestmethods/parserTests.hpp"
  77 #include "prims/whitebox.inline.hpp"
  78 #include "runtime/arguments.hpp"
  79 #include "runtime/atomic.hpp"
  80 #include "runtime/deoptimization.hpp"
  81 #include "runtime/fieldDescriptor.inline.hpp"
  82 #include "runtime/flags/jvmFlag.hpp"
  83 #include "runtime/flags/jvmFlagAccess.hpp"
  84 #include "runtime/frame.inline.hpp"
  85 #include "runtime/handles.inline.hpp"
  86 #include "runtime/handshake.hpp"
  87 #include "runtime/interfaceSupport.inline.hpp"
  88 #include "runtime/javaCalls.hpp"
  89 #include "runtime/javaThread.inline.hpp"
  90 #include "runtime/jniHandles.inline.hpp"
  91 #include "runtime/lockStack.hpp"
  92 #include "runtime/os.hpp"

1873   nullStream dev_null;
1874   ClassLoaderStatsVMOperation force_op(&dev_null);
1875   VMThread::execute(&force_op);
1876 WB_END
1877 
1878 WB_ENTRY(jlong, WB_GetConstantPool(JNIEnv* env, jobject wb, jclass klass))
1879   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1880   return (jlong) ik->constants();
1881 WB_END
1882 
1883 WB_ENTRY(jobjectArray, WB_GetResolvedReferences(JNIEnv* env, jobject wb, jclass klass))
1884   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1885   objArrayOop resolved_refs= ik->constants()->resolved_references();
1886   return (jobjectArray)JNIHandles::make_local(THREAD, resolved_refs);
1887 WB_END
1888 
1889 WB_ENTRY(jint, WB_ConstantPoolEncodeIndyIndex(JNIEnv* env, jobject wb, jint index))
1890   return ConstantPool::encode_invokedynamic_index(index);
1891 WB_END
1892 
1893 WB_ENTRY(jobjectArray, WB_getObjectsViaKlassOopMaps(JNIEnv* env, jobject wb, jobject thing))
1894   oop aoop = JNIHandles::resolve(thing);
1895   if (!aoop->is_instance()) {
1896     return nullptr;
1897   }
1898   instanceHandle ih(THREAD, (instanceOop) aoop);
1899   InstanceKlass* klass = InstanceKlass::cast(ih->klass());
1900   if (klass->nonstatic_oop_map_count() == 0) {
1901     return nullptr;
1902   }
1903   const OopMapBlock* map = klass->start_of_nonstatic_oop_maps();
1904   const OopMapBlock* const end = map + klass->nonstatic_oop_map_count();
1905   int oop_count = 0;
1906   while (map < end) {
1907     oop_count += map->count();
1908     map++;
1909   }
1910 
1911   objArrayHandle result_array =
1912       oopFactory::new_objArray_handle(vmClasses::Object_klass(), oop_count, CHECK_NULL);
1913   map = klass->start_of_nonstatic_oop_maps();
1914   int index = 0;
1915   while (map < end) {
1916     int offset = map->offset();
1917     for (unsigned int j = 0; j < map->count(); j++) {
1918       result_array->obj_at_put(index++, ih->obj_field(offset));
1919       offset += heapOopSize;
1920     }
1921     map++;
1922   }
1923   return (jobjectArray)JNIHandles::make_local(THREAD, result_array());
1924 WB_END
1925 
1926 class CollectOops : public BasicOopIterateClosure {
1927  public:
1928   GrowableArray<Handle>* array;
1929 
1930   jobjectArray create_jni_result(JNIEnv* env, TRAPS) {
1931     objArrayHandle result_array =
1932         oopFactory::new_objArray_handle(vmClasses::Object_klass(), array->length(), CHECK_NULL);
1933     for (int i = 0 ; i < array->length(); i++) {
1934       result_array->obj_at_put(i, array->at(i)());
1935     }
1936     return (jobjectArray)JNIHandles::make_local(THREAD, result_array());
1937   }
1938 
1939   void add_oop(oop o) {
1940     Handle oh = Handle(Thread::current(), o);
1941     // Value might be oop, but JLS can't see as Object, just iterate through it...
1942     if (oh != nullptr && oh->is_inline_type()) {
1943       oh->oop_iterate(this);
1944     } else {
1945       array->append(oh);
1946     }
1947   }
1948 
1949   void do_oop(oop* o) { add_oop(HeapAccess<>::oop_load(o)); }
1950   void do_oop(narrowOop* v) { add_oop(HeapAccess<>::oop_load(v)); }
1951 };
1952 
1953 
1954 WB_ENTRY(jobjectArray, WB_getObjectsViaOopIterator(JNIEnv* env, jobject wb, jobject thing))
1955   ResourceMark rm(thread);
1956   Handle objh(thread, JNIHandles::resolve(thing));
1957   GrowableArray<Handle>* array = new GrowableArray<Handle>(128);
1958   CollectOops collectOops;
1959   collectOops.array = array;
1960   objh->oop_iterate(&collectOops);
1961   return collectOops.create_jni_result(env, THREAD);
1962 WB_END
1963 
1964 WB_ENTRY(jobjectArray, WB_getObjectsViaFrameOopIterator(JNIEnv* env, jobject wb, jint depth))
1965   ResourceMark rm(THREAD);
1966   GrowableArray<Handle>* array = new GrowableArray<Handle>(128);
1967   CollectOops collectOops;
1968   collectOops.array = array;
1969   StackFrameStream sfs(thread, false /* update */, true /* process_frames */);
1970   while (depth > 0) { // Skip the native WB API frame
1971     sfs.next();
1972     frame* f = sfs.current();
1973     f->oops_do(&collectOops, nullptr, sfs.register_map());
1974     depth--;
1975   }
1976   return collectOops.create_jni_result(env, THREAD);
1977 WB_END
1978 
1979 
1980 WB_ENTRY(jint, WB_getFieldEntriesLength(JNIEnv* env, jobject wb, jclass klass))
1981   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1982   ConstantPool* cp = ik->constants();
1983   if (cp->cache() == nullptr) {
1984     return -1;
1985   }
1986   return cp->resolved_field_entries_length();
1987 WB_END
1988 
1989 WB_ENTRY(jint, WB_getFieldCPIndex(JNIEnv* env, jobject wb, jclass klass, jint index))
1990   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));
1991   ConstantPool* cp = ik->constants();
1992   if (cp->cache() == nullptr) {
1993       return -1;
1994   }
1995   return cp->resolved_field_entry_at(index)->constant_pool_index();
1996 WB_END
1997 
1998 WB_ENTRY(jint, WB_getMethodEntriesLength(JNIEnv* env, jobject wb, jclass klass))
1999   InstanceKlass* ik = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve(klass)));

2919   {CC"DefineModule",       CC"(Ljava/lang/Object;ZLjava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V",
2920                                                       (void*)&WB_DefineModule },
2921   {CC"AddModuleExports",   CC"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V",
2922                                                       (void*)&WB_AddModuleExports },
2923   {CC"AddReadsModule",     CC"(Ljava/lang/Object;Ljava/lang/Object;)V",
2924                                                       (void*)&WB_AddReadsModule },
2925   {CC"AddModuleExportsToAllUnnamed", CC"(Ljava/lang/Object;Ljava/lang/String;)V",
2926                                                       (void*)&WB_AddModuleExportsToAllUnnamed },
2927   {CC"AddModuleExportsToAll", CC"(Ljava/lang/Object;Ljava/lang/String;)V",
2928                                                       (void*)&WB_AddModuleExportsToAll },
2929   {CC"deflateIdleMonitors", CC"()Z",                  (void*)&WB_DeflateIdleMonitors },
2930   {CC"isMonitorInflated0", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsMonitorInflated  },
2931   {CC"getLockStackCapacity", CC"()I",                 (void*)&WB_getLockStackCapacity },
2932   {CC"supportsRecursiveLightweightLocking", CC"()Z",  (void*)&WB_supportsRecursiveLightweightLocking },
2933   {CC"forceSafepoint",     CC"()V",                   (void*)&WB_ForceSafepoint     },
2934   {CC"forceClassLoaderStatsSafepoint", CC"()V",       (void*)&WB_ForceClassLoaderStatsSafepoint },
2935   {CC"getConstantPool0",   CC"(Ljava/lang/Class;)J",  (void*)&WB_GetConstantPool    },
2936   {CC"getResolvedReferences0", CC"(Ljava/lang/Class;)[Ljava/lang/Object;", (void*)&WB_GetResolvedReferences},
2937   {CC"encodeConstantPoolIndyIndex0",
2938       CC"(I)I",                      (void*)&WB_ConstantPoolEncodeIndyIndex},
2939   {CC"getObjectsViaKlassOopMaps0",
2940       CC"(Ljava/lang/Object;)[Ljava/lang/Object;",    (void*)&WB_getObjectsViaKlassOopMaps},
2941   {CC"getObjectsViaOopIterator0",
2942           CC"(Ljava/lang/Object;)[Ljava/lang/Object;",(void*)&WB_getObjectsViaOopIterator},
2943   {CC"getObjectsViaFrameOopIterator",
2944       CC"(I)[Ljava/lang/Object;",                     (void*)&WB_getObjectsViaFrameOopIterator},
2945   {CC"getFieldEntriesLength0", CC"(Ljava/lang/Class;)I",  (void*)&WB_getFieldEntriesLength},
2946   {CC"getFieldCPIndex0",    CC"(Ljava/lang/Class;I)I", (void*)&WB_getFieldCPIndex},
2947   {CC"getMethodEntriesLength0", CC"(Ljava/lang/Class;)I",  (void*)&WB_getMethodEntriesLength},
2948   {CC"getMethodCPIndex0",    CC"(Ljava/lang/Class;I)I", (void*)&WB_getMethodCPIndex},
2949   {CC"getIndyInfoLength0", CC"(Ljava/lang/Class;)I",  (void*)&WB_getIndyInfoLength},
2950   {CC"getIndyCPIndex0",    CC"(Ljava/lang/Class;I)I", (void*)&WB_getIndyCPIndex},
2951   {CC"printClasses0",      CC"(Ljava/lang/String;I)Ljava/lang/String;", (void*)&WB_printClasses},
2952   {CC"printMethods0",      CC"(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;", (void*)&WB_printMethods},
2953   {CC"getMethodBooleanOption",
2954       CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Boolean;",
2955                                                       (void*)&WB_GetMethodBooleaneOption},
2956   {CC"getMethodIntxOption",
2957       CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;",
2958                                                       (void*)&WB_GetMethodIntxOption},
2959   {CC"getMethodUintxOption",
2960       CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;",
2961                                                       (void*)&WB_GetMethodUintxOption},
2962   {CC"getMethodDoubleOption",
2963       CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Double;",
2964                                                       (void*)&WB_GetMethodDoubleOption},
< prev index next >