< prev index next >
src/share/vm/code/nmethod.cpp
Print this page
*** 2359,2368 ****
--- 2359,2394 ----
has_receiver = !(callee->access_flags().is_static());
has_appendix = false;
signature = callee->signature();
}
+ // If value types are passed as fields, use the extended signature
+ // which contains the types of all (oop) fields of the value type.
+ if (ValueTypePassFieldsAsArgs) {
+ // Check if callee signature contains a value type argument
+ // TODO if invokedirect is going to be removed we need another way to figure out that the receiver is a value type
+ bool has_value_argument = call.is_invokedirect();
+ const int len = signature->utf8_length();
+ for (int i = 0; i < len && !has_value_argument; ++i) {
+ if (signature->byte_at(i) == 'Q') {
+ has_value_argument = true;
+ }
+ }
+ if (has_value_argument) {
+ // Get the extended signature from the callee's adapter
+ // TODO what about methods that do not have an adapter (for example, abstract methods)?
+ Thread* THREAD = Thread::current();
+ methodHandle dest_method = call.static_target(THREAD);
+ assert(!HAS_PENDING_EXCEPTION, "should not have pending exception");
+ callee = dest_method();
+ assert(callee != NULL, "failed to resolve callee");
+ signature = callee->adapter()->get_sig_extended();
+ assert(signature != NULL, "signature is null");
+ has_receiver = false; // The signature contains the receiver type
+ }
+ }
+
fr.oops_compiled_arguments_do(signature, has_receiver, has_appendix, reg_map, f);
}
#endif // !SHARK
}
< prev index next >