520 return java_lang_Class::as_signature(type_str, false, THREAD);
521 } else if (java_lang_String::is_instance_inlined(type_str)) {
522 if (intern_if_not_found) {
523 return java_lang_String::as_symbol(type_str, THREAD);
524 } else {
525 return java_lang_String::as_symbol_or_null(type_str);
526 }
527 } else {
528 THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized type", NULL);
529 }
530 }
531
532 static const char OBJ_SIG[] = "Ljava/lang/Object;";
533 enum { OBJ_SIG_LEN = 18 };
534
535 bool MethodHandles::is_basic_type_signature(Symbol* sig) {
536 assert(vmSymbols::object_signature()->utf8_length() == (int)OBJ_SIG_LEN, "");
537 assert(vmSymbols::object_signature()->equals(OBJ_SIG), "");
538 const int len = sig->utf8_length();
539 for (int i = 0; i < len; i++) {
540 switch (sig->byte_at(i)) {
541 case 'L':
542 // only java/lang/Object is valid here
543 if (sig->index_of_at(i, OBJ_SIG, OBJ_SIG_LEN) != i)
544 return false;
545 i += OBJ_SIG_LEN-1; //-1 because of i++ in loop
546 continue;
547 case '(': case ')': case 'V':
548 case 'I': case 'J': case 'F': case 'D':
549 continue;
550 //case '[':
551 //case 'Z': case 'B': case 'C': case 'S':
552 default:
553 return false;
554 }
555 }
556 return true;
557 }
558
559 Symbol* MethodHandles::lookup_basic_type_signature(Symbol* sig, bool keep_last_arg, TRAPS) {
560 Symbol* bsig = NULL;
561 if (sig == NULL) {
562 return sig;
563 } else if (is_basic_type_signature(sig)) {
564 sig->increment_refcount();
565 return sig; // that was easy
566 } else if (sig->byte_at(0) != '(') {
567 BasicType bt = char2type(sig->byte_at(0));
568 if (is_subword_type(bt)) {
569 bsig = vmSymbols::int_signature();
570 } else {
571 assert(bt == T_OBJECT || bt == T_ARRAY, "is_basic_type_signature was false");
572 bsig = vmSymbols::object_signature();
573 }
574 } else {
575 ResourceMark rm;
576 stringStream buffer(128);
577 buffer.put('(');
578 int arg_pos = 0, keep_arg_pos = -1;
579 if (keep_last_arg)
580 keep_arg_pos = ArgumentCount(sig).size() - 1;
581 for (SignatureStream ss(sig); !ss.is_done(); ss.next()) {
582 BasicType bt = ss.type();
583 size_t this_arg_pos = buffer.size();
584 if (ss.at_return_type()) {
585 buffer.put(')');
586 }
587 if (arg_pos == keep_arg_pos) {
598 }
599 const char* sigstr = buffer.base();
600 int siglen = (int) buffer.size();
601 bsig = SymbolTable::new_symbol(sigstr, siglen, THREAD);
602 }
603 assert(is_basic_type_signature(bsig) ||
604 // detune assert in case the injected argument is not a basic type:
605 keep_last_arg, "");
606 return bsig;
607 }
608
609 void MethodHandles::print_as_basic_type_signature_on(outputStream* st,
610 Symbol* sig,
611 bool keep_arrays,
612 bool keep_basic_names) {
613 st = st ? st : tty;
614 int len = sig->utf8_length();
615 int array = 0;
616 bool prev_type = false;
617 for (int i = 0; i < len; i++) {
618 char ch = sig->byte_at(i);
619 switch (ch) {
620 case '(': case ')':
621 prev_type = false;
622 st->put(ch);
623 continue;
624 case '[':
625 if (!keep_basic_names && keep_arrays)
626 st->put(ch);
627 array++;
628 continue;
629 case 'L':
630 {
631 if (prev_type) st->put(',');
632 int start = i+1, slash = start;
633 while (++i < len && (ch = sig->byte_at(i)) != ';') {
634 if (ch == '/' || ch == '.' || ch == '$') slash = i+1;
635 }
636 if (slash < i) start = slash;
637 if (!keep_basic_names) {
638 st->put('L');
639 } else {
640 for (int j = start; j < i; j++)
641 st->put(sig->byte_at(j));
642 prev_type = true;
643 }
644 break;
645 }
646 default:
647 {
648 if (array && char2type(ch) != T_ILLEGAL && !keep_arrays) {
649 ch = '[';
650 array = 0;
651 }
652 if (prev_type) st->put(',');
653 const char* n = NULL;
654 if (keep_basic_names)
655 n = type2name(char2type(ch));
656 if (n == NULL) {
657 // unknown letter, or we don't want to know its name
658 st->put(ch);
659 } else {
660 st->print("%s", n);
661 prev_type = true;
958
959 Thread* thread = Thread::current();
960
961 if (k == NULL || !k->is_instance_klass()) return -1;
962
963 int rfill = 0, rlimit = results->length(), rskip = skip;
964 // overflow measurement:
965 int overflow = 0, overflow_limit = MAX2(1000, rlimit);
966
967 int match_flags = mflags;
968 bool search_superc = ((match_flags & SEARCH_SUPERCLASSES) != 0);
969 bool search_intfc = ((match_flags & SEARCH_INTERFACES) != 0);
970 bool local_only = !(search_superc | search_intfc);
971 bool classes_only = false;
972
973 if (name != NULL) {
974 if (name->utf8_length() == 0) return 0; // a match is not possible
975 }
976 if (sig != NULL) {
977 if (sig->utf8_length() == 0) return 0; // a match is not possible
978 if (sig->byte_at(0) == '(')
979 match_flags &= ~(IS_FIELD | IS_TYPE);
980 else
981 match_flags &= ~(IS_CONSTRUCTOR | IS_METHOD);
982 }
983
984 if ((match_flags & IS_TYPE) != 0) {
985 // NYI, and Core Reflection works quite well for this query
986 }
987
988 if ((match_flags & IS_FIELD) != 0) {
989 InstanceKlass* ik = InstanceKlass::cast(k);
990 for (FieldStream st(ik, local_only, !search_intfc); !st.eos(); st.next()) {
991 if (name != NULL && st.name() != name)
992 continue;
993 if (sig != NULL && st.signature() != sig)
994 continue;
995 // passed the filters
996 if (rskip > 0) {
997 --rskip;
998 } else if (rfill < rlimit) {
1439 if (start >= end || 0 > pos || pos >= buf->length()) break;
1440 oop pseudo_arg = NULL;
1441 switch (pseudo_index) {
1442 case -4: // bootstrap method
1443 {
1444 int bsm_index = caller->constants()->invoke_dynamic_bootstrap_method_ref_index_at(bss_index_in_pool);
1445 pseudo_arg = caller->constants()->resolve_possibly_cached_constant_at(bsm_index, CHECK);
1446 break;
1447 }
1448 case -3: // name
1449 {
1450 Symbol* name = caller->constants()->name_ref_at(bss_index_in_pool);
1451 Handle str = java_lang_String::create_from_symbol(name, CHECK);
1452 pseudo_arg = str();
1453 break;
1454 }
1455 case -2: // type
1456 {
1457 Symbol* type = caller->constants()->signature_ref_at(bss_index_in_pool);
1458 Handle th;
1459 if (type->byte_at(0) == '(') {
1460 th = SystemDictionary::find_method_handle_type(type, caller, CHECK);
1461 } else {
1462 th = SystemDictionary::find_java_mirror_for_type(type, caller, SignatureStream::NCDFError, CHECK);
1463 }
1464 pseudo_arg = th();
1465 break;
1466 }
1467 case -1: // argument count
1468 {
1469 int argc = caller->constants()->invoke_dynamic_argument_count_at(bss_index_in_pool);
1470 jvalue argc_value; argc_value.i = (jint)argc;
1471 pseudo_arg = java_lang_boxing_object::create(T_INT, &argc_value, CHECK);
1472 break;
1473 }
1474 }
1475
1476 // Store the pseudo-argument, and advance the pointers.
1477 buf->obj_at_put(pos++, pseudo_arg);
1478 ++start;
1479 }
|
520 return java_lang_Class::as_signature(type_str, false, THREAD);
521 } else if (java_lang_String::is_instance_inlined(type_str)) {
522 if (intern_if_not_found) {
523 return java_lang_String::as_symbol(type_str, THREAD);
524 } else {
525 return java_lang_String::as_symbol_or_null(type_str);
526 }
527 } else {
528 THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized type", NULL);
529 }
530 }
531
532 static const char OBJ_SIG[] = "Ljava/lang/Object;";
533 enum { OBJ_SIG_LEN = 18 };
534
535 bool MethodHandles::is_basic_type_signature(Symbol* sig) {
536 assert(vmSymbols::object_signature()->utf8_length() == (int)OBJ_SIG_LEN, "");
537 assert(vmSymbols::object_signature()->equals(OBJ_SIG), "");
538 const int len = sig->utf8_length();
539 for (int i = 0; i < len; i++) {
540 switch (sig->char_at(i)) {
541 case 'L':
542 // only java/lang/Object is valid here
543 if (sig->index_of_at(i, OBJ_SIG, OBJ_SIG_LEN) != i)
544 return false;
545 i += OBJ_SIG_LEN-1; //-1 because of i++ in loop
546 continue;
547 case '(': case ')': case 'V':
548 case 'I': case 'J': case 'F': case 'D':
549 continue;
550 //case '[':
551 //case 'Z': case 'B': case 'C': case 'S':
552 default:
553 return false;
554 }
555 }
556 return true;
557 }
558
559 Symbol* MethodHandles::lookup_basic_type_signature(Symbol* sig, bool keep_last_arg, TRAPS) {
560 Symbol* bsig = NULL;
561 if (sig == NULL) {
562 return sig;
563 } else if (is_basic_type_signature(sig)) {
564 sig->increment_refcount();
565 return sig; // that was easy
566 } else if (sig->char_at(0) != '(') {
567 BasicType bt = char2type(sig->char_at(0));
568 if (is_subword_type(bt)) {
569 bsig = vmSymbols::int_signature();
570 } else {
571 assert(bt == T_OBJECT || bt == T_ARRAY, "is_basic_type_signature was false");
572 bsig = vmSymbols::object_signature();
573 }
574 } else {
575 ResourceMark rm;
576 stringStream buffer(128);
577 buffer.put('(');
578 int arg_pos = 0, keep_arg_pos = -1;
579 if (keep_last_arg)
580 keep_arg_pos = ArgumentCount(sig).size() - 1;
581 for (SignatureStream ss(sig); !ss.is_done(); ss.next()) {
582 BasicType bt = ss.type();
583 size_t this_arg_pos = buffer.size();
584 if (ss.at_return_type()) {
585 buffer.put(')');
586 }
587 if (arg_pos == keep_arg_pos) {
598 }
599 const char* sigstr = buffer.base();
600 int siglen = (int) buffer.size();
601 bsig = SymbolTable::new_symbol(sigstr, siglen, THREAD);
602 }
603 assert(is_basic_type_signature(bsig) ||
604 // detune assert in case the injected argument is not a basic type:
605 keep_last_arg, "");
606 return bsig;
607 }
608
609 void MethodHandles::print_as_basic_type_signature_on(outputStream* st,
610 Symbol* sig,
611 bool keep_arrays,
612 bool keep_basic_names) {
613 st = st ? st : tty;
614 int len = sig->utf8_length();
615 int array = 0;
616 bool prev_type = false;
617 for (int i = 0; i < len; i++) {
618 char ch = sig->char_at(i);
619 switch (ch) {
620 case '(': case ')':
621 prev_type = false;
622 st->put(ch);
623 continue;
624 case '[':
625 if (!keep_basic_names && keep_arrays)
626 st->put(ch);
627 array++;
628 continue;
629 case 'L':
630 {
631 if (prev_type) st->put(',');
632 int start = i+1, slash = start;
633 while (++i < len && (ch = sig->char_at(i)) != ';') {
634 if (ch == '/' || ch == '.' || ch == '$') slash = i+1;
635 }
636 if (slash < i) start = slash;
637 if (!keep_basic_names) {
638 st->put('L');
639 } else {
640 for (int j = start; j < i; j++)
641 st->put(sig->char_at(j));
642 prev_type = true;
643 }
644 break;
645 }
646 default:
647 {
648 if (array && char2type(ch) != T_ILLEGAL && !keep_arrays) {
649 ch = '[';
650 array = 0;
651 }
652 if (prev_type) st->put(',');
653 const char* n = NULL;
654 if (keep_basic_names)
655 n = type2name(char2type(ch));
656 if (n == NULL) {
657 // unknown letter, or we don't want to know its name
658 st->put(ch);
659 } else {
660 st->print("%s", n);
661 prev_type = true;
958
959 Thread* thread = Thread::current();
960
961 if (k == NULL || !k->is_instance_klass()) return -1;
962
963 int rfill = 0, rlimit = results->length(), rskip = skip;
964 // overflow measurement:
965 int overflow = 0, overflow_limit = MAX2(1000, rlimit);
966
967 int match_flags = mflags;
968 bool search_superc = ((match_flags & SEARCH_SUPERCLASSES) != 0);
969 bool search_intfc = ((match_flags & SEARCH_INTERFACES) != 0);
970 bool local_only = !(search_superc | search_intfc);
971 bool classes_only = false;
972
973 if (name != NULL) {
974 if (name->utf8_length() == 0) return 0; // a match is not possible
975 }
976 if (sig != NULL) {
977 if (sig->utf8_length() == 0) return 0; // a match is not possible
978 if (sig->char_at(0) == '(')
979 match_flags &= ~(IS_FIELD | IS_TYPE);
980 else
981 match_flags &= ~(IS_CONSTRUCTOR | IS_METHOD);
982 }
983
984 if ((match_flags & IS_TYPE) != 0) {
985 // NYI, and Core Reflection works quite well for this query
986 }
987
988 if ((match_flags & IS_FIELD) != 0) {
989 InstanceKlass* ik = InstanceKlass::cast(k);
990 for (FieldStream st(ik, local_only, !search_intfc); !st.eos(); st.next()) {
991 if (name != NULL && st.name() != name)
992 continue;
993 if (sig != NULL && st.signature() != sig)
994 continue;
995 // passed the filters
996 if (rskip > 0) {
997 --rskip;
998 } else if (rfill < rlimit) {
1439 if (start >= end || 0 > pos || pos >= buf->length()) break;
1440 oop pseudo_arg = NULL;
1441 switch (pseudo_index) {
1442 case -4: // bootstrap method
1443 {
1444 int bsm_index = caller->constants()->invoke_dynamic_bootstrap_method_ref_index_at(bss_index_in_pool);
1445 pseudo_arg = caller->constants()->resolve_possibly_cached_constant_at(bsm_index, CHECK);
1446 break;
1447 }
1448 case -3: // name
1449 {
1450 Symbol* name = caller->constants()->name_ref_at(bss_index_in_pool);
1451 Handle str = java_lang_String::create_from_symbol(name, CHECK);
1452 pseudo_arg = str();
1453 break;
1454 }
1455 case -2: // type
1456 {
1457 Symbol* type = caller->constants()->signature_ref_at(bss_index_in_pool);
1458 Handle th;
1459 if (type->char_at(0) == '(') {
1460 th = SystemDictionary::find_method_handle_type(type, caller, CHECK);
1461 } else {
1462 th = SystemDictionary::find_java_mirror_for_type(type, caller, SignatureStream::NCDFError, CHECK);
1463 }
1464 pseudo_arg = th();
1465 break;
1466 }
1467 case -1: // argument count
1468 {
1469 int argc = caller->constants()->invoke_dynamic_argument_count_at(bss_index_in_pool);
1470 jvalue argc_value; argc_value.i = (jint)argc;
1471 pseudo_arg = java_lang_boxing_object::create(T_INT, &argc_value, CHECK);
1472 break;
1473 }
1474 }
1475
1476 // Store the pseudo-argument, and advance the pointers.
1477 buf->obj_at_put(pos++, pseudo_arg);
1478 ++start;
1479 }
|