Browse Source

fcl-passrc: resolver: length(simple const array)

git-svn-id: trunk@37693 -
Mattias Gaertner 7 years ago
parent
commit
bfcda2af79
1 changed files with 24 additions and 6 deletions
  1. 24 6
      packages/fcl-passrc/src/pasresolver.pp

+ 24 - 6
packages/fcl-passrc/src/pasresolver.pp

@@ -172,7 +172,6 @@ ToDo:
    - function: enumerator
    - function: enumerator
    - class
    - class
    - operator
    - operator
-- parser: TPasParser.ParseProcedureOrFunctionHeader skip searching proc
 - range checking:
 - range checking:
   - indexedprop[param]
   - indexedprop[param]
   - case-of unique
   - case-of unique
@@ -8521,7 +8520,7 @@ end;
 procedure TPasResolver.BI_Length_OnEval(Proc: TResElDataBuiltInProc;
 procedure TPasResolver.BI_Length_OnEval(Proc: TResElDataBuiltInProc;
   Params: TParamsExpr; Flags: TResEvalFlags; out Evaluated: TResEvalValue);
   Params: TParamsExpr; Flags: TResEvalFlags; out Evaluated: TResEvalValue);
 var
 var
-  Param: TPasExpr;
+  Param, Expr: TPasExpr;
   ParamResolved: TPasResolverResult;
   ParamResolved: TPasResolverResult;
   Value: TResEvalValue;
   Value: TResEvalValue;
   Ranges: TPasExprArray;
   Ranges: TPasExprArray;
@@ -8551,9 +8550,21 @@ begin
       begin
       begin
       Ranges:=TPasArrayType(ParamResolved.TypeEl).Ranges;
       Ranges:=TPasArrayType(ParamResolved.TypeEl).Ranges;
       if length(Ranges)=0 then
       if length(Ranges)=0 then
-        exit;
-      // static array
-      Evaluated:=TResEvalInt.CreateValue(GetRangeLength(Ranges[0]));
+        begin
+        // open or dynamic array
+        if (ParamResolved.IdentEl is TPasVariable)
+            and (TPasVariable(ParamResolved.IdentEl).Expr is TPasExpr) then
+          begin
+          Expr:=TPasVariable(ParamResolved.IdentEl).Expr;
+          if Expr is TArrayValues then
+            Evaluated:=TResEvalInt.CreateValue(length(TArrayValues(Expr).Values));
+          end;
+        end
+      else
+        begin
+        // static array
+        Evaluated:=TResEvalInt.CreateValue(GetRangeLength(Ranges[0]));
+        end;
       end;
       end;
     end;
     end;
   if Proc=nil then ;
   if Proc=nil then ;
@@ -9124,6 +9135,7 @@ var
   bt: TResolverBaseType;
   bt: TResolverBaseType;
   MinInt, MaxInt: int64;
   MinInt, MaxInt: int64;
   i: Integer;
   i: Integer;
+  Expr: TPasExpr;
 begin
 begin
   Evaluated:=nil;
   Evaluated:=nil;
   Param:=Params.Params[0];
   Param:=Params.Params[0];
@@ -9142,7 +9154,13 @@ begin
           Evaluated:=TResEvalInt.CreateValue(0)
           Evaluated:=TResEvalInt.CreateValue(0)
         else if (ParamResolved.IdentEl is TPasVariable)
         else if (ParamResolved.IdentEl is TPasVariable)
             and (TPasVariable(ParamResolved.IdentEl).Expr is TPasExpr) then
             and (TPasVariable(ParamResolved.IdentEl).Expr is TPasExpr) then
-          RaiseNotYetImplemented(20170601191003,Params)
+          begin
+          Expr:=TPasVariable(ParamResolved.IdentEl).Expr;
+          if Expr is TArrayValues then
+            Evaluated:=TResEvalInt.CreateValue(length(TArrayValues(Expr).Values)-1);
+          if Evaluated=nil then
+            RaiseNotYetImplemented(20170601191003,Params);
+          end
         else
         else
           exit;
           exit;
         end
         end