< prev index next >
src/share/vm/opto/graphKit.cpp
Print this page
rev 10518 : Tobias' flattened array
rev 10544 : call to __Value methods can't pass fields as arguments
*** 1728,1756 ****
//-------------------------set_arguments_for_java_call-------------------------
// Arguments (pre-popped from the stack) are taken from the JVMS.
void GraphKit::set_arguments_for_java_call(CallJavaNode* call) {
// Add the call arguments:
! uint nargs = call->method()->arg_size();
! for (uint i = 0, idx = 0; i < nargs; i++) {
! Node* arg = argument(i);
if (ValueTypePassFieldsAsArgs) {
if (arg->is_ValueType()) {
ValueTypeNode* vt = arg->as_ValueType();
// We don't pass value type arguments by reference but instead
// pass each field of the value type
! idx += vt->set_arguments_for_java_call(call, idx + TypeFunc::Parms, *this);
} else {
! call->init_req(idx + TypeFunc::Parms, arg);
idx++;
}
} else {
if (arg->is_ValueType()) {
// Pass value type argument via oop to callee
arg = arg->as_ValueType()->store_to_memory(this);
}
! call->init_req(i + TypeFunc::Parms, arg);
}
}
}
//---------------------------set_edges_for_java_call---------------------------
--- 1728,1763 ----
//-------------------------set_arguments_for_java_call-------------------------
// Arguments (pre-popped from the stack) are taken from the JVMS.
void GraphKit::set_arguments_for_java_call(CallJavaNode* call) {
// Add the call arguments:
! const TypeTuple* domain = call->tf()->domain_sig();
! uint nargs = domain->cnt();
! for (uint i = TypeFunc::Parms, idx = TypeFunc::Parms; i < nargs; i++) {
! Node* arg = argument(i-TypeFunc::Parms);
if (ValueTypePassFieldsAsArgs) {
if (arg->is_ValueType()) {
ValueTypeNode* vt = arg->as_ValueType();
+ if (domain->field_at(i)->is_valuetypeptr()->klass() != C->env()->___Value_klass()) {
// We don't pass value type arguments by reference but instead
// pass each field of the value type
! idx += vt->set_arguments_for_java_call(call, idx, *this);
} else {
! arg = arg->as_ValueType()->store_to_memory(this);
! call->init_req(idx, arg);
! idx++;
! }
! } else {
! call->init_req(idx, arg);
idx++;
}
} else {
if (arg->is_ValueType()) {
// Pass value type argument via oop to callee
arg = arg->as_ValueType()->store_to_memory(this);
}
! call->init_req(i, arg);
}
}
}
//---------------------------set_edges_for_java_call---------------------------
< prev index next >