Mercurial > hg > truffle
diff src/share/vm/prims/jni.cpp @ 2177:3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
Summary: move symbols from permgen into C heap and reference count them
Reviewed-by: never, acorn, jmasa, stefank
author | coleenp |
---|---|
date | Thu, 27 Jan 2011 16:11:27 -0800 |
parents | 017cd8bce8a8 |
children | d25d4ca69222 c7f3d0b4570f |
line wrap: on
line diff
--- a/src/share/vm/prims/jni.cpp Thu Jan 27 13:42:28 2011 -0800 +++ b/src/share/vm/prims/jni.cpp Thu Jan 27 16:11:27 2011 -0800 @@ -40,7 +40,7 @@ #include "oops/objArrayKlass.hpp" #include "oops/objArrayOop.hpp" #include "oops/oop.inline.hpp" -#include "oops/symbolOop.hpp" +#include "oops/symbol.hpp" #include "oops/typeArrayKlass.hpp" #include "oops/typeArrayOop.hpp" #include "prims/jni.h" @@ -338,16 +338,15 @@ // Since exceptions can be thrown, class initialization can take place // if name is NULL no check for class name in .class stream has to be made. - symbolHandle class_name; if (name != NULL) { const int str_len = (int)strlen(name); - if (str_len > symbolOopDesc::max_length()) { + if (str_len > Symbol::max_length()) { // It's impossible to create this class; the name cannot fit // into the constant pool. THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); } - class_name = oopFactory::new_symbol_handle(name, str_len, CHECK_NULL); } + TempNewSymbol class_name = SymbolTable::new_symbol(name, THREAD); ResourceMark rm(THREAD); ClassFileStream st((u1*) buf, bufLen, NULL); @@ -394,7 +393,7 @@ // Sanity check the name: it cannot be null or larger than the maximum size // name we can fit in the constant pool. - if (name == NULL || (int)strlen(name) > symbolOopDesc::max_length()) { + if (name == NULL || (int)strlen(name) > Symbol::max_length()) { THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name); } @@ -411,8 +410,8 @@ k->name() == vmSymbols::java_lang_ClassLoader_NativeLibrary()) { JavaValue result(T_OBJECT); JavaCalls::call_static(&result, k, - vmSymbolHandles::getFromClass_name(), - vmSymbolHandles::void_class_signature(), + vmSymbols::getFromClass_name(), + vmSymbols::void_class_signature(), thread); if (HAS_PENDING_EXCEPTION) { Handle ex(thread, thread->pending_exception()); @@ -430,7 +429,7 @@ loader = Handle(THREAD, SystemDictionary::java_system_loader()); } - symbolHandle sym = oopFactory::new_symbol_handle(name, CHECK_NULL); + TempNewSymbol sym = SymbolTable::new_symbol(name, CHECK_NULL); result = find_class_from_class_loader(env, sym, true, loader, protection_domain, true, thread); @@ -609,7 +608,7 @@ DT_RETURN_MARK(ThrowNew, jint, (const jint&)ret); instanceKlass* k = instanceKlass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz))); - symbolHandle name = symbolHandle(THREAD, k->name()); + Symbol* name = k->name(); Handle class_loader (THREAD, k->class_loader()); Handle protection_domain (THREAD, k->protection_domain()); THROW_MSG_LOADER_(name, (char *)message, class_loader, protection_domain, JNI_OK); @@ -663,8 +662,8 @@ ex, KlassHandle(THREAD, SystemDictionary::Throwable_klass()), - vmSymbolHandles::printStackTrace_name(), - vmSymbolHandles::void_method_signature(), + vmSymbols::printStackTrace_name(), + vmSymbols::void_method_signature(), THREAD); // If an exception is thrown in the call it gets thrown away. Not much // we can do with it. The native code that calls this, does not check @@ -838,8 +837,7 @@ virtual void get_double () = 0; virtual void get_object () = 0; - JNI_ArgumentPusher(Thread *thread, symbolOop signature) - : SignatureIterator(thread, signature) { + JNI_ArgumentPusher(Symbol* signature) : SignatureIterator(signature) { this->_return_type = T_ILLEGAL; _arguments = NULL; } @@ -895,12 +893,12 @@ } public: - JNI_ArgumentPusherVaArg(Thread *thread, symbolOop signature, va_list rap) - : JNI_ArgumentPusher(thread, signature) { + JNI_ArgumentPusherVaArg(Symbol* signature, va_list rap) + : JNI_ArgumentPusher(signature) { set_ap(rap); } - JNI_ArgumentPusherVaArg(Thread *thread, jmethodID method_id, va_list rap) - : JNI_ArgumentPusher(thread, JNIHandles::resolve_jmethod_id(method_id)->signature()) { + JNI_ArgumentPusherVaArg(jmethodID method_id, va_list rap) + : JNI_ArgumentPusher(JNIHandles::resolve_jmethod_id(method_id)->signature()) { set_ap(rap); } @@ -966,12 +964,12 @@ inline void set_ap(const jvalue *rap) { _ap = rap; } public: - JNI_ArgumentPusherArray(Thread *thread, symbolOop signature, const jvalue *rap) - : JNI_ArgumentPusher(thread, signature) { + JNI_ArgumentPusherArray(Symbol* signature, const jvalue *rap) + : JNI_ArgumentPusher(signature) { set_ap(rap); } - JNI_ArgumentPusherArray(Thread *thread, jmethodID method_id, const jvalue *rap) - : JNI_ArgumentPusher(thread, JNIHandles::resolve_jmethod_id(method_id)->signature()) { + JNI_ArgumentPusherArray(jmethodID method_id, const jvalue *rap) + : JNI_ArgumentPusher(JNIHandles::resolve_jmethod_id(method_id)->signature()) { set_ap(rap); } @@ -1038,8 +1036,8 @@ KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc) if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass()); KlassHandle spec_klass (THREAD, method->method_holder()); - symbolHandle name (THREAD, method->name()); - symbolHandle signature (THREAD, method->signature()); + Symbol* name = method->name(); + Symbol* signature = method->signature(); CallInfo info; LinkResolver::resolve_interface_call(info, recv, recv_klass, spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle())); return info.selected_method(); @@ -1051,8 +1049,8 @@ KlassHandle recv_klass; // Default to NULL (use of ?: can confuse gcc) if (recv.not_null()) recv_klass = KlassHandle(THREAD, recv->klass()); KlassHandle spec_klass (THREAD, method->method_holder()); - symbolHandle name (THREAD, method->name()); - symbolHandle signature (THREAD, method->signature()); + Symbol* name = method->name(); + Symbol* signature = method->signature(); CallInfo info; LinkResolver::resolve_virtual_call(info, recv, recv_klass, spec_klass, name, signature, KlassHandle(), false, true, CHECK_(methodHandle())); return info.selected_method(); @@ -1073,7 +1071,7 @@ assert(method->is_static(), "method should be static"); // Fill out JavaCallArguments object - args->iterate( Fingerprinter(THREAD, method).fingerprint() ); + args->iterate( Fingerprinter(method).fingerprint() ); // Initialize result type result->set_type(args->get_ret_type()); @@ -1149,7 +1147,7 @@ args->push_receiver(h_recv); // Push jobject handle // Fill out JavaCallArguments object - args->iterate( Fingerprinter(THREAD, method).fingerprint() ); + args->iterate( Fingerprinter(method).fingerprint() ); // Initialize result type result->set_type(args->get_ret_type()); @@ -1196,7 +1194,7 @@ instanceOop i = alloc_object(clazz, CHECK_NULL); obj = JNIHandles::make_local(env, i); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherArray ap(THREAD, methodID, args); + JNI_ArgumentPusherArray ap(methodID, args); jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL); return obj; JNI_END @@ -1212,7 +1210,7 @@ instanceOop i = alloc_object(clazz, CHECK_NULL); obj = JNIHandles::make_local(env, i); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); + JNI_ArgumentPusherVaArg ap(methodID, args); jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL); return obj; JNI_END @@ -1230,7 +1228,7 @@ va_list args; va_start(args, methodID); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); + JNI_ArgumentPusherVaArg ap(methodID, args); jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL); va_end(args); return obj; @@ -1271,16 +1269,13 @@ // The class should have been loaded (we have an instance of the class // passed in) so the method and signature should already be in the symbol // table. If they're not there, the method doesn't exist. - symbolHandle signature = - symbolHandle(THREAD, SymbolTable::probe(sig, (int)strlen(sig))); - symbolHandle name; - if (name_str == NULL) { - name = vmSymbolHandles::object_initializer_name(); - } else { - name = symbolHandle(THREAD, - SymbolTable::probe(name_str, (int)strlen(name_str))); - } - if (name.is_null() || signature.is_null()) { + const char *name_to_probe = (name_str == NULL) + ? vmSymbols::object_initializer_name()->as_C_string() + : name_str; + TempNewSymbol name = SymbolTable::probe(name_to_probe, (int)strlen(name_to_probe)); + TempNewSymbol signature = SymbolTable::probe(sig, (int)strlen(sig)); + + if (name == NULL || signature == NULL) { THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(), name_str); } @@ -1298,20 +1293,20 @@ Klass::cast(klass())->initialize(CHECK_NULL); methodOop m; - if (name() == vmSymbols::object_initializer_name() || - name() == vmSymbols::class_initializer_name()) { + if (name == vmSymbols::object_initializer_name() || + name == vmSymbols::class_initializer_name()) { // Never search superclasses for constructors if (klass->oop_is_instance()) { - m = instanceKlass::cast(klass())->find_method(name(), signature()); + m = instanceKlass::cast(klass())->find_method(name, signature); } else { m = NULL; } } else { - m = klass->lookup_method(name(), signature()); + m = klass->lookup_method(name, signature); // Look up interfaces if (m == NULL && klass->oop_is_instance()) { - m = instanceKlass::cast(klass())->lookup_method_in_all_interfaces(name(), - signature()); + m = instanceKlass::cast(klass())->lookup_method_in_all_interfaces(name, + signature); } } if (m == NULL || (m->is_static() != is_static)) { @@ -1365,7 +1360,7 @@ va_list args; \ va_start(args, methodID); \ JavaValue jvalue(Tag); \ - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \ + JNI_ArgumentPusherVaArg ap(methodID, args); \ jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \ va_end(args); \ ret = jvalue.get_##ResultType(); \ @@ -1383,7 +1378,7 @@ (const ResultType&)ret);\ \ JavaValue jvalue(Tag); \ - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \ + JNI_ArgumentPusherVaArg ap(methodID, args); \ jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \ ret = jvalue.get_##ResultType(); \ return ret;\ @@ -1399,7 +1394,7 @@ (const ResultType&)ret);\ \ JavaValue jvalue(Tag); \ - JNI_ArgumentPusherArray ap(THREAD, methodID, args); \ + JNI_ArgumentPusherArray ap(methodID, args); \ jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \ ret = jvalue.get_##ResultType(); \ return ret;\ @@ -1429,7 +1424,7 @@ va_list args; va_start(args, methodID); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); + JNI_ArgumentPusherVaArg ap(methodID, args); jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK); va_end(args); JNI_END @@ -1441,7 +1436,7 @@ DT_VOID_RETURN_MARK(CallVoidMethodV); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); + JNI_ArgumentPusherVaArg ap(methodID, args); jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK); JNI_END @@ -1452,7 +1447,7 @@ DT_VOID_RETURN_MARK(CallVoidMethodA); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherArray ap(THREAD, methodID, args); + JNI_ArgumentPusherArray ap(methodID, args); jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK); JNI_END @@ -1475,7 +1470,7 @@ va_list args; \ va_start(args, methodID); \ JavaValue jvalue(Tag); \ - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \ + JNI_ArgumentPusherVaArg ap(methodID, args); \ jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \ va_end(args); \ ret = jvalue.get_##ResultType(); \ @@ -1491,7 +1486,7 @@ (const ResultType&)ret);\ \ JavaValue jvalue(Tag); \ - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \ + JNI_ArgumentPusherVaArg ap(methodID, args); \ jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \ ret = jvalue.get_##ResultType(); \ return ret;\ @@ -1506,7 +1501,7 @@ (const ResultType&)ret);\ \ JavaValue jvalue(Tag); \ - JNI_ArgumentPusherArray ap(THREAD, methodID, args); \ + JNI_ArgumentPusherArray ap(methodID, args); \ jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \ ret = jvalue.get_##ResultType(); \ return ret;\ @@ -1539,7 +1534,7 @@ va_list args; va_start(args, methodID); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); + JNI_ArgumentPusherVaArg ap(methodID, args); jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK); va_end(args); JNI_END @@ -1553,7 +1548,7 @@ DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodV); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); + JNI_ArgumentPusherVaArg ap(methodID, args); jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK); JNI_END @@ -1564,7 +1559,7 @@ env, obj, cls, methodID); DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodA); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherArray ap(THREAD, methodID, args); + JNI_ArgumentPusherArray ap(methodID, args); jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK); JNI_END @@ -1587,7 +1582,7 @@ va_list args; \ va_start(args, methodID); \ JavaValue jvalue(Tag); \ - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \ + JNI_ArgumentPusherVaArg ap(methodID, args); \ jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \ va_end(args); \ ret = jvalue.get_##ResultType(); \ @@ -1603,7 +1598,7 @@ (const ResultType&)ret);\ \ JavaValue jvalue(Tag); \ - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); \ + JNI_ArgumentPusherVaArg ap(methodID, args); \ jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \ ret = jvalue.get_##ResultType(); \ return ret;\ @@ -1618,7 +1613,7 @@ (const ResultType&)ret);\ \ JavaValue jvalue(Tag); \ - JNI_ArgumentPusherArray ap(THREAD, methodID, args); \ + JNI_ArgumentPusherArray ap(methodID, args); \ jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \ ret = jvalue.get_##ResultType(); \ return ret;\ @@ -1649,7 +1644,7 @@ va_list args; va_start(args, methodID); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); + JNI_ArgumentPusherVaArg ap(methodID, args); jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK); va_end(args); JNI_END @@ -1661,7 +1656,7 @@ DT_VOID_RETURN_MARK(CallStaticVoidMethodV); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherVaArg ap(THREAD, methodID, args); + JNI_ArgumentPusherVaArg ap(methodID, args); jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK); JNI_END @@ -1672,7 +1667,7 @@ DT_VOID_RETURN_MARK(CallStaticVoidMethodA); JavaValue jvalue(T_VOID); - JNI_ArgumentPusherArray ap(THREAD, methodID, args); + JNI_ArgumentPusherArray ap(methodID, args); jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK); JNI_END @@ -1694,11 +1689,9 @@ // The class should have been loaded (we have an instance of the class // passed in) so the field and signature should already be in the symbol // table. If they're not there, the field doesn't exist. - symbolHandle fieldname = - symbolHandle(THREAD, SymbolTable::probe(name, (int)strlen(name))); - symbolHandle signame = - symbolHandle(THREAD, SymbolTable::probe(sig, (int)strlen(sig))); - if (fieldname.is_null() || signame.is_null()) { + TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name)); + TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig)); + if (fieldname == NULL || signame == NULL) { THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name); } KlassHandle k(THREAD, @@ -1708,7 +1701,7 @@ fieldDescriptor fd; if (!Klass::cast(k())->oop_is_instance() || - !instanceKlass::cast(k())->find_field(fieldname(), signame(), false, &fd)) { + !instanceKlass::cast(k())->find_field(fieldname, signame, false, &fd)) { THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name); } @@ -1893,11 +1886,9 @@ // The class should have been loaded (we have an instance of the class // passed in) so the field and signature should already be in the symbol // table. If they're not there, the field doesn't exist. - symbolHandle fieldname = - symbolHandle(THREAD, SymbolTable::probe(name, (int)strlen(name))); - symbolHandle signame = - symbolHandle(THREAD, SymbolTable::probe(sig, (int)strlen(sig))); - if (fieldname.is_null() || signame.is_null()) { + TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name)); + TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig)); + if (fieldname == NULL || signame == NULL) { THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name); } KlassHandle k(THREAD, @@ -1907,7 +1898,7 @@ fieldDescriptor fd; if (!Klass::cast(k())->oop_is_instance() || - !instanceKlass::cast(k())->find_field(fieldname(), signame(), true, &fd)) { + !instanceKlass::cast(k())->find_field(fieldname, signame, true, &fd)) { THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name); } @@ -2389,7 +2380,7 @@ // to see if the native method is now wrapped with the prefixes. See the // SetNativeMethodPrefix(es) functions in the JVM TI Spec for details. static methodOop find_prefixed_native(KlassHandle k, - symbolHandle name, symbolHandle signature, TRAPS) { + Symbol* name, Symbol* signature, TRAPS) { ResourceMark rm(THREAD); methodOop method; int name_len = name->utf8_length(); @@ -2405,11 +2396,11 @@ char* trial_name_str = NEW_RESOURCE_ARRAY(char, trial_len + 1); strcpy(trial_name_str, prefix); strcat(trial_name_str, name_str); - symbolHandle trial_name(THREAD, SymbolTable::probe(trial_name_str, trial_len)); - if (trial_name.is_null()) { + TempNewSymbol trial_name = SymbolTable::probe(trial_name_str, trial_len); + if (trial_name == NULL) { continue; // no such symbol, so this prefix wasn't used, try the next prefix } - method = Klass::cast(k())->lookup_method(trial_name(), signature()); + method = Klass::cast(k())->lookup_method(trial_name, signature); if (method == NULL) { continue; // signature doesn't match, try the next prefix } @@ -2424,13 +2415,13 @@ return NULL; // not found } -static bool register_native(KlassHandle k, symbolHandle name, symbolHandle signature, address entry, TRAPS) { - methodOop method = Klass::cast(k())->lookup_method(name(), signature()); +static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, address entry, TRAPS) { + methodOop method = Klass::cast(k())->lookup_method(name, signature); if (method == NULL) { ResourceMark rm; stringStream st; st.print("Method %s name or signature does not match", - methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name(), signature())); + methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name, signature)); THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false); } if (!method->is_native()) { @@ -2440,7 +2431,7 @@ ResourceMark rm; stringStream st; st.print("Method %s is not declared as native", - methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name(), signature())); + methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name, signature)); THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false); } } @@ -2480,10 +2471,10 @@ // The class should have been loaded (we have an instance of the class // passed in) so the method and signature should already be in the symbol // table. If they're not there, the method doesn't exist. - symbolHandle name(THREAD, SymbolTable::probe(meth_name, meth_name_len)); - symbolHandle signature(THREAD, SymbolTable::probe(meth_sig, (int)strlen(meth_sig))); - - if (name.is_null() || signature.is_null()) { + TempNewSymbol name = SymbolTable::probe(meth_name, meth_name_len); + TempNewSymbol signature = SymbolTable::probe(meth_sig, (int)strlen(meth_sig)); + + if (name == NULL || signature == NULL) { ResourceMark rm; stringStream st; st.print("Method %s.%s%s not found", Klass::cast(h_k())->external_name(), meth_name, meth_sig); @@ -2717,7 +2708,7 @@ Handle loader; // null (bootstrap) loader Handle protection_domain; // null protection domain - symbolHandle sym = oopFactory::new_symbol_handle(name, CHECK_NULL); + TempNewSymbol sym = SymbolTable::new_symbol(name, CHECK_NULL); jclass result = find_class_from_class_loader(env, sym, true, loader, protection_domain, true, CHECK_NULL); if (TraceClassResolution && result != NULL) {