1672 ThreadToNativeFromVM ttnfv(thread);
1673 return doubleBox(thread, env, result);
1674 }
1675 return NULL;
1676 WB_END
1677
1678 WB_ENTRY(jobject, WB_GetMethodStringOption(JNIEnv* env, jobject wb, jobject method, jstring name))
1679 ccstr ccstrResult;
1680 if (GetMethodOption <ccstr> (thread, env, method, name, &ccstrResult)) {
1681 // can't be in VM when we call JNI
1682 ThreadToNativeFromVM ttnfv(thread);
1683 jstring result = env->NewStringUTF(ccstrResult);
1684 CHECK_JNI_EXCEPTION_(env, NULL);
1685 return result;
1686 }
1687 return NULL;
1688 WB_END
1689
1690 WB_ENTRY(jboolean, WB_IsShared(JNIEnv* env, jobject wb, jobject obj))
1691 oop obj_oop = JNIHandles::resolve(obj);
1692 return MetaspaceShared::is_in_shared_space((void*)obj_oop);
1693 WB_END
1694
1695 WB_ENTRY(jboolean, WB_IsSharedClass(JNIEnv* env, jobject wb, jclass clazz))
1696 return (jboolean)MetaspaceShared::is_in_shared_space(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
1697 WB_END
1698
1699 WB_ENTRY(jboolean, WB_AreSharedStringsIgnored(JNIEnv* env))
1700 return StringTable::shared_string_ignored();
1701 WB_END
1702
1703 //Some convenience methods to deal with objects from java
1704 int WhiteBox::offset_for_field(const char* field_name, oop object,
1705 Symbol* signature_symbol) {
1706 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
1707 Thread* THREAD = Thread::current();
1708
1709 //Get the class of our object
1710 Klass* arg_klass = object->klass();
1711 //Turn it into an instance-klass
1712 InstanceKlass* ik = InstanceKlass::cast(arg_klass);
1713
1714 //Create symbols to look for in the class
1715 TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
1716 THREAD);
1717
1718 //To be filled in with an offset of the field we're looking for
1719 fieldDescriptor fd;
1720
1976 {CC"encodeConstantPoolIndyIndex0",
1977 CC"(I)I", (void*)&WB_ConstantPoolEncodeIndyIndex},
1978 {CC"getMethodBooleanOption",
1979 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Boolean;",
1980 (void*)&WB_GetMethodBooleaneOption},
1981 {CC"getMethodIntxOption",
1982 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;",
1983 (void*)&WB_GetMethodIntxOption},
1984 {CC"getMethodUintxOption",
1985 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;",
1986 (void*)&WB_GetMethodUintxOption},
1987 {CC"getMethodDoubleOption",
1988 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Double;",
1989 (void*)&WB_GetMethodDoubleOption},
1990 {CC"getMethodStringOption",
1991 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/String;",
1992 (void*)&WB_GetMethodStringOption},
1993 {CC"isShared", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsShared },
1994 {CC"isSharedClass", CC"(Ljava/lang/Class;)Z", (void*)&WB_IsSharedClass },
1995 {CC"areSharedStringsIgnored", CC"()Z", (void*)&WB_AreSharedStringsIgnored },
1996 {CC"clearInlineCaches0", CC"(Z)V", (void*)&WB_ClearInlineCaches },
1997 {CC"addCompilerDirective", CC"(Ljava/lang/String;)I",
1998 (void*)&WB_AddCompilerDirective },
1999 {CC"removeCompilerDirective", CC"(I)V", (void*)&WB_RemoveCompilerDirective },
2000 {CC"currentGC", CC"()I", (void*)&WB_CurrentGC},
2001 {CC"allSupportedGC", CC"()I", (void*)&WB_AllSupportedGC},
2002 {CC"gcSelectedByErgo", CC"()Z", (void*)&WB_GCSelectedByErgo},
2003 {CC"supportsConcurrentGCPhaseControl", CC"()Z", (void*)&WB_SupportsConcurrentGCPhaseControl},
2004 {CC"getConcurrentGCPhases", CC"()[Ljava/lang/String;",
2005 (void*)&WB_GetConcurrentGCPhases},
2006 {CC"requestConcurrentGCPhase0", CC"(Ljava/lang/String;)Z",
2007 (void*)&WB_RequestConcurrentGCPhase},
2008 };
2009
2010 #undef CC
2011
2012 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
2013 {
2014 if (WhiteBoxAPI) {
2015 // Make sure that wbclass is loaded by the null classloader
|
1672 ThreadToNativeFromVM ttnfv(thread);
1673 return doubleBox(thread, env, result);
1674 }
1675 return NULL;
1676 WB_END
1677
1678 WB_ENTRY(jobject, WB_GetMethodStringOption(JNIEnv* env, jobject wb, jobject method, jstring name))
1679 ccstr ccstrResult;
1680 if (GetMethodOption <ccstr> (thread, env, method, name, &ccstrResult)) {
1681 // can't be in VM when we call JNI
1682 ThreadToNativeFromVM ttnfv(thread);
1683 jstring result = env->NewStringUTF(ccstrResult);
1684 CHECK_JNI_EXCEPTION_(env, NULL);
1685 return result;
1686 }
1687 return NULL;
1688 WB_END
1689
1690 WB_ENTRY(jboolean, WB_IsShared(JNIEnv* env, jobject wb, jobject obj))
1691 oop obj_oop = JNIHandles::resolve(obj);
1692 return oopDesc::is_archive_object(obj_oop);
1693 WB_END
1694
1695 WB_ENTRY(jboolean, WB_IsSharedClass(JNIEnv* env, jobject wb, jclass clazz))
1696 return (jboolean)MetaspaceShared::is_in_shared_space(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
1697 WB_END
1698
1699 WB_ENTRY(jboolean, WB_AreSharedStringsIgnored(JNIEnv* env))
1700 return !StringTable::shared_string_mapped();
1701 WB_END
1702
1703 WB_ENTRY(jobject, WB_GetResolvedReferences(JNIEnv* env, jobject wb, jclass clazz))
1704 Klass *k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
1705 if (k->is_instance_klass()) {
1706 InstanceKlass *ik = InstanceKlass::cast(k);
1707 ConstantPool *cp = ik->constants();
1708 objArrayOop refs = cp->resolved_references();
1709 return (jobject)JNIHandles::make_local(env, refs);
1710 } else {
1711 return NULL;
1712 }
1713 WB_END
1714
1715 //Some convenience methods to deal with objects from java
1716 int WhiteBox::offset_for_field(const char* field_name, oop object,
1717 Symbol* signature_symbol) {
1718 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid");
1719 Thread* THREAD = Thread::current();
1720
1721 //Get the class of our object
1722 Klass* arg_klass = object->klass();
1723 //Turn it into an instance-klass
1724 InstanceKlass* ik = InstanceKlass::cast(arg_klass);
1725
1726 //Create symbols to look for in the class
1727 TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name),
1728 THREAD);
1729
1730 //To be filled in with an offset of the field we're looking for
1731 fieldDescriptor fd;
1732
1988 {CC"encodeConstantPoolIndyIndex0",
1989 CC"(I)I", (void*)&WB_ConstantPoolEncodeIndyIndex},
1990 {CC"getMethodBooleanOption",
1991 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Boolean;",
1992 (void*)&WB_GetMethodBooleaneOption},
1993 {CC"getMethodIntxOption",
1994 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;",
1995 (void*)&WB_GetMethodIntxOption},
1996 {CC"getMethodUintxOption",
1997 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Long;",
1998 (void*)&WB_GetMethodUintxOption},
1999 {CC"getMethodDoubleOption",
2000 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/Double;",
2001 (void*)&WB_GetMethodDoubleOption},
2002 {CC"getMethodStringOption",
2003 CC"(Ljava/lang/reflect/Executable;Ljava/lang/String;)Ljava/lang/String;",
2004 (void*)&WB_GetMethodStringOption},
2005 {CC"isShared", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsShared },
2006 {CC"isSharedClass", CC"(Ljava/lang/Class;)Z", (void*)&WB_IsSharedClass },
2007 {CC"areSharedStringsIgnored", CC"()Z", (void*)&WB_AreSharedStringsIgnored },
2008 {CC"getResolvedReferences", CC"(Ljava/lang/Class;)Ljava/lang/Object;", (void*)&WB_GetResolvedReferences},
2009 {CC"clearInlineCaches0", CC"(Z)V", (void*)&WB_ClearInlineCaches },
2010 {CC"addCompilerDirective", CC"(Ljava/lang/String;)I",
2011 (void*)&WB_AddCompilerDirective },
2012 {CC"removeCompilerDirective", CC"(I)V", (void*)&WB_RemoveCompilerDirective },
2013 {CC"currentGC", CC"()I", (void*)&WB_CurrentGC},
2014 {CC"allSupportedGC", CC"()I", (void*)&WB_AllSupportedGC},
2015 {CC"gcSelectedByErgo", CC"()Z", (void*)&WB_GCSelectedByErgo},
2016 {CC"supportsConcurrentGCPhaseControl", CC"()Z", (void*)&WB_SupportsConcurrentGCPhaseControl},
2017 {CC"getConcurrentGCPhases", CC"()[Ljava/lang/String;",
2018 (void*)&WB_GetConcurrentGCPhases},
2019 {CC"requestConcurrentGCPhase0", CC"(Ljava/lang/String;)Z",
2020 (void*)&WB_RequestConcurrentGCPhase},
2021 };
2022
2023 #undef CC
2024
2025 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass))
2026 {
2027 if (WhiteBoxAPI) {
2028 // Make sure that wbclass is loaded by the null classloader
|