Mercurial > hg > openjdk > jdk6 > hotspot
changeset 4063:ce8ddc29d76d
8037167: Better method signature resolution
Summary: Modified for openjdk6 hs23
Reviewed-by: acorn, mschoene, hseigel, lfoltan
Contributed-by: paul.nauman@oracle.com
author | chrisphi |
---|---|
date | Sun, 06 Jul 2014 12:48:20 -0400 |
parents | 6177a94d77fd |
children | 5632578b9520 |
files | src/share/vm/classfile/classFileParser.cpp src/share/vm/classfile/classFileParser.hpp |
diffstat | 2 files changed, 20 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/classfile/classFileParser.cpp Sun Jul 06 12:44:28 2014 -0400 +++ b/src/share/vm/classfile/classFileParser.cpp Sun Jul 06 12:48:20 2014 -0400 @@ -955,7 +955,7 @@ "Wrong size %u for field's Signature attribute in class file %s", attribute_length, CHECK); } - generic_signature_index = cfs->get_u2(CHECK); + generic_signature_index = parse_generic_signature_attribute(cp, CHECK); } else if (attribute_name == vmSymbols::tag_runtime_visible_annotations()) { runtime_visible_annotations_length = attribute_length; runtime_visible_annotations = cfs->get_u1_buffer(); @@ -1915,8 +1915,7 @@ "Invalid Signature attribute length %u in class file %s", method_attribute_length, CHECK_(nullHandle)); } - cfs->guarantee_more(2, CHECK_(nullHandle)); // generic_signature_index - generic_signature_index = cfs->get_u2_fast(); + generic_signature_index = parse_generic_signature_attribute(cp, CHECK_(nullHandle)); } else if (method_attribute_name == vmSymbols::tag_runtime_visible_annotations()) { runtime_visible_annotations_length = method_attribute_length; runtime_visible_annotations = cfs->get_u1_buffer(); @@ -2288,6 +2287,17 @@ k->set_source_file_name(cp->symbol_at(sourcefile_index)); } +// Parse generic_signature attribute for methods and fields +u2 ClassFileParser::parse_generic_signature_attribute(constantPoolHandle cp, TRAPS) { + ClassFileStream* cfs = stream(); + cfs->guarantee_more(2, CHECK_0); // generic_signature_index + u2 generic_signature_index = cfs->get_u2_fast(); + check_property( + valid_symbol_at(cp, generic_signature_index), + "Invalid Signature attribute at constant pool index %u in class file %s", + generic_signature_index, CHECK_0); + return generic_signature_index; +} void ClassFileParser::parse_classfile_source_debug_extension_attribute(constantPoolHandle cp,
--- a/src/share/vm/classfile/classFileParser.hpp Sun Jul 06 12:44:28 2014 -0400 +++ b/src/share/vm/classfile/classFileParser.hpp Sun Jul 06 12:48:20 2014 -0400 @@ -127,6 +127,7 @@ typeArrayOop parse_stackmap_table(u4 code_attribute_length, TRAPS); // Classfile attribute parsing + u2 parse_generic_signature_attribute(constantPoolHandle cp, TRAPS); void parse_classfile_sourcefile_attribute(constantPoolHandle cp, instanceKlassHandle k, TRAPS); void parse_classfile_source_debug_extension_attribute(constantPoolHandle cp, instanceKlassHandle k, int length, TRAPS); @@ -249,6 +250,12 @@ : cp->tag_at(index).is_klass_reference()); } + // Checks that the cpool index is in range and is a utf8 + bool valid_symbol_at(constantPoolHandle cp, int cpool_index) { + return (cp->is_within_bounds(cpool_index) && + cp->tag_at(cpool_index).is_utf8()); + } + public: // Constructor ClassFileParser(ClassFileStream* st) { set_stream(st); }