mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-01 07:10:20 +02:00
* fixed typecasting checks from/to arrays of records
git-svn-id: branches/jvmbackend@18508 -
This commit is contained in:
parent
739c654e3a
commit
3259eae110
@ -479,7 +479,7 @@ implementation
|
|||||||
get_most_nested_types(fromdef,todef);
|
get_most_nested_types(fromdef,todef);
|
||||||
fromarrtype:=jvmarrtype_setlength(fromdef);
|
fromarrtype:=jvmarrtype_setlength(fromdef);
|
||||||
toarrtype:=jvmarrtype_setlength(todef);
|
toarrtype:=jvmarrtype_setlength(todef);
|
||||||
if not left.resultdef.is_related(resultdef) and
|
if not fromdef.is_related(todef) and
|
||||||
(((fromdef.typ<>objectdef) and
|
(((fromdef.typ<>objectdef) and
|
||||||
not is_dynamic_array(fromdef)) or
|
not is_dynamic_array(fromdef)) or
|
||||||
(todef<>java_jlobject)) and
|
(todef<>java_jlobject)) and
|
||||||
@ -576,23 +576,29 @@ implementation
|
|||||||
fromelt, toelt: tdef;
|
fromelt, toelt: tdef;
|
||||||
realfromdef,
|
realfromdef,
|
||||||
realtodef: tdef;
|
realtodef: tdef;
|
||||||
|
|
||||||
|
function isrecordconv(var res: boolean): boolean;
|
||||||
|
begin
|
||||||
|
if is_record(realtodef) then
|
||||||
|
result:=
|
||||||
|
(realfromdef=java_jlobject) or
|
||||||
|
(realfromdef=java_fpcbaserecordtype)
|
||||||
|
else if is_record(realfromdef) then
|
||||||
|
result:=
|
||||||
|
(realtodef=java_jlobject) or
|
||||||
|
(realtodef=java_fpcbaserecordtype)
|
||||||
|
else
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
realfromdef:=maybe_find_real_class_definition(node.left.resultdef,false);
|
realfromdef:=maybe_find_real_class_definition(node.left.resultdef,false);
|
||||||
realtodef:=node.right.resultdef;
|
realtodef:=node.right.resultdef;
|
||||||
if realtodef.typ=classrefdef then
|
if realtodef.typ=classrefdef then
|
||||||
realtodef:=tclassrefdef(realtodef).pointeddef;
|
realtodef:=tclassrefdef(realtodef).pointeddef;
|
||||||
realtodef:=maybe_find_real_class_definition(realtodef,false);
|
realtodef:=maybe_find_real_class_definition(realtodef,false);
|
||||||
|
if not isrecordconv(result) then
|
||||||
if is_record(realtodef) then
|
|
||||||
result:=
|
|
||||||
(realfromdef=java_jlobject) or
|
|
||||||
(realfromdef=java_fpcbaserecordtype)
|
|
||||||
else if is_record(realfromdef) then
|
|
||||||
result:=
|
|
||||||
(realtodef=java_jlobject) or
|
|
||||||
(realtodef=java_fpcbaserecordtype)
|
|
||||||
{ dynamic arrays can be converted to java.lang.Object and vice versa }
|
{ dynamic arrays can be converted to java.lang.Object and vice versa }
|
||||||
else if realtodef=java_jlobject then
|
if realtodef=java_jlobject then
|
||||||
{ dynamic array to java.lang.Object }
|
{ dynamic array to java.lang.Object }
|
||||||
result:=is_dynamic_array(realfromdef)
|
result:=is_dynamic_array(realfromdef)
|
||||||
else if is_dynamic_array(realtodef) then
|
else if is_dynamic_array(realtodef) then
|
||||||
@ -606,12 +612,13 @@ implementation
|
|||||||
or
|
or
|
||||||
b) the same primitive/class type
|
b) the same primitive/class type
|
||||||
}
|
}
|
||||||
result:=
|
if not isrecordconv(result) then
|
||||||
(compare_defs(fromelt,toelt,node.left.nodetype) in [te_exact,te_equal]) or
|
result:=
|
||||||
(((fromelt.typ=objectdef) or
|
(compare_defs(fromelt,toelt,node.left.nodetype) in [te_exact,te_equal]) or
|
||||||
(fromelt.typ=arraydef)) and
|
(((fromelt.typ=objectdef) or
|
||||||
((toelt.typ=objectdef) or
|
(fromelt.typ=arraydef)) and
|
||||||
(toelt.typ=arraydef)));
|
((toelt.typ=objectdef) or
|
||||||
|
(toelt.typ=arraydef)));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user