< prev index next >

src/share/vm/oops/method.cpp

Print this page

        

*** 44,53 **** --- 44,54 ---- #include "oops/method.hpp" #include "oops/methodData.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/symbol.hpp" + #include "oops/valueKlass.hpp" #include "prims/jvmtiExport.hpp" #include "prims/methodHandles.hpp" #include "prims/nativeLookup.hpp" #include "runtime/arguments.hpp" #include "runtime/compilationPolicy.hpp"
*** 465,474 **** --- 466,496 ---- BasicType Method::result_type() const { ResultTypeFinder rtf(signature()); return rtf.type(); } + #ifdef ASSERT + // ValueKlass the method is declared to return. This must not + // safepoint as it is called with references live on the stack at + // locations the GC is unaware of. + ValueKlass* Method::returned_value_type(Thread* thread) const { + assert(is_returning_vt(), "method return type should be value type"); + SignatureStream ss(signature()); + while (!ss.at_return_type()) { + ss.next(); + } + Handle class_loader(thread, method_holder()->class_loader()); + Handle protection_domain(thread, method_holder()->protection_domain()); + Klass* k = NULL; + { + NoSafepointVerifier nsv; + k = ss.as_klass(class_loader, protection_domain, SignatureStream::ReturnNull, thread); + } + assert(k != NULL && !thread->has_pending_exception(), "can't resolve klass"); + return ValueKlass::cast(k); + } + #endif bool Method::is_empty_method() const { return code_size() == 1 && *code_base() == Bytecodes::_return; }
< prev index next >