< prev index next >

src/hotspot/share/prims/methodHandles.cpp

Print this page




 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       }


< prev index next >