Browse Source

fcl-passrc: useanalyzer: inline specialize

git-svn-id: trunk@42819 -
Mattias Gaertner 6 years ago
parent
commit
2a394402aa
1 changed files with 36 additions and 20 deletions
  1. 36 20
      packages/fcl-passrc/src/pasuseanalyzer.pas

+ 36 - 20
packages/fcl-passrc/src/pasuseanalyzer.pas

@@ -1025,7 +1025,7 @@ begin
     if ((El.GenericTemplateTypes<>nil) and (El.GenericTemplateTypes.Count>0)) then
       // generic template -> analyze
     else if not Resolver.IsFullySpecialized(El) then
-      // specialized -> skip
+      // half specialized -> skip
       exit(true);
     end;
 end;
@@ -1503,6 +1503,34 @@ begin
 end;
 
 procedure TPasAnalyzer.UseExpr(El: TPasExpr);
+
+  procedure UseSystemExit;
+  var
+    ParamsExpr: TParamsExpr;
+    Params: TPasExprArray;
+    SubEl: TPasElement;
+    Proc: TPasProcedure;
+    ProcScope: TPasProcedureScope;
+  begin
+    ParamsExpr:=Resolver.GetParamsOfNameExpr(El);
+    if ParamsExpr=nil then exit;
+    Params:=ParamsExpr.Params;
+    if length(Params)<1 then
+      exit;
+    SubEl:=El.Parent;
+    while (SubEl<>nil) and not (SubEl is TPasProcedure) do
+      SubEl:=SubEl.Parent;
+    if SubEl=nil then exit;
+    Proc:=TPasProcedure(SubEl);
+    if not (Proc.ProcType is TPasFunctionType) then
+      RaiseNotSupported(20190825203504,El);
+    ProcScope:=Proc.CustomData as TPasProcedureScope;
+    if ProcScope.DeclarationProc<>nil then
+      Proc:=ProcScope.DeclarationProc;
+    SubEl:=TPasFunctionType(Proc.ProcType).ResultEl;
+    UseElement(SubEl,rraAssign,false);
+  end;
+
 var
   Ref: TResolvedReference;
   C: TClass;
@@ -1566,25 +1594,7 @@ begin
         BuiltInProc:=TResElDataBuiltInProc(Decl.CustomData);
         case BuiltInProc.BuiltIn of
         bfExit:
-          begin
-          ParamsExpr:=Resolver.GetParamsOfNameExpr(El);
-          if ParamsExpr<>nil then
-            begin
-            Params:=(El.Parent as TParamsExpr).Params;
-            if length(Params)=1 then
-              begin
-              SubEl:=El.Parent;
-              while (SubEl<>nil) and not (SubEl is TPasProcedure) do
-                SubEl:=SubEl.Parent;
-              if (SubEl is TPasProcedure)
-                  and (TPasProcedure(SubEl).ProcType is TPasFunctionType) then
-                begin
-                SubEl:=TPasFunctionType(TPasProcedure(SubEl).ProcType).ResultEl;
-                UseElement(SubEl,rraAssign,false);
-                end;
-              end;
-            end;
-          end;
+          UseSystemExit;
         bfTypeInfo:
           begin
           ParamsExpr:=Resolver.GetParamsOfNameExpr(El);
@@ -1663,6 +1673,8 @@ begin
     UseInheritedExpr(TInheritedExpr(El))
   else if C=TProcedureExpr then
     UseProcedure(TProcedureExpr(El).Proc)
+  else if C=TInlineSpecializeExpr then
+    UseSpecializeType(TInlineSpecializeExpr(El).DestType,paumElement)
   else
     RaiseNotSupported(20170307085444,El);
 end;
@@ -2684,6 +2696,10 @@ begin
     ImplProc:=El
   else
     ImplProc:=ProcScope.ImplProc;
+  if (ProcScope.ClassRecScope<>nil)
+      and (ProcScope.ClassRecScope.SpecializedItem<>nil) then
+    exit; // specialized proc
+
   if not PAElementExists(DeclProc) then
     begin
     // procedure never used