8264142: Remove TRAPS/THREAD parameters for verifier related functions
Reviewed-by: gziemski, coleenp, iklam, dholmes
This commit is contained in:
parent
aefc1560b5
commit
19a6ac46ce
@ -1240,8 +1240,7 @@ static void parse_annotations(const ConstantPool* const cp,
|
|||||||
const u1* buffer, int limit,
|
const u1* buffer, int limit,
|
||||||
AnnotationCollector* coll,
|
AnnotationCollector* coll,
|
||||||
ClassLoaderData* loader_data,
|
ClassLoaderData* loader_data,
|
||||||
const bool can_access_vm_annotations,
|
const bool can_access_vm_annotations) {
|
||||||
TRAPS) {
|
|
||||||
|
|
||||||
assert(cp != NULL, "invariant");
|
assert(cp != NULL, "invariant");
|
||||||
assert(buffer != NULL, "invariant");
|
assert(buffer != NULL, "invariant");
|
||||||
@ -1418,8 +1417,7 @@ void ClassFileParser::parse_field_attributes(const ClassFileStream* const cfs,
|
|||||||
runtime_visible_annotations_length,
|
runtime_visible_annotations_length,
|
||||||
parsed_annotations,
|
parsed_annotations,
|
||||||
_loader_data,
|
_loader_data,
|
||||||
_can_access_vm_annotations,
|
_can_access_vm_annotations);
|
||||||
CHECK);
|
|
||||||
cfs->skip_u1_fast(runtime_visible_annotations_length);
|
cfs->skip_u1_fast(runtime_visible_annotations_length);
|
||||||
} else if (attribute_name == vmSymbols::tag_runtime_invisible_annotations()) {
|
} else if (attribute_name == vmSymbols::tag_runtime_invisible_annotations()) {
|
||||||
if (runtime_invisible_annotations_exists) {
|
if (runtime_invisible_annotations_exists) {
|
||||||
@ -2734,8 +2732,7 @@ Method* ClassFileParser::parse_method(const ClassFileStream* const cfs,
|
|||||||
runtime_visible_annotations_length,
|
runtime_visible_annotations_length,
|
||||||
&parsed_annotations,
|
&parsed_annotations,
|
||||||
_loader_data,
|
_loader_data,
|
||||||
_can_access_vm_annotations,
|
_can_access_vm_annotations);
|
||||||
CHECK_NULL);
|
|
||||||
cfs->skip_u1_fast(runtime_visible_annotations_length);
|
cfs->skip_u1_fast(runtime_visible_annotations_length);
|
||||||
} else if (method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) {
|
} else if (method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) {
|
||||||
if (runtime_invisible_annotations_exists) {
|
if (runtime_invisible_annotations_exists) {
|
||||||
@ -3563,7 +3560,7 @@ u2 ClassFileParser::parse_classfile_record_attribute(const ClassFileStream* cons
|
|||||||
return calculate_attr_size;
|
return calculate_attr_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClassFileParser::parse_classfile_synthetic_attribute(TRAPS) {
|
void ClassFileParser::parse_classfile_synthetic_attribute() {
|
||||||
set_class_synthetic_flag(true);
|
set_class_synthetic_flag(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3763,7 +3760,7 @@ void ClassFileParser::parse_classfile_attributes(const ClassFileStream* const cf
|
|||||||
attribute_length, THREAD);
|
attribute_length, THREAD);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
parse_classfile_synthetic_attribute(CHECK);
|
parse_classfile_synthetic_attribute();
|
||||||
} else if (tag == vmSymbols::tag_deprecated()) {
|
} else if (tag == vmSymbols::tag_deprecated()) {
|
||||||
// Check for Deprecated tag - 4276120
|
// Check for Deprecated tag - 4276120
|
||||||
if (attribute_length != 0) {
|
if (attribute_length != 0) {
|
||||||
@ -3801,8 +3798,7 @@ void ClassFileParser::parse_classfile_attributes(const ClassFileStream* const cf
|
|||||||
runtime_visible_annotations_length,
|
runtime_visible_annotations_length,
|
||||||
parsed_annotations,
|
parsed_annotations,
|
||||||
_loader_data,
|
_loader_data,
|
||||||
_can_access_vm_annotations,
|
_can_access_vm_annotations);
|
||||||
CHECK);
|
|
||||||
cfs->skip_u1_fast(runtime_visible_annotations_length);
|
cfs->skip_u1_fast(runtime_visible_annotations_length);
|
||||||
} else if (tag == vmSymbols::tag_runtime_invisible_annotations()) {
|
} else if (tag == vmSymbols::tag_runtime_invisible_annotations()) {
|
||||||
if (runtime_invisible_annotations_exists) {
|
if (runtime_invisible_annotations_exists) {
|
||||||
@ -4072,8 +4068,7 @@ void ClassFileParser::create_combined_annotations(TRAPS) {
|
|||||||
// Transfer ownership of metadata allocated to the InstanceKlass.
|
// Transfer ownership of metadata allocated to the InstanceKlass.
|
||||||
void ClassFileParser::apply_parsed_class_metadata(
|
void ClassFileParser::apply_parsed_class_metadata(
|
||||||
InstanceKlass* this_klass,
|
InstanceKlass* this_klass,
|
||||||
int java_fields_count,
|
int java_fields_count) {
|
||||||
TRAPS) {
|
|
||||||
assert(this_klass != NULL, "invariant");
|
assert(this_klass != NULL, "invariant");
|
||||||
|
|
||||||
_cp->set_pool_holder(this_klass);
|
_cp->set_pool_holder(this_klass);
|
||||||
@ -5418,7 +5413,7 @@ void ClassFileParser::fill_instance_klass(InstanceKlass* ik,
|
|||||||
|
|
||||||
// this transfers ownership of a lot of arrays from
|
// this transfers ownership of a lot of arrays from
|
||||||
// the parser onto the InstanceKlass*
|
// the parser onto the InstanceKlass*
|
||||||
apply_parsed_class_metadata(ik, _java_fields_count, CHECK);
|
apply_parsed_class_metadata(ik, _java_fields_count);
|
||||||
|
|
||||||
// can only set dynamic nest-host after static nest information is set
|
// can only set dynamic nest-host after static nest information is set
|
||||||
if (cl_inst_info.dynamic_nest_host() != NULL) {
|
if (cl_inst_info.dynamic_nest_host() != NULL) {
|
||||||
@ -5637,8 +5632,8 @@ void ClassFileParser::update_class_name(Symbol* new_class_name) {
|
|||||||
// For an unsafe anonymous class that is in the unnamed package, move it to its host class's
|
// For an unsafe anonymous class that is in the unnamed package, move it to its host class's
|
||||||
// package by prepending its host class's package name to its class name and setting
|
// package by prepending its host class's package name to its class name and setting
|
||||||
// its _class_name field.
|
// its _class_name field.
|
||||||
void ClassFileParser::prepend_host_package_name(const InstanceKlass* unsafe_anonymous_host, TRAPS) {
|
void ClassFileParser::prepend_host_package_name(Thread* current, const InstanceKlass* unsafe_anonymous_host) {
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(current);
|
||||||
assert(strrchr(_class_name->as_C_string(), JVM_SIGNATURE_SLASH) == NULL,
|
assert(strrchr(_class_name->as_C_string(), JVM_SIGNATURE_SLASH) == NULL,
|
||||||
"Unsafe anonymous class should not be in a package");
|
"Unsafe anonymous class should not be in a package");
|
||||||
TempNewSymbol host_pkg_name =
|
TempNewSymbol host_pkg_name =
|
||||||
@ -5674,7 +5669,7 @@ void ClassFileParser::fix_unsafe_anonymous_class_name(TRAPS) {
|
|||||||
const jbyte* anon_last_slash = UTF8::strrchr((const jbyte*)_class_name->base(),
|
const jbyte* anon_last_slash = UTF8::strrchr((const jbyte*)_class_name->base(),
|
||||||
_class_name->utf8_length(), JVM_SIGNATURE_SLASH);
|
_class_name->utf8_length(), JVM_SIGNATURE_SLASH);
|
||||||
if (anon_last_slash == NULL) { // Unnamed package
|
if (anon_last_slash == NULL) { // Unnamed package
|
||||||
prepend_host_package_name(_unsafe_anonymous_host, CHECK);
|
prepend_host_package_name(THREAD, _unsafe_anonymous_host);
|
||||||
} else {
|
} else {
|
||||||
if (!_unsafe_anonymous_host->is_same_class_package(_unsafe_anonymous_host->class_loader(), _class_name)) {
|
if (!_unsafe_anonymous_host->is_same_class_package(_unsafe_anonymous_host->class_loader(), _class_name)) {
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -211,7 +211,7 @@ class ClassFileParser {
|
|||||||
ConstantPool* cp,
|
ConstantPool* cp,
|
||||||
TRAPS);
|
TRAPS);
|
||||||
|
|
||||||
void prepend_host_package_name(const InstanceKlass* unsafe_anonymous_host, TRAPS);
|
void prepend_host_package_name(Thread* current, const InstanceKlass* unsafe_anonymous_host);
|
||||||
void fix_unsafe_anonymous_class_name(TRAPS);
|
void fix_unsafe_anonymous_class_name(TRAPS);
|
||||||
|
|
||||||
void fill_instance_klass(InstanceKlass* ik, bool cf_changed_in_CFLH,
|
void fill_instance_klass(InstanceKlass* ik, bool cf_changed_in_CFLH,
|
||||||
@ -228,7 +228,7 @@ class ClassFileParser {
|
|||||||
|
|
||||||
void create_combined_annotations(TRAPS);
|
void create_combined_annotations(TRAPS);
|
||||||
void apply_parsed_class_attributes(InstanceKlass* k); // update k
|
void apply_parsed_class_attributes(InstanceKlass* k); // update k
|
||||||
void apply_parsed_class_metadata(InstanceKlass* k, int fields_count, TRAPS);
|
void apply_parsed_class_metadata(InstanceKlass* k, int fields_count);
|
||||||
void clear_class_metadata();
|
void clear_class_metadata();
|
||||||
|
|
||||||
// Constant pool parsing
|
// Constant pool parsing
|
||||||
@ -349,7 +349,7 @@ class ClassFileParser {
|
|||||||
ClassAnnotationCollector* parsed_annotations,
|
ClassAnnotationCollector* parsed_annotations,
|
||||||
TRAPS);
|
TRAPS);
|
||||||
|
|
||||||
void parse_classfile_synthetic_attribute(TRAPS);
|
void parse_classfile_synthetic_attribute();
|
||||||
void parse_classfile_signature_attribute(const ClassFileStream* const cfs, TRAPS);
|
void parse_classfile_signature_attribute(const ClassFileStream* const cfs, TRAPS);
|
||||||
void parse_classfile_bootstrap_methods_attribute(const ClassFileStream* const cfs,
|
void parse_classfile_bootstrap_methods_attribute(const ClassFileStream* const cfs,
|
||||||
ConstantPool* cp,
|
ConstantPool* cp,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -75,7 +75,7 @@ void StackMapFrame::initialize_object(
|
|||||||
}
|
}
|
||||||
|
|
||||||
VerificationType StackMapFrame::set_locals_from_arg(
|
VerificationType StackMapFrame::set_locals_from_arg(
|
||||||
const methodHandle& m, VerificationType thisKlass, TRAPS) {
|
const methodHandle& m, VerificationType thisKlass) {
|
||||||
SignatureStream ss(m->signature());
|
SignatureStream ss(m->signature());
|
||||||
int init_local_num = 0;
|
int init_local_num = 0;
|
||||||
if (!m->is_static()) {
|
if (!m->is_static()) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -153,7 +153,7 @@ class StackMapFrame : public ResourceObj {
|
|||||||
|
|
||||||
// Set local variable type array based on m's signature.
|
// Set local variable type array based on m's signature.
|
||||||
VerificationType set_locals_from_arg(
|
VerificationType set_locals_from_arg(
|
||||||
const methodHandle& m, VerificationType thisKlass, TRAPS);
|
const methodHandle& m, VerificationType thisKlass);
|
||||||
|
|
||||||
// Search local variable type array and stack type array.
|
// Search local variable type array and stack type array.
|
||||||
// Set every element with type of old_object to new_object.
|
// Set every element with type of old_object to new_object.
|
||||||
|
@ -122,8 +122,8 @@ bool VerificationType::is_reference_assignable_from(
|
|||||||
return resolve_and_check_assignability(klass, name(), from.name(),
|
return resolve_and_check_assignability(klass, name(), from.name(),
|
||||||
from_field_is_protected, from.is_array(), from.is_object(), THREAD);
|
from_field_is_protected, from.is_array(), from.is_object(), THREAD);
|
||||||
} else if (is_array() && from.is_array()) {
|
} else if (is_array() && from.is_array()) {
|
||||||
VerificationType comp_this = get_component(context, CHECK_false);
|
VerificationType comp_this = get_component(context);
|
||||||
VerificationType comp_from = from.get_component(context, CHECK_false);
|
VerificationType comp_from = from.get_component(context);
|
||||||
if (!comp_this.is_bogus() && !comp_from.is_bogus()) {
|
if (!comp_this.is_bogus() && !comp_from.is_bogus()) {
|
||||||
return comp_this.is_component_assignable_from(comp_from, context,
|
return comp_this.is_component_assignable_from(comp_from, context,
|
||||||
from_field_is_protected, THREAD);
|
from_field_is_protected, THREAD);
|
||||||
@ -132,7 +132,7 @@ bool VerificationType::is_reference_assignable_from(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
VerificationType VerificationType::get_component(ClassVerifier *context, TRAPS) const {
|
VerificationType VerificationType::get_component(ClassVerifier *context) const {
|
||||||
assert(is_array() && name()->utf8_length() >= 2, "Must be a valid array");
|
assert(is_array() && name()->utf8_length() >= 2, "Must be a valid array");
|
||||||
SignatureStream ss(name(), false);
|
SignatureStream ss(name(), false);
|
||||||
ss.skip_array_prefix(1);
|
ss.skip_array_prefix(1);
|
||||||
|
@ -316,7 +316,7 @@ class VerificationType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VerificationType get_component(ClassVerifier* context, TRAPS) const;
|
VerificationType get_component(ClassVerifier* context) const;
|
||||||
|
|
||||||
int dimensions() const {
|
int dimensions() const {
|
||||||
assert(is_array(), "Must be an array");
|
assert(is_array(), "Must be an array");
|
||||||
|
@ -134,17 +134,17 @@ void Verifier::trace_class_resolution(Klass* resolve_class, InstanceKlass* verif
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Prints the end-verification message to the appropriate output.
|
// Prints the end-verification message to the appropriate output.
|
||||||
void Verifier::log_end_verification(outputStream* st, const char* klassName, Symbol* exception_name, TRAPS) {
|
void Verifier::log_end_verification(outputStream* st, const char* klassName, Symbol* exception_name, oop pending_exception) {
|
||||||
if (HAS_PENDING_EXCEPTION) {
|
if (pending_exception != NULL) {
|
||||||
st->print("Verification for %s has", klassName);
|
st->print("Verification for %s has", klassName);
|
||||||
oop message = java_lang_Throwable::message(PENDING_EXCEPTION);
|
oop message = java_lang_Throwable::message(pending_exception);
|
||||||
if (message != NULL) {
|
if (message != NULL) {
|
||||||
char* ex_msg = java_lang_String::as_utf8_string(message);
|
char* ex_msg = java_lang_String::as_utf8_string(message);
|
||||||
st->print_cr(" exception pending '%s %s'",
|
st->print_cr(" exception pending '%s %s'",
|
||||||
PENDING_EXCEPTION->klass()->external_name(), ex_msg);
|
pending_exception->klass()->external_name(), ex_msg);
|
||||||
} else {
|
} else {
|
||||||
st->print_cr(" exception pending %s ",
|
st->print_cr(" exception pending %s ",
|
||||||
PENDING_EXCEPTION->klass()->external_name());
|
pending_exception->klass()->external_name());
|
||||||
}
|
}
|
||||||
} else if (exception_name != NULL) {
|
} else if (exception_name != NULL) {
|
||||||
st->print_cr("Verification for %s failed", klassName);
|
st->print_cr("Verification for %s failed", klassName);
|
||||||
@ -193,7 +193,8 @@ bool Verifier::verify(InstanceKlass* klass, bool should_verify_class, TRAPS) {
|
|||||||
|
|
||||||
log_info(class, init)("Start class verification for: %s", klass->external_name());
|
log_info(class, init)("Start class verification for: %s", klass->external_name());
|
||||||
if (klass->major_version() >= STACKMAP_ATTRIBUTE_MAJOR_VERSION) {
|
if (klass->major_version() >= STACKMAP_ATTRIBUTE_MAJOR_VERSION) {
|
||||||
ClassVerifier split_verifier(klass, THREAD);
|
ClassVerifier split_verifier(jt, klass);
|
||||||
|
// We don't use CHECK here, or on inference_verify below, so that we can log any exception.
|
||||||
split_verifier.verify_class(THREAD);
|
split_verifier.verify_class(THREAD);
|
||||||
exception_name = split_verifier.result();
|
exception_name = split_verifier.result();
|
||||||
|
|
||||||
@ -228,12 +229,12 @@ bool Verifier::verify(InstanceKlass* klass, bool should_verify_class, TRAPS) {
|
|||||||
LogTarget(Info, class, init) lt1;
|
LogTarget(Info, class, init) lt1;
|
||||||
if (lt1.is_enabled()) {
|
if (lt1.is_enabled()) {
|
||||||
LogStream ls(lt1);
|
LogStream ls(lt1);
|
||||||
log_end_verification(&ls, klass->external_name(), exception_name, THREAD);
|
log_end_verification(&ls, klass->external_name(), exception_name, PENDING_EXCEPTION);
|
||||||
}
|
}
|
||||||
LogTarget(Info, verification) lt2;
|
LogTarget(Info, verification) lt2;
|
||||||
if (lt2.is_enabled()) {
|
if (lt2.is_enabled()) {
|
||||||
LogStream ls(lt2);
|
LogStream ls(lt2);
|
||||||
log_end_verification(&ls, klass->external_name(), exception_name, THREAD);
|
log_end_verification(&ls, klass->external_name(), exception_name, PENDING_EXCEPTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HAS_PENDING_EXCEPTION) {
|
if (HAS_PENDING_EXCEPTION) {
|
||||||
@ -589,9 +590,8 @@ void ErrorContext::stackmap_details(outputStream* ss, const Method* method) cons
|
|||||||
|
|
||||||
// Methods in ClassVerifier
|
// Methods in ClassVerifier
|
||||||
|
|
||||||
ClassVerifier::ClassVerifier(
|
ClassVerifier::ClassVerifier(JavaThread* current, InstanceKlass* klass)
|
||||||
InstanceKlass* klass, TRAPS)
|
: _thread(current), _previous_symbol(NULL), _symbols(NULL), _exception_type(NULL),
|
||||||
: _thread(THREAD), _previous_symbol(NULL), _symbols(NULL), _exception_type(NULL),
|
|
||||||
_message(NULL), _method_signatures_table(NULL), _klass(klass) {
|
_message(NULL), _method_signatures_table(NULL), _klass(klass) {
|
||||||
_this_type = VerificationType::reference_type(klass->name());
|
_this_type = VerificationType::reference_type(klass->name());
|
||||||
}
|
}
|
||||||
@ -616,6 +616,7 @@ TypeOrigin ClassVerifier::ref_ctx(const char* sig) {
|
|||||||
return TypeOrigin::implicit(vt);
|
return TypeOrigin::implicit(vt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ClassVerifier::verify_class(TRAPS) {
|
void ClassVerifier::verify_class(TRAPS) {
|
||||||
log_info(verification)("Verifying class %s with new format", _klass->external_name());
|
log_info(verification)("Verifying class %s with new format", _klass->external_name());
|
||||||
|
|
||||||
@ -653,8 +654,7 @@ void ClassVerifier::verify_class(TRAPS) {
|
|||||||
// Translate the signature entries into verification types and save them in
|
// Translate the signature entries into verification types and save them in
|
||||||
// the growable array. Also, save the count of arguments.
|
// the growable array. Also, save the count of arguments.
|
||||||
void ClassVerifier::translate_signature(Symbol* const method_sig,
|
void ClassVerifier::translate_signature(Symbol* const method_sig,
|
||||||
sig_as_verification_types* sig_verif_types,
|
sig_as_verification_types* sig_verif_types) {
|
||||||
TRAPS) {
|
|
||||||
SignatureStream sig_stream(method_sig);
|
SignatureStream sig_stream(method_sig);
|
||||||
VerificationType sig_type[2];
|
VerificationType sig_type[2];
|
||||||
int sig_i = 0;
|
int sig_i = 0;
|
||||||
@ -688,11 +688,11 @@ void ClassVerifier::translate_signature(Symbol* const method_sig,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClassVerifier::create_method_sig_entry(sig_as_verification_types* sig_verif_types,
|
void ClassVerifier::create_method_sig_entry(sig_as_verification_types* sig_verif_types,
|
||||||
int sig_index, TRAPS) {
|
int sig_index) {
|
||||||
// Translate the signature into verification types.
|
// Translate the signature into verification types.
|
||||||
ConstantPool* cp = _klass->constants();
|
ConstantPool* cp = _klass->constants();
|
||||||
Symbol* const method_sig = cp->symbol_at(sig_index);
|
Symbol* const method_sig = cp->symbol_at(sig_index);
|
||||||
translate_signature(method_sig, sig_verif_types, CHECK_VERIFY(this));
|
translate_signature(method_sig, sig_verif_types);
|
||||||
|
|
||||||
// Add the list of this signature's verification types to the table.
|
// Add the list of this signature's verification types to the table.
|
||||||
bool is_unique = method_signatures_table()->put(sig_index, sig_verif_types);
|
bool is_unique = method_signatures_table()->put(sig_index, sig_verif_types);
|
||||||
@ -718,8 +718,7 @@ void ClassVerifier::verify_method(const methodHandle& m, TRAPS) {
|
|||||||
// Initial stack map frame: offset is 0, stack is initially empty.
|
// Initial stack map frame: offset is 0, stack is initially empty.
|
||||||
StackMapFrame current_frame(max_locals, max_stack, this);
|
StackMapFrame current_frame(max_locals, max_stack, this);
|
||||||
// Set initial locals
|
// Set initial locals
|
||||||
VerificationType return_type = current_frame.set_locals_from_arg(
|
VerificationType return_type = current_frame.set_locals_from_arg( m, current_type());
|
||||||
m, current_type(), CHECK_VERIFY(this));
|
|
||||||
|
|
||||||
int32_t stackmap_index = 0; // index to the stackmap array
|
int32_t stackmap_index = 0; // index to the stackmap array
|
||||||
|
|
||||||
@ -1049,8 +1048,7 @@ void ClassVerifier::verify_method(const methodHandle& m, TRAPS) {
|
|||||||
current_frame.push_stack(
|
current_frame.push_stack(
|
||||||
VerificationType::null_type(), CHECK_VERIFY(this));
|
VerificationType::null_type(), CHECK_VERIFY(this));
|
||||||
} else {
|
} else {
|
||||||
VerificationType component =
|
VerificationType component = atype.get_component(this);
|
||||||
atype.get_component(this, CHECK_VERIFY(this));
|
|
||||||
current_frame.push_stack(component, CHECK_VERIFY(this));
|
current_frame.push_stack(component, CHECK_VERIFY(this));
|
||||||
}
|
}
|
||||||
no_control_flow = false; break;
|
no_control_flow = false; break;
|
||||||
@ -2827,7 +2825,7 @@ void ClassVerifier::verify_invoke_instructions(
|
|||||||
// Not found, add the entry to the table.
|
// Not found, add the entry to the table.
|
||||||
GrowableArray<VerificationType>* verif_types = new GrowableArray<VerificationType>(10);
|
GrowableArray<VerificationType>* verif_types = new GrowableArray<VerificationType>(10);
|
||||||
mth_sig_verif_types = new sig_as_verification_types(verif_types);
|
mth_sig_verif_types = new sig_as_verification_types(verif_types);
|
||||||
create_method_sig_entry(mth_sig_verif_types, sig_index, CHECK_VERIFY(this));
|
create_method_sig_entry(mth_sig_verif_types, sig_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the number of arguments for this signature.
|
// Get the number of arguments for this signature.
|
||||||
|
@ -46,7 +46,8 @@ class Verifier : AllStatic {
|
|||||||
// Verify the bytecodes for a class.
|
// Verify the bytecodes for a class.
|
||||||
static bool verify(InstanceKlass* klass, bool should_verify_class, TRAPS);
|
static bool verify(InstanceKlass* klass, bool should_verify_class, TRAPS);
|
||||||
|
|
||||||
static void log_end_verification(outputStream* st, const char* klassName, Symbol* exception_name, TRAPS);
|
static void log_end_verification(outputStream* st, const char* klassName, Symbol* exception_name,
|
||||||
|
oop pending_exception);
|
||||||
|
|
||||||
// Return false if the class is loaded by the bootstrap loader,
|
// Return false if the class is loaded by the bootstrap loader,
|
||||||
// or if defineClass was called requesting skipping verification
|
// or if defineClass was called requesting skipping verification
|
||||||
@ -398,7 +399,7 @@ class ClassVerifier : public StackObj {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
ClassVerifier(InstanceKlass* klass, TRAPS);
|
ClassVerifier(JavaThread* current, InstanceKlass* klass);
|
||||||
|
|
||||||
// destructor
|
// destructor
|
||||||
~ClassVerifier();
|
~ClassVerifier();
|
||||||
@ -415,10 +416,10 @@ class ClassVerifier : public StackObj {
|
|||||||
|
|
||||||
// Translates method signature entries into verificationTypes and saves them
|
// Translates method signature entries into verificationTypes and saves them
|
||||||
// in the growable array.
|
// in the growable array.
|
||||||
void translate_signature(Symbol* const method_sig, sig_as_verification_types* sig_verif_types, TRAPS);
|
void translate_signature(Symbol* const method_sig, sig_as_verification_types* sig_verif_types);
|
||||||
|
|
||||||
// Initializes a sig_as_verification_types entry and puts it in the hash table.
|
// Initializes a sig_as_verification_types entry and puts it in the hash table.
|
||||||
void create_method_sig_entry(sig_as_verification_types* sig_verif_types, int sig_index, TRAPS);
|
void create_method_sig_entry(sig_as_verification_types* sig_verif_types, int sig_index);
|
||||||
|
|
||||||
// Return status modes
|
// Return status modes
|
||||||
Symbol* result() const { return _exception_type; }
|
Symbol* result() const { return _exception_type; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user