Pārlūkot izejas kodu

+ added extra parameter to jvmgetboxtype() to indicate whether all integer
types should be mapped onto jllong or rather onto the closes matching type

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

Jonas Maebe 14 gadi atpakaļ
vecāks
revīzija
834f8da885
2 mainītis faili ar 49 papildinājumiem un 28 dzēšanām
  1. 2 2
      compiler/jvm/njvminl.pas
  2. 47 26
      compiler/jvmdef.pas

+ 2 - 2
compiler/jvm/njvminl.pas

@@ -243,7 +243,7 @@ implementation
         boxparadef: tdef;
       begin
         { get class wrapper type }
-        jvmgetboxtype(left.resultdef,boxdef,boxparadef);
+        jvmgetboxtype(left.resultdef,boxdef,boxparadef,true);
         { created wrapped instance }
         inserttypeconv_explicit(tcallparanode(left).left,boxparadef);
         result:=ccallnode.createinternmethod(
@@ -259,7 +259,7 @@ implementation
         boxdef,
         boxparadef: tdef;
       begin
-        jvmgetboxtype(resultdef,boxdef,boxparadef);
+        jvmgetboxtype(resultdef,boxdef,boxparadef,true);
         val:=tcallparanode(tcallparanode(left).right).left;
         tcallparanode(tcallparanode(left).right).left:=nil;
         { typecast to the boxing type }

+ 47 - 26
compiler/jvmdef.pas

@@ -76,7 +76,7 @@ interface
 
     { sometimes primitive types have to be boxed/unboxed via class types. This
       routine returns the appropriate box type for the passed primitive type }
-    procedure jvmgetboxtype(def: tdef; out objdef, paradef: tdef);
+    procedure jvmgetboxtype(def: tdef; out objdef, paradef: tdef; mergeints: boolean);
     function jvmgetunboxmethod(def: tdef): string;
 
 implementation
@@ -498,13 +498,17 @@ implementation
             result:=is_object(def);
           stringdef :
             result:=tstringdef(def).stringtype in [st_shortstring,st_longstring];
+          procvardef:
+            result:=not tprocvardef(def).is_addressonly;
           else
             result:=false;
         end;
       end;
 
 
-    procedure jvmgetboxtype(def: tdef; out objdef, paradef: tdef);
+    { mergeints = true means that all integer types are mapped to jllong,
+      otherwise they are mapped to the closest corresponding type }
+    procedure jvmgetboxtype(def: tdef; out objdef, paradef: tdef; mergeints: boolean);
       begin
         case def.typ of
           orddef:
@@ -515,36 +519,53 @@ implementation
                     objdef:=tobjectdef(search_system_type('JLBOOLEAN').typedef);
                     paradef:=pasbool8type;
                   end;
-                { wrap all integer types into a JLLONG, so that we don't get
-                  errors after returning a byte assigned to a long etc }
-                s8bit,
-                u8bit,
-                uchar,
-                bool8bit,
-                s16bit,
-                u16bit,
-                bool16bit,
-                pasbool16,
-                s32bit,
-                u32bit,
-                bool32bit,
-                pasbool32,
-                s64bit,
-                u64bit,
-                scurrency,
-                bool64bit,
-                pasbool64:
-                  begin
-                    objdef:=tobjectdef(search_system_type('JLLONG').typedef);
-                    paradef:=s64inttype;
-                  end;
                 uwidechar:
                   begin
                     objdef:=tobjectdef(search_system_type('JLCHARACTER').typedef);
                     paradef:=cwidechartype;
                   end;
                 else
-                  internalerror(2011052101);
+                  begin
+                    { wrap all integer types into a JLLONG, so that we don't get
+                      errors after returning a byte assigned to a long etc }
+                    if mergeints or
+                       (torddef(def).ordtype in [s64bit,u64bit,scurrency,bool64bit,pasbool64]) then
+                      begin
+                        objdef:=tobjectdef(search_system_type('JLLONG').typedef);
+                        paradef:=s64inttype;
+                      end
+                    else
+                      begin
+                        case torddef(def).ordtype of
+                          s8bit,
+                          u8bit,
+                          uchar,
+                          bool8bit:
+                            begin
+                              objdef:=tobjectdef(search_system_type('JLBYTE').typedef);
+                              paradef:=s8inttype;
+                            end;
+                          s16bit,
+                          u16bit,
+                          bool16bit,
+                          pasbool16:
+                            begin
+                              objdef:=tobjectdef(search_system_type('JLSHORT').typedef);
+                              paradef:=s16inttype;
+                            end;
+                          s32bit,
+                          u32bit,
+                          bool32bit,
+                          pasbool32:
+                            begin
+                              objdef:=tobjectdef(search_system_type('JLINTEGER').typedef);
+                              paradef:=s32inttype;
+                            end;
+                          else
+                            internalerror(2011052101);
+                        end;
+                      end;
+                  end;
               end;
             end;
           floatdef: