Properly handle references

This commit is contained in:
Daniel Berlin 2000-07-15 17:40:30 +00:00
parent 63bf565122
commit 802db21b61
2 changed files with 29 additions and 12 deletions

View File

@ -1,3 +1,10 @@
2000-07-15 Daniel Berlin <dberlin@redhat.com>
* valops.c (typecmp): Seperate loop into two, add support for
references. This way, we can say a reference to a pointer to a
char is compatible with a pointer to a char. Before, this would
not be true.
2000-07-14 Nicholas Duffek <nsd@redhat.com> 2000-07-14 Nicholas Duffek <nsd@redhat.com>
* ppcbug-rom.c (ppcbug_regnames[]): Make array size implicit. * ppcbug-rom.c (ppcbug_regnames[]): Make array size implicit.

View File

@ -274,7 +274,7 @@ value_cast (type, arg2)
case TYPE_CODE_MEMBER: case TYPE_CODE_MEMBER:
retvalp = value_from_longest (type, value_as_long (arg2)); retvalp = value_from_longest (type, value_as_long (arg2));
/* force evaluation */ /* force evaluation */
ptr = (unsigned int *) VALUE_CONTENTS (retvalp); ptr = (unsigned int *) VALUE_CONTENTS (retvalp);
*ptr &= ~0x20000000; /* zap 29th bit to remove bias */ *ptr &= ~0x20000000; /* zap 29th bit to remove bias */
return retvalp; return retvalp;
@ -287,10 +287,10 @@ value_cast (type, arg2)
} }
} }
longest = value_as_long (arg2); longest = value_as_long (arg2);
return value_from_longest (type, convert_to_boolean ? return value_from_longest (type, convert_to_boolean ?
(LONGEST) (longest ? 1 : 0) : longest); (LONGEST) (longest ? 1 : 0) : longest);
} }
else if (code1 == TYPE_CODE_PTR && (code2 == TYPE_CODE_INT || else if (code1 == TYPE_CODE_PTR && (code2 == TYPE_CODE_INT ||
code2 == TYPE_CODE_ENUM || code2 == TYPE_CODE_ENUM ||
code2 == TYPE_CODE_RANGE)) code2 == TYPE_CODE_RANGE))
{ {
@ -561,7 +561,7 @@ value_fetch_lazy (val)
} }
else if (length) else if (length)
read_memory (addr, VALUE_CONTENTS_ALL_RAW (val), length); read_memory (addr, VALUE_CONTENTS_ALL_RAW (val), length);
VALUE_LAZY (val) = 0; VALUE_LAZY (val) = 0;
return 0; return 0;
} }
@ -676,7 +676,7 @@ value_assign (toval, fromval)
if (VALUE_BITSIZE (toval)) if (VALUE_BITSIZE (toval))
{ {
char buffer[sizeof (LONGEST)]; char buffer[sizeof (LONGEST)];
int len = int len =
REGISTER_RAW_SIZE (VALUE_REGNO (toval)) - VALUE_OFFSET (toval); REGISTER_RAW_SIZE (VALUE_REGNO (toval)) - VALUE_OFFSET (toval);
if (len > (int) sizeof (LONGEST)) if (len > (int) sizeof (LONGEST))
@ -2029,12 +2029,22 @@ typecmp (staticp, t1, t2)
continue; continue;
} }
while (TYPE_CODE (tt1) == TYPE_CODE_PTR /* djb - 20000715 - Until the new type structure is in the
&& (TYPE_CODE (tt2) == TYPE_CODE_ARRAY place, and we can attempt things like implicit conversions,
|| TYPE_CODE (tt2) == TYPE_CODE_PTR)) we need to do this so you can take something like a map<const
char *>, and properly access map["hello"], because the
argument to [] will be a reference to a pointer to a char,
and the arrgument will be a pointer to a char. */
while ( TYPE_CODE(tt1) == TYPE_CODE_REF ||
TYPE_CODE (tt1) == TYPE_CODE_PTR)
{ {
tt1 = check_typedef (TYPE_TARGET_TYPE (tt1)); tt1 = check_typedef( TYPE_TARGET_TYPE(tt1) );
tt2 = check_typedef (TYPE_TARGET_TYPE (tt2)); }
while ( TYPE_CODE(tt2) == TYPE_CODE_ARRAY ||
TYPE_CODE(tt2) == TYPE_CODE_PTR ||
TYPE_CODE(tt2) == TYPE_CODE_REF)
{
tt2 = check_typedef( TYPE_TARGET_TYPE(tt2) );
} }
if (TYPE_CODE (tt1) == TYPE_CODE (tt2)) if (TYPE_CODE (tt1) == TYPE_CODE (tt2))
continue; continue;
@ -3324,7 +3334,7 @@ value_rtti_type (v, full, top, using_enc)
/* /*
Right now this is G++ RTTI. Plan on this changing in the Right now this is G++ RTTI. Plan on this changing in the
future as i get around to setting the vtables properly for G++ future as i get around to setting the vtables properly for G++
compiled stuff. Also, i'll be using the type info functions, compiled stuff. Also, i'll be using the type info functions,
which are always right. Deal with it until then. which are always right. Deal with it until then.
*/ */
{ {
@ -3353,7 +3363,7 @@ value_rtti_type (v, full, top, using_enc)
*using_enc=1; *using_enc=1;
} }
/* /*
We can't use value_ind here, because it would want to use RTTI, and We can't use value_ind here, because it would want to use RTTI, and
we'd waste a bunch of time figuring out we already know the type. we'd waste a bunch of time figuring out we already know the type.
Besides, we don't care about the type, just the actual pointer Besides, we don't care about the type, just the actual pointer
*/ */