< prev index next >
src/share/vm/opto/callGenerator.cpp
Print this page
rev 10512 : value type calling convention
@@ -152,12 +152,14 @@
call->set_override_symbolic_info(true);
}
_call_node = call; // Save the call node in case we need it later
if (!is_static) {
if (kit.argument(0)->is_ValueType()) {
+ if (!ValueTypePassFieldsAsArgs) {
ValueTypeNode* vt = kit.argument(0)->as_ValueType();
vt->store_to_memory(&kit);
+ }
} else {
// Make an explicit receiver null_check as part of this call.
// Since we share a map with the caller, his JVMS gets adjusted.
kit.null_check_receiver_before_call(method());
}
@@ -368,11 +370,15 @@
if (call == NULL || call->outcnt() == 0 ||
call->in(0) == NULL || call->in(0)->is_top()) {
return;
}
- const TypeTuple *r = call->tf()->domain();
+ // FIXME: late inlining of methods that take value type arguments is
+ // broken: arguments at the call are set up so fields of value type
+ // arguments are passed but code here expects a single argument per
+ // value type (a ValueTypeNode) instead.
+ const TypeTuple *r = call->tf()->domain_sig();
for (int i1 = 0; i1 < method()->arg_size(); i1++) {
if (call->in(TypeFunc::Parms + i1)->is_top() && r->field_at(TypeFunc::Parms + i1) != Type::HALF) {
assert(Compile::current()->inlining_incrementally(), "shouldn't happen during parsing");
return;
}
< prev index next >