Browse Source

* refactored isstringconv/isrecordconv
* fixed checking of array element compatibility (also have to check
for both strings/records)

git-svn-id: branches/jvmbackend@18541 -

Jonas Maebe 14 years ago
parent
commit
1c1fe26ebd
1 changed files with 35 additions and 35 deletions
  1. 35 35
      compiler/jvm/njvmcnv.pas

+ 35 - 35
compiler/jvm/njvmcnv.pas

@@ -646,59 +646,58 @@ implementation
     *****************************************************************************}
     *****************************************************************************}
 
 
   function asis_target_specific_typecheck(node: tasisnode): boolean;
   function asis_target_specific_typecheck(node: tasisnode): boolean;
-    var
-      fromelt, toelt: tdef;
-      realfromdef,
-      realtodef: tdef;
 
 
-    function isrecordconv(var res: boolean): boolean;
+    function isrecordconv(fromdef, todef: tdef): boolean;
       begin
       begin
-        if is_record(realtodef) then
+        if is_record(todef) then
           begin
           begin
-            result:=true;
-            res:=
-              (realfromdef=java_jlobject) or
-              (realfromdef=java_fpcbaserecordtype);
+            result:=
+              (fromdef=java_jlobject) or
+              (fromdef=java_fpcbaserecordtype);
           end
           end
-        else if is_record(realfromdef) then
+        else if is_record(fromdef) then
           begin
           begin
-            result:=true;
-            res:=
-              (realtodef=java_jlobject) or
-              (realtodef=java_fpcbaserecordtype)
+            result:=
+              (todef=java_jlobject) or
+              (todef=java_fpcbaserecordtype)
           end
           end
         else
         else
           result:=false;
           result:=false;
       end;
       end;
 
 
-    function isstringconv(var res: boolean): boolean;
+    function isstringconv(fromdef, todef: tdef): boolean;
       begin
       begin
-        if is_wide_or_unicode_string(realtodef) then
+        if is_wide_or_unicode_string(todef) then
           begin
           begin
-            result:=true;
-            res:=
-              (realfromdef=java_jlobject) or
-              (realfromdef=java_jlstring)
+            result:=
+              (fromdef=java_jlobject) or
+              (fromdef=java_jlstring)
           end
           end
-        else if is_wide_or_unicode_string(realfromdef) then
+        else if is_wide_or_unicode_string(fromdef) then
           begin
           begin
-            result:=true;
-            res:=
-              (realtodef=java_jlobject) or
-              (realtodef=java_jlstring)
+            result:=
+              (todef=java_jlobject) or
+              (todef=java_jlstring)
           end
           end
         else
         else
           result:=false;
           result:=false;
       end;
       end;
 
 
+
+    var
+      fromelt, toelt: tdef;
+      realfromdef,
+      realtodef: tdef;
     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
-         not isstringconv(result) then
+      result:=isrecordconv(realfromdef,realtodef);
+      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:=
-               (compare_defs(fromelt,toelt,node.left.nodetype) in [te_exact,te_equal]) or
-               (((fromelt.typ=objectdef) or
-                 (fromelt.typ=arraydef)) and
-                ((toelt.typ=objectdef) or
-                 (toelt.typ=arraydef)));
+            result:=
+             isrecordconv(fromelt,toelt) or
+             isstringconv(fromelt,toelt) or
+             (compare_defs(fromelt,toelt,node.left.nodetype) in [te_exact,te_equal]) or
+             (((fromelt.typ=objectdef) or
+               (fromelt.typ=arraydef)) and
+              ((toelt.typ=objectdef) or
+               (toelt.typ=arraydef)));
           end
           end
         else
         else
           begin
           begin