diff options
author | Tom Tromey <tromey@redhat.com> | 2001-12-04 23:54:43 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2001-12-04 23:54:43 +0000 |
commit | 0c88d7f8192acb7efcaec8ab8b5103805da81486 (patch) | |
tree | 7895ca4152480f8409c79ab85fc6a7bf4b5b78aa /libjava/verify.cc | |
parent | 7c1e833675a2de199291f5a2a1949b2e2d1b157a (diff) | |
download | gcc-0c88d7f8192acb7efcaec8ab8b5103805da81486.tar.gz |
verify.cc (_Jv_BytecodeVerifier::linked_utf8): New structure.
* 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.
From-SVN: r47634
Diffstat (limited to 'libjava/verify.cc')
-rw-r--r-- | libjava/verify.cc | 49 |
1 files changed, 45 insertions, 4 deletions
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; + } } }; |