< prev index next >
src/hotspot/share/oops/method.cpp
Print this page
@@ -575,13 +575,20 @@
int Method::extra_stack_words() {
// not an inline function, to avoid a header dependency on Interpreter
return extra_stack_entries() * Interpreter::stackElementSize;
}
-void Method::compute_size_of_parameters(Thread *thread) {
- ArgumentSizeComputer asc(signature());
- set_size_of_parameters(asc.size() + (is_static() ? 0 : 1));
+// Derive size of parameters, return type, and fingerprint,
+// all in one pass, which is run at load time.
+// We need the first two, and might as well grab the third.
+void Method::compute_from_signature(Symbol* sig) {
+ // At this point, since we are scanning the signature,
+ // we might as well compute the whole fingerprint.
+ Fingerprinter fp(sig, is_static());
+ set_size_of_parameters(fp.size_of_parameters());
+ constMethod()->set_result_type(fp.return_type());
+ constMethod()->set_fingerprint(fp.fingerprint());
}
bool Method::is_empty_method() const {
return code_size() == 1
&& *code_base() == Bytecodes::_return;
@@ -1441,13 +1448,11 @@
m->set_constants(cp());
m->set_name_index(_imcp_invoke_name);
m->set_signature_index(_imcp_invoke_signature);
assert(MethodHandles::is_signature_polymorphic_name(m->name()), "");
assert(m->signature() == signature, "");
- ResultTypeFinder rtf(signature);
- m->constMethod()->set_result_type(rtf.type());
- m->compute_size_of_parameters(THREAD);
+ m->compute_from_signature(signature);
m->init_intrinsic_id();
assert(m->is_method_handle_intrinsic(), "");
#ifdef ASSERT
if (!MethodHandles::is_signature_polymorphic(m->intrinsic_id())) m->print();
assert(MethodHandles::is_signature_polymorphic(m->intrinsic_id()), "must be an invoker");
@@ -1683,11 +1688,11 @@
Handle class_loader(THREAD, m->method_holder()->class_loader());
Handle protection_domain(THREAD, m->method_holder()->protection_domain());
ResourceMark rm(THREAD);
Symbol* signature = m->signature();
for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
- if (ss.is_object()) {
+ if (ss.is_reference()) {
Symbol* sym = ss.as_symbol();
Symbol* name = sym;
Klass* klass = SystemDictionary::resolve_or_null(name, class_loader,
protection_domain, THREAD);
// We are loading classes eagerly. If a ClassNotFoundException or
@@ -1711,11 +1716,11 @@
Handle protection_domain(THREAD, m->method_holder()->protection_domain());
ResourceMark rm(THREAD);
Symbol* signature = m->signature();
for(SignatureStream ss(signature); !ss.is_done(); ss.next()) {
if (ss.type() == T_OBJECT) {
- Symbol* name = ss.as_symbol_or_null();
+ Symbol* name = ss.as_symbol();
if (name == NULL) return true;
Klass* klass = SystemDictionary::find(name, class_loader, protection_domain, THREAD);
if (klass == NULL) return true;
}
}
@@ -1731,11 +1736,11 @@
st->print(" %s::", method_holder()->internal_name());
#endif
name()->print_symbol_on(st);
if (WizardMode) signature()->print_symbol_on(st);
else if (MethodHandles::is_signature_polymorphic(intrinsic_id()))
- MethodHandles::print_as_basic_type_signature_on(st, signature(), true);
+ MethodHandles::print_as_basic_type_signature_on(st, signature());
}
// Comparer for sorting an object array containing
// Method*s.
static int method_comparator(Method* a, Method* b) {
@@ -1784,12 +1789,12 @@
SignatureTypePrinter(Symbol* signature, outputStream* st) : SignatureTypeNames(signature) {
_st = st;
_use_separator = false;
}
- void print_parameters() { _use_separator = false; iterate_parameters(); }
- void print_returntype() { _use_separator = false; iterate_returntype(); }
+ void print_parameters() { _use_separator = false; do_parameters_on(this); }
+ void print_returntype() { _use_separator = false; do_type(return_type()); }
};
void Method::print_name(outputStream* st) {
Thread *thread = Thread::current();
< prev index next >