|
@@ -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
|