mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 13:49:39 +02:00
* refactored isstringconv/isrecordconv
* fixed checking of array element compatibility (also have to check for both strings/records) git-svn-id: branches/jvmbackend@18541 -
This commit is contained in:
parent
8ec1ba797d
commit
1c1fe26ebd
@ -646,59 +646,58 @@ implementation
|
|||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
|
|
||||||
function asis_target_specific_typecheck(node: tasisnode): boolean;
|
function asis_target_specific_typecheck(node: tasisnode): boolean;
|
||||||
|
|
||||||
|
function isrecordconv(fromdef, todef: tdef): boolean;
|
||||||
|
begin
|
||||||
|
if is_record(todef) then
|
||||||
|
begin
|
||||||
|
result:=
|
||||||
|
(fromdef=java_jlobject) or
|
||||||
|
(fromdef=java_fpcbaserecordtype);
|
||||||
|
end
|
||||||
|
else if is_record(fromdef) then
|
||||||
|
begin
|
||||||
|
result:=
|
||||||
|
(todef=java_jlobject) or
|
||||||
|
(todef=java_fpcbaserecordtype)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
result:=false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function isstringconv(fromdef, todef: tdef): boolean;
|
||||||
|
begin
|
||||||
|
if is_wide_or_unicode_string(todef) then
|
||||||
|
begin
|
||||||
|
result:=
|
||||||
|
(fromdef=java_jlobject) or
|
||||||
|
(fromdef=java_jlstring)
|
||||||
|
end
|
||||||
|
else if is_wide_or_unicode_string(fromdef) then
|
||||||
|
begin
|
||||||
|
result:=
|
||||||
|
(todef=java_jlobject) or
|
||||||
|
(todef=java_jlstring)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
result:=false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
var
|
var
|
||||||
fromelt, toelt: tdef;
|
fromelt, toelt: tdef;
|
||||||
realfromdef,
|
realfromdef,
|
||||||
realtodef: tdef;
|
realtodef: tdef;
|
||||||
|
|
||||||
function isrecordconv(var res: boolean): boolean;
|
|
||||||
begin
|
|
||||||
if is_record(realtodef) then
|
|
||||||
begin
|
|
||||||
result:=true;
|
|
||||||
res:=
|
|
||||||
(realfromdef=java_jlobject) or
|
|
||||||
(realfromdef=java_fpcbaserecordtype);
|
|
||||||
end
|
|
||||||
else if is_record(realfromdef) then
|
|
||||||
begin
|
|
||||||
result:=true;
|
|
||||||
res:=
|
|
||||||
(realtodef=java_jlobject) or
|
|
||||||
(realtodef=java_fpcbaserecordtype)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
result:=false;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function isstringconv(var res: boolean): boolean;
|
|
||||||
begin
|
|
||||||
if is_wide_or_unicode_string(realtodef) then
|
|
||||||
begin
|
|
||||||
result:=true;
|
|
||||||
res:=
|
|
||||||
(realfromdef=java_jlobject) or
|
|
||||||
(realfromdef=java_jlstring)
|
|
||||||
end
|
|
||||||
else if is_wide_or_unicode_string(realfromdef) then
|
|
||||||
begin
|
|
||||||
result:=true;
|
|
||||||
res:=
|
|
||||||
(realtodef=java_jlobject) or
|
|
||||||
(realtodef=java_jlstring)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
result:=false;
|
|
||||||
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) and
|
result:=isrecordconv(realfromdef,realtodef);
|
||||||
not isstringconv(result) then
|
if not result then
|
||||||
|
result:=isstringconv(realfromdef,realtodef);
|
||||||
|
if not result then
|
||||||
{ dynamic arrays can be converted to java.lang.Object and vice versa }
|
{ dynamic arrays can be converted to java.lang.Object and vice versa }
|
||||||
if realtodef=java_jlobject then
|
if realtodef=java_jlobject then
|
||||||
{ dynamic array to java.lang.Object }
|
{ dynamic array to java.lang.Object }
|
||||||
@ -714,13 +713,14 @@ implementation
|
|||||||
or
|
or
|
||||||
b) the same primitive/class type
|
b) the same primitive/class type
|
||||||
}
|
}
|
||||||
if not isrecordconv(result) then
|
result:=
|
||||||
result:=
|
isrecordconv(fromelt,toelt) or
|
||||||
(compare_defs(fromelt,toelt,node.left.nodetype) in [te_exact,te_equal]) or
|
isstringconv(fromelt,toelt) or
|
||||||
(((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