diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-12-04 23:54:43 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-12-04 23:54:43 +0000 |
commit | 35204f6cf0fa977c96143f5dbaa5e6372b80aae5 (patch) | |
tree | 7895ca4152480f8409c79ab85fc6a7bf4b5b78aa /libjava | |
parent | 4da7cd36c14f5f6c57da5c00f15a775ad4106dec (diff) | |
download | gcc-35204f6cf0fa977c96143f5dbaa5e6372b80aae5.tar.gz |
* verify.cc (_Jv_BytecodeVerifier::linked_utf8): New structure.
(_Jv_BytecodeVerifier::utf8_list): New field.
(_Jv_BytecodeVerifier::_Jv_BytecodeVerifier): Initialize it.
(_Jv_BytecodeVerifier::~_Jv_BytecodeVerifier): Free it.
(_Jv_BytecodeVerifier::make_utf8_const): New method.
(_Jv_BytecodeVerifier::get_one_type): Use it.
(_Jv_BytecodeVerifier::type::merge): When using local semantics,
if the destination type is already unsuitable then we didn't
change.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47634 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 10 | ||||
-rw-r--r-- | libjava/verify.cc | 49 |
2 files changed, 55 insertions, 4 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 1e1311a1e97..e2b46288c57 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,5 +1,15 @@ 2001-12-04 Tom Tromey <tromey@redhat.com> + * verify.cc (_Jv_BytecodeVerifier::linked_utf8): New structure. + (_Jv_BytecodeVerifier::utf8_list): New field. + (_Jv_BytecodeVerifier::_Jv_BytecodeVerifier): Initialize it. + (_Jv_BytecodeVerifier::~_Jv_BytecodeVerifier): Free it. + (_Jv_BytecodeVerifier::make_utf8_const): New method. + (_Jv_BytecodeVerifier::get_one_type): Use it. + (_Jv_BytecodeVerifier::type::merge): When using local semantics, + if the destination type is already unsuitable then we didn't + change. + * defineclass.cc (read_one_method_attribute): `end_pc' for an exception can be equal to code length. * verify.cc (_Jv_BytecodeVerifier::verify_instructions_0): Removed diff --git a/libjava/verify.cc b/libjava/verify.cc index 3016ea42eca..a00c4d49448 100644 --- a/libjava/verify.cc +++ b/libjava/verify.cc @@ -50,6 +50,7 @@ private: struct state; struct type; struct subr_info; + struct linked_utf8; // The current PC. int PC; @@ -93,6 +94,34 @@ private: // This method. _Jv_InterpMethod *current_method; + // A linked list of utf8 objects we allocate. This is really ugly, + // but without this our utf8 objects would be collected. + linked_utf8 *utf8_list; + + struct linked_utf8 + { + _Jv_Utf8Const *val; + linked_utf8 *next; + }; + + _Jv_Utf8Const *make_utf8_const (char *s, int len) + { + _Jv_Utf8Const *val = _Jv_makeUtf8Const (s, len); + _Jv_Utf8Const *r = (_Jv_Utf8Const *) _Jv_Malloc (sizeof (_Jv_Utf8Const) + + val->length + + 1); + r->length = val->length; + r->hash = val->hash; + memcpy (r->data, val->data, val->length + 1); + + linked_utf8 *lu = (linked_utf8 *) _Jv_Malloc (sizeof (linked_utf8)); + lu->val = r; + lu->next = utf8_list; + utf8_list = lu; + + return r; + } + // This enum holds a list of tags for all the different types we // need to handle. Reference types are treated specially by the // type class. @@ -632,8 +661,13 @@ private: { if (local_semantics) { - key = unsuitable_type; - changed = true; + // If we already have an `unsuitable' type, then we + // don't need to change again. + if (key != unsuitable_type) + { + key = unsuitable_type; + changed = true; + } } else verify_fail ("unmergeable type"); @@ -1640,8 +1674,7 @@ private: while (*p != ';') ++p; ++p; - // FIXME! This will get collected! - _Jv_Utf8Const *name = _Jv_makeUtf8Const (start, p - start); + _Jv_Utf8Const *name = make_utf8_const (start, p - start); return type (name); } @@ -2604,6 +2637,7 @@ public: states = NULL; flags = NULL; jsr_ptrs = NULL; + utf8_list = NULL; } ~_Jv_BytecodeVerifier () @@ -2614,6 +2648,13 @@ public: _Jv_Free (flags); if (jsr_ptrs) _Jv_Free (jsr_ptrs); + while (utf8_list != NULL) + { + linked_utf8 *n = utf8_list->next; + _Jv_Free (utf8_list->val); + _Jv_Free (utf8_list); + utf8_list = n; + } } }; |