< prev index next >
src/hotspot/share/runtime/signature.cpp
Print this page
*** 306,316 ****
Symbol* sig = _signature;
while (sig->byte_at(_end++) != ';');
break;
}
case 'Q': {
! _type = T_VALUETYPEPTR;
Symbol* sig = _signature;
while (sig->byte_at(_end++) != ';');
break;
}
case '[': {
--- 306,316 ----
Symbol* sig = _signature;
while (sig->byte_at(_end++) != ';');
break;
}
case 'Q': {
! _type = T_VALUETYPE;
Symbol* sig = _signature;
while (sig->byte_at(_end++) != ';');
break;
}
case '[': {
*** 509,539 ****
default:
return false;
}
}
! int SigEntry::count_fields(const GrowableArray<SigEntry>& sig_extended) {
! int values = 0;
! for (int i = 0; i < sig_extended.length(); i++) {
! if (sig_extended.at(i)._bt == T_VALUETYPE) {
! values++;
! }
! }
! return sig_extended.length() - 2 * values;
! }
!
! void SigEntry::fill_sig_bt(const GrowableArray<SigEntry>& sig_extended, BasicType* sig_bt_cc, int total_args_passed_cc, bool skip_vt) {
! int j = 0;
! for (int i = 0; i < sig_extended.length(); i++) {
! if (!skip_vt) {
! BasicType bt = sig_extended.at(i)._bt;
! assert(bt != T_VALUETYPE, "value types should be passed as fields or reference");
! sig_bt_cc[j++] = bt;
! } else if (sig_extended.at(i)._bt != T_VALUETYPE &&
! (sig_extended.at(i)._bt != T_VOID ||
! sig_extended.at(i-1)._bt == T_LONG ||
! sig_extended.at(i-1)._bt == T_DOUBLE)) {
! sig_bt_cc[j++] = sig_extended.at(i)._bt;
}
}
! assert(j == total_args_passed_cc, "bad number of arguments");
}
--- 509,580 ----
default:
return false;
}
}
! // Adds an argument to the signature
! void SigEntry::add_entry(GrowableArray<SigEntry>* sig, BasicType bt, int offset) {
! sig->append(SigEntry(bt, offset));
! if (bt == T_LONG || bt == T_DOUBLE) {
! sig->append(SigEntry(T_VOID, offset)); // Longs and doubles take two stack slots
! }
! }
!
! // Inserts a reserved argument at position 'i'
! void SigEntry::insert_reserved_entry(GrowableArray<SigEntry>* sig, int i, BasicType bt) {
! if (bt == T_OBJECT || bt == T_ARRAY || bt == T_VALUETYPE) {
! // Treat this as INT to not confuse the GC
! bt = T_INT;
! } else if (bt == T_LONG || bt == T_DOUBLE) {
! // Longs and doubles take two stack slots
! sig->insert_before(i, SigEntry(T_VOID, SigEntry::ReservedOffset));
! }
! sig->insert_before(i, SigEntry(bt, SigEntry::ReservedOffset));
! }
!
! // Returns true if the argument at index 'i' is a reserved argument
! bool SigEntry::is_reserved_entry(const GrowableArray<SigEntry>* sig, int i) {
! return sig->at(i)._offset == SigEntry::ReservedOffset;
! }
!
! // Returns true if the argument at index 'i' is not a value type delimiter
! bool SigEntry::skip_value_delimiters(const GrowableArray<SigEntry>* sig, int i) {
! return (sig->at(i)._bt != T_VALUETYPE &&
! (sig->at(i)._bt != T_VOID || sig->at(i-1)._bt == T_LONG || sig->at(i-1)._bt == T_DOUBLE));
! }
!
! // Fill basic type array from signature array
! int SigEntry::fill_sig_bt(const GrowableArray<SigEntry>* sig, BasicType* sig_bt) {
! int count = 0;
! for (int i = 0; i < sig->length(); i++) {
! if (skip_value_delimiters(sig, i)) {
! sig_bt[count++] = sig->at(i)._bt;
! }
! }
! return count;
! }
!
! // Create a temporary symbol from the signature array
! TempNewSymbol SigEntry::create_symbol(const GrowableArray<SigEntry>* sig) {
! ResourceMark rm;
! int length = sig->length();
! char* sig_str = NEW_RESOURCE_ARRAY(char, 2*length + 3);
! int idx = 0;
! sig_str[idx++] = '(';
! for (int i = 0; i < length; i++) {
! BasicType bt = sig->at(i)._bt;
! if (bt == T_VALUETYPE || bt == T_VOID) {
! // Ignore
! } else {
! if (bt == T_ARRAY) {
! bt = T_OBJECT; // We don't know the element type, treat as Object
! }
! sig_str[idx++] = type2char(bt);
! if (bt == T_OBJECT) {
! sig_str[idx++] = ';';
! }
}
}
! sig_str[idx++] = ')';
! sig_str[idx++] = '\0';
! return SymbolTable::new_symbol(sig_str, Thread::current());
}
< prev index next >