diff options
| author | Todd Stock <toddastock@yahoo.com> | 2002-02-14 17:48:36 +0000 | 
|---|---|---|
| committer | Tom Tromey <tromey@gcc.gnu.org> | 2002-02-14 17:48:36 +0000 | 
| commit | 30fbb95c050ae400fecc0ea84a66c2042c8ed5dc (patch) | |
| tree | 7645434815392b2fd12c17e6cdea16812d401fc7 | |
| parent | 6c4cf6956ed5f4d8a36ab8e1e1cc9f808b6c087a (diff) | |
| download | gcc-30fbb95c050ae400fecc0ea84a66c2042c8ed5dc.zip gcc-30fbb95c050ae400fecc0ea84a66c2042c8ed5dc.tar.gz gcc-30fbb95c050ae400fecc0ea84a66c2042c8ed5dc.tar.bz2  | |
re PR libgcj/5670 (verify.cc not properly merging states)
2002-02-13  Todd Stock  <toddastock@yahoo.com>
	Fix for PR libgcj/5670:
	* verify.cc (is_assignable_from_slow): If `source' is interface,
	recursively look for merge with `target'.
From-SVN: r49769
| -rw-r--r-- | libjava/ChangeLog | 6 | ||||
| -rw-r--r-- | libjava/verify.cc | 16 | 
2 files changed, 20 insertions, 2 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 2438a8d..9688503 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2002-02-13  Todd Stock  <toddastock@yahoo.com> + +	Fix for PR libgcj/5670: +	* verify.cc (is_assignable_from_slow): If `source' is interface, +	recursively look for merge with `target'. +  2002-02-14  Martin Kahlert  <martin.kahlert@infineon.com>  	* include/jni.h: Fix typo. diff --git a/libjava/verify.cc b/libjava/verify.cc index 38421f4..ed734ea 100644 --- a/libjava/verify.cc +++ b/libjava/verify.cc @@ -259,10 +259,22 @@ private:  	    if (source == NULL)  	      return false;  	  } +	else if (source->isInterface ()) +	  { +	    for (int i = 0; i < target->interface_count; ++i) +	      { +		// We use a recursive call because we also need to +		// check superinterfaces. +		if (is_assignable_from_slow (target->interfaces[i], source)) +		  return true; +	      } +	    target = target->getSuperclass (); +	    if (target == NULL) +	      return false; +	  }  	else if (target == &java::lang::Object::class$)  	  return true; -	else if (source->isInterface () -		 || source == &java::lang::Object::class$) +	else if (source == &java::lang::Object::class$)  	  return false;  	else  	  source = source->getSuperclass ();  | 
