Prechádzať zdrojové kódy

+ mark method pointers as regable

git-svn-id: trunk@22337 -
florian 13 rokov pred
rodič
commit
7901662eb3
3 zmenil súbory, kde vykonal 13 pridanie a 2 odobranie
  1. 10 0
      compiler/defutil.pas
  2. 2 1
      compiler/ncgutil.pas
  3. 1 1
      compiler/symdef.pas

+ 10 - 0
compiler/defutil.pas

@@ -280,6 +280,9 @@ interface
     { # returns whether def is a type parameter of a generic }
     function is_typeparam(def : tdef) : boolean;{$ifdef USEINLINE}inline;{$endif}
 
+    { returns true of def is a methodpointer }
+    function is_methodpointer(def : tdef) : boolean;
+
 implementation
 
     uses
@@ -1192,4 +1195,11 @@ implementation
       begin
         result:=(def.typ=undefineddef);
       end;
+
+
+    function is_methodpointer(def: tdef): boolean;
+      begin
+        result:=(def.typ=procvardef) and (po_methodpointer in tprocvardef(def).procoptions);
+      end;
+
 end.

+ 2 - 1
compiler/ncgutil.pas

@@ -902,7 +902,8 @@ implementation
                  (is_64bit(vardef) or
                   { in case of fpu emulation, or abi's that pass fpu values
                     via integer registers }
-                  (vardef.typ=floatdef)) then
+                  (vardef.typ=floatdef) or
+                   is_methodpointer(vardef)) then
                 begin
                   case paraloc^.loc of
                     LOC_REGISTER:

+ 1 - 1
compiler/symdef.pas

@@ -1592,7 +1592,7 @@ implementation
           classrefdef:
             is_intregable:=true;
           procvardef :
-            is_intregable:=tprocvardef(self).is_addressonly;
+            is_intregable:=tprocvardef(self).is_addressonly or (po_methodpointer in tprocvardef(self).procoptions);
           objectdef:
             is_intregable:=(is_implicit_pointer_object_type(self)) and not needs_inittable;
           setdef: