358 }
359
360 unsigned int java_lang_String::hash_string(oop java_string) {
361 int length = java_lang_String::length(java_string);
362 // Zero length string doesn't hash necessarily hash to zero.
363 if (length == 0) {
364 return StringTable::hash_string(NULL, 0);
365 }
366
367 typeArrayOop value = java_lang_String::value(java_string);
368 int offset = java_lang_String::offset(java_string);
369 return StringTable::hash_string(value->char_at_addr(offset), length);
370 }
371
372 Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
373 oop obj = java_string();
374 typeArrayOop value = java_lang_String::value(obj);
375 int offset = java_lang_String::offset(obj);
376 int length = java_lang_String::length(obj);
377 jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
378 Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD);
379 return sym;
380 }
381
382 Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
383 typeArrayOop value = java_lang_String::value(java_string);
384 int offset = java_lang_String::offset(java_string);
385 int length = java_lang_String::length(java_string);
386 jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
387 return SymbolTable::probe_unicode(base, length);
388 }
389
390
391 int java_lang_String::utf8_length(oop java_string) {
392 typeArrayOop value = java_lang_String::value(java_string);
393 int offset = java_lang_String::offset(java_string);
394 int length = java_lang_String::length(java_string);
395 jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
396 return UNICODE::utf8_length(position, length);
397 }
398
399 char* java_lang_String::as_utf8_string(oop java_string) {
400 typeArrayOop value = java_lang_String::value(java_string);
401 int offset = java_lang_String::offset(java_string);
402 int length = java_lang_String::length(java_string);
403 jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
404 return UNICODE::as_utf8(position, length);
405 }
406
407 char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
737
738 Symbol* java_lang_Class::as_signature(oop java_class, bool intern_if_not_found, TRAPS) {
739 assert(java_lang_Class::is_instance(java_class), "must be a Class object");
740 Symbol* name;
741 if (is_primitive(java_class)) {
742 name = vmSymbols::type_signature(primitive_type(java_class));
743 // Because this can create a new symbol, the caller has to decrement
744 // the refcount, so make adjustment here and below for symbols returned
745 // that are not created or incremented due to a successful lookup.
746 name->increment_refcount();
747 } else {
748 Klass* k = as_Klass(java_class);
749 if (!k->oop_is_instance()) {
750 name = k->name();
751 name->increment_refcount();
752 } else {
753 ResourceMark rm;
754 const char* sigstr = k->signature_name();
755 int siglen = (int) strlen(sigstr);
756 if (!intern_if_not_found) {
757 name = SymbolTable::probe(sigstr, siglen);
758 } else {
759 name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
760 }
761 }
762 }
763 return name;
764 }
765
766
767 Klass* java_lang_Class::array_klass(oop java_class) {
768 Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset));
769 assert(k == NULL || k->is_klass() && k->oop_is_array(), "should be array klass");
770 return k;
771 }
772
773
774 void java_lang_Class::set_array_klass(oop java_class, Klass* klass) {
775 assert(klass->is_klass() && klass->oop_is_array(), "should be array klass");
776 java_class->metadata_field_put(_array_klass_offset, klass);
777 }
2818 }
2819
2820 void java_lang_invoke_MethodType::print_signature(oop mt, outputStream* st) {
2821 st->print("(");
2822 objArrayOop pts = ptypes(mt);
2823 for (int i = 0, limit = pts->length(); i < limit; i++) {
2824 java_lang_Class::print_signature(pts->obj_at(i), st);
2825 }
2826 st->print(")");
2827 java_lang_Class::print_signature(rtype(mt), st);
2828 }
2829
2830 Symbol* java_lang_invoke_MethodType::as_signature(oop mt, bool intern_if_not_found, TRAPS) {
2831 ResourceMark rm;
2832 stringStream buffer(128);
2833 print_signature(mt, &buffer);
2834 const char* sigstr = buffer.base();
2835 int siglen = (int) buffer.size();
2836 Symbol *name;
2837 if (!intern_if_not_found) {
2838 name = SymbolTable::probe(sigstr, siglen);
2839 } else {
2840 name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
2841 }
2842 return name;
2843 }
2844
2845 bool java_lang_invoke_MethodType::equals(oop mt1, oop mt2) {
2846 if (mt1 == mt2)
2847 return true;
2848 if (rtype(mt1) != rtype(mt2))
2849 return false;
2850 if (ptype_count(mt1) != ptype_count(mt2))
2851 return false;
2852 for (int i = ptype_count(mt1) - 1; i >= 0; i--) {
2853 if (ptype(mt1, i) != ptype(mt2, i))
2854 return false;
2855 }
2856 return true;
2857 }
2858
|
358 }
359
360 unsigned int java_lang_String::hash_string(oop java_string) {
361 int length = java_lang_String::length(java_string);
362 // Zero length string doesn't hash necessarily hash to zero.
363 if (length == 0) {
364 return StringTable::hash_string(NULL, 0);
365 }
366
367 typeArrayOop value = java_lang_String::value(java_string);
368 int offset = java_lang_String::offset(java_string);
369 return StringTable::hash_string(value->char_at_addr(offset), length);
370 }
371
372 Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
373 oop obj = java_string();
374 typeArrayOop value = java_lang_String::value(obj);
375 int offset = java_lang_String::offset(obj);
376 int length = java_lang_String::length(obj);
377 jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
378 Symbol* sym = SymbolTable::lookup_and_add_unicode(base, length, THREAD);
379 return sym;
380 }
381
382 Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
383 typeArrayOop value = java_lang_String::value(java_string);
384 int offset = java_lang_String::offset(java_string);
385 int length = java_lang_String::length(java_string);
386 jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
387 return SymbolTable::lookup_and_ignore_hash_unicode(base, length);
388 }
389
390
391 int java_lang_String::utf8_length(oop java_string) {
392 typeArrayOop value = java_lang_String::value(java_string);
393 int offset = java_lang_String::offset(java_string);
394 int length = java_lang_String::length(java_string);
395 jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
396 return UNICODE::utf8_length(position, length);
397 }
398
399 char* java_lang_String::as_utf8_string(oop java_string) {
400 typeArrayOop value = java_lang_String::value(java_string);
401 int offset = java_lang_String::offset(java_string);
402 int length = java_lang_String::length(java_string);
403 jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
404 return UNICODE::as_utf8(position, length);
405 }
406
407 char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
737
738 Symbol* java_lang_Class::as_signature(oop java_class, bool intern_if_not_found, TRAPS) {
739 assert(java_lang_Class::is_instance(java_class), "must be a Class object");
740 Symbol* name;
741 if (is_primitive(java_class)) {
742 name = vmSymbols::type_signature(primitive_type(java_class));
743 // Because this can create a new symbol, the caller has to decrement
744 // the refcount, so make adjustment here and below for symbols returned
745 // that are not created or incremented due to a successful lookup.
746 name->increment_refcount();
747 } else {
748 Klass* k = as_Klass(java_class);
749 if (!k->oop_is_instance()) {
750 name = k->name();
751 name->increment_refcount();
752 } else {
753 ResourceMark rm;
754 const char* sigstr = k->signature_name();
755 int siglen = (int) strlen(sigstr);
756 if (!intern_if_not_found) {
757 name = SymbolTable::lookup_and_ignore_hash(sigstr, siglen);
758 } else {
759 name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
760 }
761 }
762 }
763 return name;
764 }
765
766
767 Klass* java_lang_Class::array_klass(oop java_class) {
768 Klass* k = ((Klass*)java_class->metadata_field(_array_klass_offset));
769 assert(k == NULL || k->is_klass() && k->oop_is_array(), "should be array klass");
770 return k;
771 }
772
773
774 void java_lang_Class::set_array_klass(oop java_class, Klass* klass) {
775 assert(klass->is_klass() && klass->oop_is_array(), "should be array klass");
776 java_class->metadata_field_put(_array_klass_offset, klass);
777 }
2818 }
2819
2820 void java_lang_invoke_MethodType::print_signature(oop mt, outputStream* st) {
2821 st->print("(");
2822 objArrayOop pts = ptypes(mt);
2823 for (int i = 0, limit = pts->length(); i < limit; i++) {
2824 java_lang_Class::print_signature(pts->obj_at(i), st);
2825 }
2826 st->print(")");
2827 java_lang_Class::print_signature(rtype(mt), st);
2828 }
2829
2830 Symbol* java_lang_invoke_MethodType::as_signature(oop mt, bool intern_if_not_found, TRAPS) {
2831 ResourceMark rm;
2832 stringStream buffer(128);
2833 print_signature(mt, &buffer);
2834 const char* sigstr = buffer.base();
2835 int siglen = (int) buffer.size();
2836 Symbol *name;
2837 if (!intern_if_not_found) {
2838 name = SymbolTable::lookup_and_ignore_hash(sigstr, siglen);
2839 } else {
2840 name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
2841 }
2842 return name;
2843 }
2844
2845 bool java_lang_invoke_MethodType::equals(oop mt1, oop mt2) {
2846 if (mt1 == mt2)
2847 return true;
2848 if (rtype(mt1) != rtype(mt2))
2849 return false;
2850 if (ptype_count(mt1) != ptype_count(mt2))
2851 return false;
2852 for (int i = ptype_count(mt1) - 1; i >= 0; i--) {
2853 if (ptype(mt1, i) != ptype(mt2, i))
2854 return false;
2855 }
2856 return true;
2857 }
2858
|