< prev index next >

src/hotspot/share/prims/methodHandles.cpp

Print this page




 555     //case 'Z': case 'B': case 'C': case 'S':
 556     default:
 557       return false;
 558     }
 559   }
 560   return true;
 561 }
 562 
 563 Symbol* MethodHandles::lookup_basic_type_signature(Symbol* sig, bool keep_last_arg, TRAPS) {
 564   Symbol* bsig = NULL;
 565   if (sig == NULL) {
 566     return sig;
 567   } else if (is_basic_type_signature(sig)) {
 568     sig->increment_refcount();
 569     return sig;  // that was easy
 570   } else if (sig->char_at(0) != '(') {
 571     BasicType bt = char2type(sig->char_at(0));
 572     if (is_subword_type(bt)) {
 573       bsig = vmSymbols::int_signature();
 574     } else {
 575       assert(bt == T_OBJECT || bt == T_ARRAY, "is_basic_type_signature was false");
 576       bsig = vmSymbols::object_signature();
 577     }
 578   } else {
 579     ResourceMark rm;
 580     stringStream buffer(128);
 581     buffer.put('(');
 582     int arg_pos = 0, keep_arg_pos = -1;
 583     if (keep_last_arg)
 584       keep_arg_pos = ArgumentCount(sig).size() - 1;
 585     for (SignatureStream ss(sig); !ss.is_done(); ss.next()) {
 586       BasicType bt = ss.type();
 587       size_t this_arg_pos = buffer.size();
 588       if (ss.at_return_type()) {
 589         buffer.put(')');
 590       }
 591       if (arg_pos == keep_arg_pos) {
 592         buffer.write((char*) ss.raw_bytes(),
 593                      (int)   ss.raw_length());
 594       } else if (bt == T_OBJECT || bt == T_ARRAY) {
 595         buffer.write(OBJ_SIG, OBJ_SIG_LEN);
 596       } else {
 597         if (is_subword_type(bt))
 598           bt = T_INT;
 599         buffer.put(type2char(bt));
 600       }
 601       arg_pos++;
 602     }
 603     const char* sigstr =       buffer.base();
 604     int         siglen = (int) buffer.size();
 605     bsig = SymbolTable::new_symbol(sigstr, siglen);
 606   }
 607   assert(is_basic_type_signature(bsig) ||
 608          // detune assert in case the injected argument is not a basic type:
 609          keep_last_arg, "");
 610   return bsig;
 611 }
 612 
 613 void MethodHandles::print_as_basic_type_signature_on(outputStream* st,
 614                                                      Symbol* sig,




 555     //case 'Z': case 'B': case 'C': case 'S':
 556     default:
 557       return false;
 558     }
 559   }
 560   return true;
 561 }
 562 
 563 Symbol* MethodHandles::lookup_basic_type_signature(Symbol* sig, bool keep_last_arg, TRAPS) {
 564   Symbol* bsig = NULL;
 565   if (sig == NULL) {
 566     return sig;
 567   } else if (is_basic_type_signature(sig)) {
 568     sig->increment_refcount();
 569     return sig;  // that was easy
 570   } else if (sig->char_at(0) != '(') {
 571     BasicType bt = char2type(sig->char_at(0));
 572     if (is_subword_type(bt)) {
 573       bsig = vmSymbols::int_signature();
 574     } else {
 575       assert(is_reference_type(bt), "is_basic_type_signature was false");
 576       bsig = vmSymbols::object_signature();
 577     }
 578   } else {
 579     ResourceMark rm;
 580     stringStream buffer(128);
 581     buffer.put('(');
 582     int arg_pos = 0, keep_arg_pos = -1;
 583     if (keep_last_arg)
 584       keep_arg_pos = ArgumentCount(sig).size() - 1;
 585     for (SignatureStream ss(sig); !ss.is_done(); ss.next()) {
 586       BasicType bt = ss.type();
 587       size_t this_arg_pos = buffer.size();
 588       if (ss.at_return_type()) {
 589         buffer.put(')');
 590       }
 591       if (arg_pos == keep_arg_pos) {
 592         buffer.write((char*) ss.raw_bytes(),
 593                      (int)   ss.raw_length());
 594       } else if (is_reference_type(bt)) {
 595         buffer.write(OBJ_SIG, OBJ_SIG_LEN);
 596       } else {
 597         if (is_subword_type(bt))
 598           bt = T_INT;
 599         buffer.put(type2char(bt));
 600       }
 601       arg_pos++;
 602     }
 603     const char* sigstr =       buffer.base();
 604     int         siglen = (int) buffer.size();
 605     bsig = SymbolTable::new_symbol(sigstr, siglen);
 606   }
 607   assert(is_basic_type_signature(bsig) ||
 608          // detune assert in case the injected argument is not a basic type:
 609          keep_last_arg, "");
 610   return bsig;
 611 }
 612 
 613 void MethodHandles::print_as_basic_type_signature_on(outputStream* st,
 614                                                      Symbol* sig,


< prev index next >