< prev index next >
src/hotspot/share/classfile/verifier.hpp
Print this page
@@ -29,10 +29,11 @@
#include "oops/klass.hpp"
#include "oops/method.hpp"
#include "runtime/handles.hpp"
#include "utilities/exceptions.hpp"
#include "utilities/growableArray.hpp"
+#include "utilities/resourceHash.hpp"
// The verifier class
class Verifier : AllStatic {
public:
enum {
@@ -244,10 +245,35 @@
void bytecode_details(outputStream* ss, const Method* method) const;
void handler_details(outputStream* ss, const Method* method) const;
void stackmap_details(outputStream* ss, const Method* method) const;
};
+class sig_as_verification_types : public ResourceObj {
+ private:
+ int _num_args; // Number of arguments, not including return type.
+ GrowableArray<VerificationType>* _sig_verif_types;
+
+ public:
+
+ sig_as_verification_types(GrowableArray<VerificationType>* sig_verif_types) :
+ _num_args(0), _sig_verif_types(sig_verif_types) {
+ }
+
+ int num_args() const { return _num_args; }
+ void set_num_args(int num_args) { _num_args = num_args; }
+
+ GrowableArray<VerificationType>* sig_verif_types() { return _sig_verif_types; }
+ void set_sig_verif_types(GrowableArray<VerificationType>* sig_verif_types) {
+ _sig_verif_types = sig_verif_types;
+ }
+
+};
+
+typedef ResourceHashtable<int, sig_as_verification_types*,
+ primitive_hash<int>, primitive_equals<int>, 71>
+ method_signatures_table_type;
+
// A new instance of this class is created for each class being verified
class ClassVerifier : public StackObj {
private:
Thread* _thread;
@@ -255,10 +281,12 @@
GrowableArray<Symbol*>* _symbols; // keep a list of symbols created
Symbol* _exception_type;
char* _message;
+ method_signatures_table_type* _method_signatures_table;
+
ErrorContext _error_context; // contains information about an error
void verify_method(const methodHandle& method, TRAPS);
char* generate_code_data(const methodHandle& m, u4 code_length, TRAPS);
void verify_exception_handler_table(u4 code_length, char* code_data,
@@ -381,10 +409,18 @@
// Verifies the class. If a verify or class file format error occurs,
// the '_exception_name' symbols will set to the exception name and
// the message_buffer will be filled in with the exception message.
void verify_class(TRAPS);
+ // Loops through the constant pool looking for method signatures and stores
+ // them in the method signatures table.
+ void init_method_sigs_table(method_signatures_table_type* method_sig_table, TRAPS);
+
+ // Translates signature entries into verificationTypes and saves them in the
+ // growable array.
+ void translate_signature(Symbol* const method_sig, sig_as_verification_types* sig_verif_types, TRAPS);
+
// Return status modes
Symbol* result() const { return _exception_type; }
bool has_error() const { return result() != NULL; }
char* exception_message() {
stringStream ss;
@@ -398,10 +434,18 @@
void verify_error(ErrorContext ctx, const char* fmt, ...) ATTRIBUTE_PRINTF(3, 4);
void class_format_error(const char* fmt, ...) ATTRIBUTE_PRINTF(2, 3);
Klass* load_class(Symbol* name, TRAPS);
+ method_signatures_table_type* method_signatures_table() const {
+ return _method_signatures_table;
+ }
+
+ void set_method_signatures_table(method_signatures_table_type* method_signatures_table) {
+ _method_signatures_table = method_signatures_table;
+ }
+
int change_sig_to_verificationType(
SignatureStream* sig_type, VerificationType* inference_type, TRAPS);
VerificationType cp_index_to_type(int index, const constantPoolHandle& cp, TRAPS) {
return VerificationType::reference_type(cp->klass_name_at(index));
< prev index next >