projects
/
cacao.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
23a3859
)
* src/vm/class.cpp (class_is_assignable_from): Fixed for array classes.
author
Michael Starzinger
<michi@complang.tuwien.ac.at>
Mon, 29 Dec 2008 12:02:05 +0000
(13:02 +0100)
committer
Michael Starzinger
<michi@complang.tuwien.ac.at>
Mon, 29 Dec 2008 12:02:05 +0000
(13:02 +0100)
src/vm/class.cpp
patch
|
blob
|
history
diff --git
a/src/vm/class.cpp
b/src/vm/class.cpp
index 35ef8de9057cc1eeff3d1e02c465cbc98029e1c6..0c1739a3c0ed7089cc206e1cecebdac9218af788 100644
(file)
--- a/
src/vm/class.cpp
+++ b/
src/vm/class.cpp
@@
-1499,32
+1499,33
@@
bool class_isanysubclass(classinfo *sub, classinfo *super)
bool class_is_arraycompatible(arraydescriptor *desc, arraydescriptor *target)
{
if (desc == target)
bool class_is_arraycompatible(arraydescriptor *desc, arraydescriptor *target)
{
if (desc == target)
- return
1
;
+ return
true
;
if (desc->arraytype != target->arraytype)
if (desc->arraytype != target->arraytype)
- return
0
;
+ return
false
;
if (desc->arraytype != ARRAYTYPE_OBJECT)
if (desc->arraytype != ARRAYTYPE_OBJECT)
- return
1
;
+ return
true
;
/* {both arrays are arrays of references} */
if (desc->dimension == target->dimension) {
if (!desc->elementvftbl)
/* {both arrays are arrays of references} */
if (desc->dimension == target->dimension) {
if (!desc->elementvftbl)
- return 0;
+ return false;
+
/* an array which contains elements of interface types is
/* an array which contains elements of interface types is
-
allowed to be casted to Object (JOWENN)
*/
+
allowed to be casted to array of Object (JOWENN)
*/
if ((desc->elementvftbl->baseval < 0) &&
(target->elementvftbl->baseval == 1))
if ((desc->elementvftbl->baseval < 0) &&
(target->elementvftbl->baseval == 1))
- return
1
;
+ return
true
;
return class_isanysubclass(desc->elementvftbl->clazz,
target->elementvftbl->clazz);
}
if (desc->dimension < target->dimension)
return class_isanysubclass(desc->elementvftbl->clazz,
target->elementvftbl->clazz);
}
if (desc->dimension < target->dimension)
- return
0
;
+ return
false
;
/* {desc has higher dimension than target} */
/* {desc has higher dimension than target} */
@@
-1560,7
+1561,7
@@
bool class_is_assignable_from(classinfo *to, classinfo *from)
/* Decide whether we are dealing with array types or object types. */
/* Decide whether we are dealing with array types or object types. */
- if (class_is_array(to))
+ if (class_is_array(to)
&& class_is_array(from)
)
return class_is_arraycompatible(from->vftbl->arraydesc, to->vftbl->arraydesc);
else
return class_isanysubclass(from, to);
return class_is_arraycompatible(from->vftbl->arraydesc, to->vftbl->arraydesc);
else
return class_isanysubclass(from, to);