< prev index next >
src/hotspot/share/prims/methodHandles.cpp
Print this page
*** 535,545 ****
bool MethodHandles::is_basic_type_signature(Symbol* sig) {
assert(vmSymbols::object_signature()->utf8_length() == (int)OBJ_SIG_LEN, "");
assert(vmSymbols::object_signature()->equals(OBJ_SIG), "");
const int len = sig->utf8_length();
for (int i = 0; i < len; i++) {
! switch (sig->byte_at(i)) {
case 'L':
// only java/lang/Object is valid here
if (sig->index_of_at(i, OBJ_SIG, OBJ_SIG_LEN) != i)
return false;
i += OBJ_SIG_LEN-1; //-1 because of i++ in loop
--- 535,545 ----
bool MethodHandles::is_basic_type_signature(Symbol* sig) {
assert(vmSymbols::object_signature()->utf8_length() == (int)OBJ_SIG_LEN, "");
assert(vmSymbols::object_signature()->equals(OBJ_SIG), "");
const int len = sig->utf8_length();
for (int i = 0; i < len; i++) {
! switch (sig->char_at(i)) {
case 'L':
// only java/lang/Object is valid here
if (sig->index_of_at(i, OBJ_SIG, OBJ_SIG_LEN) != i)
return false;
i += OBJ_SIG_LEN-1; //-1 because of i++ in loop
*** 561,572 ****
if (sig == NULL) {
return sig;
} else if (is_basic_type_signature(sig)) {
sig->increment_refcount();
return sig; // that was easy
! } else if (sig->byte_at(0) != '(') {
! BasicType bt = char2type(sig->byte_at(0));
if (is_subword_type(bt)) {
bsig = vmSymbols::int_signature();
} else {
assert(bt == T_OBJECT || bt == T_ARRAY, "is_basic_type_signature was false");
bsig = vmSymbols::object_signature();
--- 561,572 ----
if (sig == NULL) {
return sig;
} else if (is_basic_type_signature(sig)) {
sig->increment_refcount();
return sig; // that was easy
! } else if (sig->char_at(0) != '(') {
! BasicType bt = char2type(sig->char_at(0));
if (is_subword_type(bt)) {
bsig = vmSymbols::int_signature();
} else {
assert(bt == T_OBJECT || bt == T_ARRAY, "is_basic_type_signature was false");
bsig = vmSymbols::object_signature();
*** 613,623 ****
st = st ? st : tty;
int len = sig->utf8_length();
int array = 0;
bool prev_type = false;
for (int i = 0; i < len; i++) {
! char ch = sig->byte_at(i);
switch (ch) {
case '(': case ')':
prev_type = false;
st->put(ch);
continue;
--- 613,623 ----
st = st ? st : tty;
int len = sig->utf8_length();
int array = 0;
bool prev_type = false;
for (int i = 0; i < len; i++) {
! char ch = sig->char_at(i);
switch (ch) {
case '(': case ')':
prev_type = false;
st->put(ch);
continue;
*** 628,646 ****
continue;
case 'L':
{
if (prev_type) st->put(',');
int start = i+1, slash = start;
! while (++i < len && (ch = sig->byte_at(i)) != ';') {
if (ch == '/' || ch == '.' || ch == '$') slash = i+1;
}
if (slash < i) start = slash;
if (!keep_basic_names) {
st->put('L');
} else {
for (int j = start; j < i; j++)
! st->put(sig->byte_at(j));
prev_type = true;
}
break;
}
default:
--- 628,646 ----
continue;
case 'L':
{
if (prev_type) st->put(',');
int start = i+1, slash = start;
! while (++i < len && (ch = sig->char_at(i)) != ';') {
if (ch == '/' || ch == '.' || ch == '$') slash = i+1;
}
if (slash < i) start = slash;
if (!keep_basic_names) {
st->put('L');
} else {
for (int j = start; j < i; j++)
! st->put(sig->char_at(j));
prev_type = true;
}
break;
}
default:
*** 973,983 ****
if (name != NULL) {
if (name->utf8_length() == 0) return 0; // a match is not possible
}
if (sig != NULL) {
if (sig->utf8_length() == 0) return 0; // a match is not possible
! if (sig->byte_at(0) == '(')
match_flags &= ~(IS_FIELD | IS_TYPE);
else
match_flags &= ~(IS_CONSTRUCTOR | IS_METHOD);
}
--- 973,983 ----
if (name != NULL) {
if (name->utf8_length() == 0) return 0; // a match is not possible
}
if (sig != NULL) {
if (sig->utf8_length() == 0) return 0; // a match is not possible
! if (sig->char_at(0) == '(')
match_flags &= ~(IS_FIELD | IS_TYPE);
else
match_flags &= ~(IS_CONSTRUCTOR | IS_METHOD);
}
*** 1454,1464 ****
}
case -2: // type
{
Symbol* type = caller->constants()->signature_ref_at(bss_index_in_pool);
Handle th;
! if (type->byte_at(0) == '(') {
th = SystemDictionary::find_method_handle_type(type, caller, CHECK);
} else {
th = SystemDictionary::find_java_mirror_for_type(type, caller, SignatureStream::NCDFError, CHECK);
}
pseudo_arg = th();
--- 1454,1464 ----
}
case -2: // type
{
Symbol* type = caller->constants()->signature_ref_at(bss_index_in_pool);
Handle th;
! if (type->char_at(0) == '(') {
th = SystemDictionary::find_method_handle_type(type, caller, CHECK);
} else {
th = SystemDictionary::find_java_mirror_for_type(type, caller, SignatureStream::NCDFError, CHECK);
}
pseudo_arg = th();
< prev index next >