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, |