< prev index next >
src/share/vm/oops/method.cpp
Print this page
@@ -44,10 +44,11 @@
#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,10 +466,31 @@
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 >