< prev index next >
src/hotspot/share/classfile/verifier.hpp
Print this page
*** 29,38 ****
--- 29,39 ----
#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,253 ****
--- 245,279 ----
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>, 1007>
+ 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,264 ****
--- 281,292 ----
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,390 ****
--- 409,425 ----
// 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);
+ // Translates method 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);
+
+ // 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);
+
// Return status modes
Symbol* result() const { return _exception_type; }
bool has_error() const { return result() != NULL; }
char* exception_message() {
stringStream ss;
*** 398,407 ****
--- 433,450 ----
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 >