|
@@ -565,6 +565,7 @@ type
|
|
pbifnArray_Copy,
|
|
pbifnArray_Copy,
|
|
pbifnArray_Equal,
|
|
pbifnArray_Equal,
|
|
pbifnArray_Length,
|
|
pbifnArray_Length,
|
|
|
|
+ pbifnArray_Reference,
|
|
pbifnArray_SetLength,
|
|
pbifnArray_SetLength,
|
|
pbifnArray_Static_Clone,
|
|
pbifnArray_Static_Clone,
|
|
pbifnAs,
|
|
pbifnAs,
|
|
@@ -729,6 +730,7 @@ const
|
|
'arrayCopy', // rtl.arrayCopy
|
|
'arrayCopy', // rtl.arrayCopy
|
|
'arrayEq', // rtl.arrayEq
|
|
'arrayEq', // rtl.arrayEq
|
|
'length', // rtl.length
|
|
'length', // rtl.length
|
|
|
|
+ 'arrayRef', // rtl.arrayRef pbifnArray_Reference
|
|
'arraySetLength', // rtl.arraySetLength
|
|
'arraySetLength', // rtl.arraySetLength
|
|
'$clone',
|
|
'$clone',
|
|
'as', // rtl.as
|
|
'as', // rtl.as
|
|
@@ -1409,6 +1411,10 @@ type
|
|
procedure AddElementData(Data: TPas2JsElementData); virtual;
|
|
procedure AddElementData(Data: TPas2JsElementData); virtual;
|
|
function CreateElementData(DataClass: TPas2JsElementDataClass;
|
|
function CreateElementData(DataClass: TPas2JsElementDataClass;
|
|
El: TPasElement): TPas2JsElementData; virtual;
|
|
El: TPasElement): TPas2JsElementData; virtual;
|
|
|
|
+ // checking compatibilility
|
|
|
|
+ function CheckEqualCompatibilityUserType(const LHS,
|
|
|
|
+ RHS: TPasResolverResult; ErrorEl: TPasElement;
|
|
|
|
+ RaiseOnIncompatible: boolean): integer; override;
|
|
// utility
|
|
// utility
|
|
procedure RaiseMsg(const Id: TMaxPrecInt; MsgNumber: integer; const Fmt: String;
|
|
procedure RaiseMsg(const Id: TMaxPrecInt; MsgNumber: integer; const Fmt: String;
|
|
Args: array of {$IFDEF pas2js}jsvalue{$ELSE}const{$ENDIF}; ErrorPosEl: TPasElement); override;
|
|
Args: array of {$IFDEF pas2js}jsvalue{$ELSE}const{$ENDIF}; ErrorPosEl: TPasElement); override;
|
|
@@ -1710,6 +1716,8 @@ type
|
|
Function IsSystemUnit(aModule: TPasModule): boolean; virtual;
|
|
Function IsSystemUnit(aModule: TPasModule): boolean; virtual;
|
|
Function HasTypeInfo(El: TPasType; AContext: TConvertContext): boolean; virtual;
|
|
Function HasTypeInfo(El: TPasType; AContext: TConvertContext): boolean; virtual;
|
|
Function IsClassRTTICreatedBefore(aClass: TPasClassType; Before: TPasElement; AConText: TConvertContext): boolean;
|
|
Function IsClassRTTICreatedBefore(aClass: TPasClassType; Before: TPasElement; AConText: TConvertContext): boolean;
|
|
|
|
+ Function IsExprTemporaryVar(Expr: TPasExpr): boolean; virtual;
|
|
|
|
+ Function IsExprPropertySetterConst(Expr: TPasExpr; AContext: TConvertContext): boolean; virtual;
|
|
Procedure FindAvailableLocalName(var aName: string; JSExpr: TJSElement);
|
|
Procedure FindAvailableLocalName(var aName: string; JSExpr: TJSElement);
|
|
Function GetImplJSProcScope(El: TPasElement; Src: TJSSourceElements;
|
|
Function GetImplJSProcScope(El: TPasElement; Src: TJSSourceElements;
|
|
AContext: TConvertContext): TPas2JSProcedureScope;
|
|
AContext: TConvertContext): TPas2JSProcedureScope;
|
|
@@ -1803,6 +1811,7 @@ type
|
|
AContext: TConvertContext): TJSCallExpression; overload; virtual;
|
|
AContext: TConvertContext): TJSCallExpression; overload; virtual;
|
|
Function CreateArrayInit(ArrayType: TPasArrayType; Expr: TPasExpr;
|
|
Function CreateArrayInit(ArrayType: TPasArrayType; Expr: TPasExpr;
|
|
El: TPasElement; AContext: TConvertContext): TJSElement; virtual;
|
|
El: TPasElement; AContext: TConvertContext): TJSElement; virtual;
|
|
|
|
+ Function CreateArrayRef(El: TPasElement; ArrayExpr: TJSElement): TJSElement; virtual;
|
|
Function CreateCmpArrayWithNil(El: TPasElement; JSArray: TJSElement;
|
|
Function CreateCmpArrayWithNil(El: TPasElement; JSArray: TJSElement;
|
|
OpCode: TExprOpCode): TJSElement; virtual;
|
|
OpCode: TExprOpCode): TJSElement; virtual;
|
|
Function CreateCloneStaticArray(El: TPasElement; ArrTypeEl: TPasArrayType;
|
|
Function CreateCloneStaticArray(El: TPasElement; ArrTypeEl: TPasArrayType;
|
|
@@ -5469,6 +5478,20 @@ begin
|
|
AddElementData(Result);
|
|
AddElementData(Result);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+function TPas2JSResolver.CheckEqualCompatibilityUserType(const LHS,
|
|
|
|
+ RHS: TPasResolverResult; ErrorEl: TPasElement; RaiseOnIncompatible: boolean
|
|
|
|
+ ): integer;
|
|
|
|
+begin
|
|
|
|
+ Result:=inherited CheckEqualCompatibilityUserType(LHS,RHS,ErrorEl,RaiseOnIncompatible);
|
|
|
|
+ if Result=cIncompatible then exit;
|
|
|
|
+ if (LHS.LoTypeEl is TPasArrayType)
|
|
|
|
+ and (length(TPasArrayType(LHS.LoTypeEl).Ranges)>0) then
|
|
|
|
+ RaiseMsg(20200508103543,nXIsNotSupported,sXIsNotSupported,['compare static array'],ErrorEl);
|
|
|
|
+ if (RHS.LoTypeEl is TPasArrayType)
|
|
|
|
+ and (length(TPasArrayType(RHS.LoTypeEl).Ranges)>0) then
|
|
|
|
+ RaiseMsg(20200508103544,nXIsNotSupported,sXIsNotSupported,['compare static array'],ErrorEl);
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure TPas2JSResolver.RaiseMsg(const Id: TMaxPrecInt; MsgNumber: integer;
|
|
procedure TPas2JSResolver.RaiseMsg(const Id: TMaxPrecInt; MsgNumber: integer;
|
|
const Fmt: String; Args: array of {$IFDEF pas2js}jsvalue{$ELSE}const{$ENDIF};
|
|
const Fmt: String; Args: array of {$IFDEF pas2js}jsvalue{$ELSE}const{$ENDIF};
|
|
ErrorPosEl: TPasElement);
|
|
ErrorPosEl: TPasElement);
|
|
@@ -7127,6 +7150,7 @@ var
|
|
JSBinClass: TJSBinaryClass;
|
|
JSBinClass: TJSBinaryClass;
|
|
ResolvedEl: TPasResolverResult;
|
|
ResolvedEl: TPasResolverResult;
|
|
AInt, BInt: TMaxPrecInt;
|
|
AInt, BInt: TMaxPrecInt;
|
|
|
|
+ LArrType: TPasArrayType;
|
|
begin
|
|
begin
|
|
{$IFDEF VerbosePas2JS}
|
|
{$IFDEF VerbosePas2JS}
|
|
writeln('TPasToJSConverter.ConvertBinaryExpressionRes OpCode="',OpcodeStrings[El.OpCode],'" Left=',GetResolverResultDbg(LeftResolved),' Right=',GetResolverResultDbg(RightResolved));
|
|
writeln('TPasToJSConverter.ConvertBinaryExpressionRes OpCode="',OpcodeStrings[El.OpCode],'" Left=',GetResolverResultDbg(LeftResolved),' Right=',GetResolverResultDbg(RightResolved));
|
|
@@ -7648,6 +7672,7 @@ begin
|
|
end
|
|
end
|
|
else if LeftTypeEl.ClassType=TPasArrayType then
|
|
else if LeftTypeEl.ClassType=TPasArrayType then
|
|
begin
|
|
begin
|
|
|
|
+ LArrType:=TPasArrayType(LeftTypeEl);
|
|
if RightResolved.BaseType=btNil then
|
|
if RightResolved.BaseType=btNil then
|
|
begin
|
|
begin
|
|
// convert "array = nil" to "rtl.length(array) === 0"
|
|
// convert "array = nil" to "rtl.length(array) === 0"
|
|
@@ -7655,6 +7680,11 @@ begin
|
|
Result:=CreateCmpArrayWithNil(El,A,El.OpCode);
|
|
Result:=CreateCmpArrayWithNil(El,A,El.OpCode);
|
|
A:=nil;
|
|
A:=nil;
|
|
exit;
|
|
exit;
|
|
|
|
+ end
|
|
|
|
+ else if length(LArrType.Ranges)>0 then
|
|
|
|
+ begin
|
|
|
|
+ // LHS is static array
|
|
|
|
+ aResolver.RaiseMsg(20200508102656,nXIsNotSupported,sXIsNotSupported,['compare static array'],TPasElement(El));
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
@@ -10640,6 +10670,7 @@ begin
|
|
Call.AddArg(ConvertExpression(El.Params[i],AContext));
|
|
Call.AddArg(ConvertExpression(El.Params[i],AContext));
|
|
if StaticDims<>nil then
|
|
if StaticDims<>nil then
|
|
begin
|
|
begin
|
|
|
|
+ Call.AddArg(CreateLiteralJSString(El,'s'));
|
|
for i:=0 to StaticDims.Count-1 do
|
|
for i:=0 to StaticDims.Count-1 do
|
|
Call.AddArg(TJSElement(StaticDims[i]));
|
|
Call.AddArg(TJSElement(StaticDims[i]));
|
|
StaticDims.OwnsObjects:=false;
|
|
StaticDims.OwnsObjects:=false;
|
|
@@ -15744,6 +15775,17 @@ begin
|
|
RaiseInconsistency(20180617233317,Expr);
|
|
RaiseInconsistency(20180617233317,Expr);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+function TPasToJSConverter.CreateArrayRef(El: TPasElement; ArrayExpr: TJSElement
|
|
|
|
+ ): TJSElement;
|
|
|
|
+var
|
|
|
|
+ Call: TJSCallExpression;
|
|
|
|
+begin
|
|
|
|
+ Call:=CreateCallExpression(El);
|
|
|
|
+ Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnArray_Reference)]);
|
|
|
|
+ Call.AddArg(ArrayExpr);
|
|
|
|
+ Result:=Call;
|
|
|
|
+end;
|
|
|
|
+
|
|
function TPasToJSConverter.CreateCmpArrayWithNil(El: TPasElement;
|
|
function TPasToJSConverter.CreateCmpArrayWithNil(El: TPasElement;
|
|
JSArray: TJSElement; OpCode: TExprOpCode): TJSElement;
|
|
JSArray: TJSElement; OpCode: TExprOpCode): TJSElement;
|
|
// convert "array = nil" to "rtl.length(array) > 0"
|
|
// convert "array = nil" to "rtl.length(array) > 0"
|
|
@@ -18411,6 +18453,9 @@ end;
|
|
|
|
|
|
function TPasToJSConverter.ConvertAssignStatement(El: TPasImplAssign;
|
|
function TPasToJSConverter.ConvertAssignStatement(El: TPasImplAssign;
|
|
AContext: TConvertContext): TJSElement;
|
|
AContext: TConvertContext): TJSElement;
|
|
|
|
+var
|
|
|
|
+ lRightIsTemp, lRightIsTempValid: boolean;
|
|
|
|
+ lLeftIsConstSetter, lLeftIsConstSetterValid: boolean;
|
|
|
|
|
|
procedure NotSupported(AssignContext: TAssignContext; id: TMaxPrecInt);
|
|
procedure NotSupported(AssignContext: TAssignContext; id: TMaxPrecInt);
|
|
begin
|
|
begin
|
|
@@ -18424,6 +18469,28 @@ function TPasToJSConverter.ConvertAssignStatement(El: TPasImplAssign;
|
|
+GetResolverResultDbg(AssignContext.RightResolved));
|
|
+GetResolverResultDbg(AssignContext.RightResolved));
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ function RightIsTemporaryVar: boolean;
|
|
|
|
+ // returns true if right side is a temporary variable, e.g. a function result
|
|
|
|
+ begin
|
|
|
|
+ if not lRightIsTempValid then
|
|
|
|
+ begin
|
|
|
|
+ lRightIsTempValid:=true;
|
|
|
|
+ lRightIsTemp:=IsExprTemporaryVar(El.right);
|
|
|
|
+ end;
|
|
|
|
+ Result:=lRightIsTemp;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ function LeftIsConstSetter: boolean;
|
|
|
|
+ // returns true if left side is a property setter with const argument
|
|
|
|
+ begin
|
|
|
|
+ if not lLeftIsConstSetterValid then
|
|
|
|
+ begin
|
|
|
|
+ lLeftIsConstSetterValid:=true;
|
|
|
|
+ lLeftIsConstSetter:=IsExprPropertySetterConst(El.left,AContext);
|
|
|
|
+ end;
|
|
|
|
+ Result:=lLeftIsConstSetter
|
|
|
|
+ end;
|
|
|
|
+
|
|
function CreateRangeCheck(AssignSt: TJSElement;
|
|
function CreateRangeCheck(AssignSt: TJSElement;
|
|
MinVal, MaxVal: TMaxPrecInt; RTLFunc: TPas2JSBuiltInName): TJSElement;
|
|
MinVal, MaxVal: TMaxPrecInt; RTLFunc: TPas2JSBuiltInName): TJSElement;
|
|
var
|
|
var
|
|
@@ -18494,6 +18561,8 @@ begin
|
|
Result:=nil;
|
|
Result:=nil;
|
|
LHS:=nil;
|
|
LHS:=nil;
|
|
aResolver:=AContext.Resolver;
|
|
aResolver:=AContext.Resolver;
|
|
|
|
+ lLeftIsConstSetterValid:=false;
|
|
|
|
+ lRightIsTempValid:=false;
|
|
AssignContext:=TAssignContext.Create(El,nil,AContext);
|
|
AssignContext:=TAssignContext.Create(El,nil,AContext);
|
|
try
|
|
try
|
|
if aResolver<>nil then
|
|
if aResolver<>nil then
|
|
@@ -18588,11 +18657,29 @@ begin
|
|
if length(TPasArrayType(RightTypeEl).Ranges)>0 then
|
|
if length(TPasArrayType(RightTypeEl).Ranges)>0 then
|
|
begin
|
|
begin
|
|
// right side is a static array -> clone
|
|
// right side is a static array -> clone
|
|
- {$IFDEF VerbosePas2JS}
|
|
|
|
- writeln('TPasToJSConverter.ConvertAssignStatement STATIC ARRAY variable Right={',GetResolverResultDbg(AssignContext.RightResolved),'} AssignContext.RightResolved.IdentEl=',GetObjName(AssignContext.RightResolved.IdentEl));
|
|
|
|
- {$ENDIF}
|
|
|
|
- AssignContext.RightSide:=CreateCloneStaticArray(El.right,
|
|
|
|
- TPasArrayType(RightTypeEl),AssignContext.RightSide,AContext);
|
|
|
|
|
|
+ if (not RightIsTemporaryVar)
|
|
|
|
+ and (not LeftIsConstSetter) then
|
|
|
|
+ begin
|
|
|
|
+ {$IFDEF VerbosePas2JS}
|
|
|
|
+ writeln('TPasToJSConverter.ConvertAssignStatement STATIC ARRAY variable Right={',GetResolverResultDbg(AssignContext.RightResolved),'} AssignContext.RightResolved.IdentEl=',GetObjName(AssignContext.RightResolved.IdentEl));
|
|
|
|
+ {$ENDIF}
|
|
|
|
+ AssignContext.RightSide:=CreateCloneStaticArray(El.right,
|
|
|
|
+ TPasArrayType(RightTypeEl),AssignContext.RightSide,AContext);
|
|
|
|
+ end;
|
|
|
|
+ end
|
|
|
|
+ else if RightTypeEl.Parent.ClassType=TPasArgument then
|
|
|
|
+ // right side is open array
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ // right side is dynamic array
|
|
|
|
+ if (AssignContext.LeftResolved.BaseType=btContext)
|
|
|
|
+ and (AssignContext.LeftResolved.LoTypeEl is TPasArrayType)
|
|
|
|
+ and (not RightIsTemporaryVar)
|
|
|
|
+ and (not LeftIsConstSetter) then
|
|
|
|
+ begin
|
|
|
|
+ // DynArrayA := DynArrayB -> DynArrayA = rtl.arrayRef(DynArrayB)
|
|
|
|
+ AssignContext.RightSide:=CreateArrayRef(El.right,AssignContext.RightSide);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
end
|
|
end
|
|
else if RightTypeEl.ClassType=TPasClassType then
|
|
else if RightTypeEl.ClassType=TPasClassType then
|
|
@@ -19747,6 +19834,69 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+function TPasToJSConverter.IsExprTemporaryVar(Expr: TPasExpr): boolean;
|
|
|
|
+var
|
|
|
|
+ Params: TParamsExpr;
|
|
|
|
+ Ref: TResolvedReference;
|
|
|
|
+ C: TClass;
|
|
|
|
+begin
|
|
|
|
+ if Expr.CustomData is TResolvedReference then
|
|
|
|
+ begin
|
|
|
|
+ Ref:=TResolvedReference(Expr.CustomData);
|
|
|
|
+ if [rrfNewInstance,rrfImplicitCallWithoutParams]*Ref.Flags<>[] then
|
|
|
|
+ exit(true);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ C:=Expr.ClassType;
|
|
|
|
+ if C=TParamsExpr then
|
|
|
|
+ begin
|
|
|
|
+ Params:=TParamsExpr(Expr);
|
|
|
|
+ if Params.Kind=pekFuncParams then
|
|
|
|
+ exit(true);
|
|
|
|
+ end
|
|
|
|
+ else if C.InheritsFrom(TBinaryExpr) then
|
|
|
|
+ exit(true);
|
|
|
|
+
|
|
|
|
+ Result:=false;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TPasToJSConverter.IsExprPropertySetterConst(Expr: TPasExpr;
|
|
|
|
+ AContext: TConvertContext): boolean;
|
|
|
|
+var
|
|
|
|
+ Bin: TBinaryExpr;
|
|
|
|
+ Ref: TResolvedReference;
|
|
|
|
+ Prop: TPasProperty;
|
|
|
|
+ Setter, Arg: TPasElement;
|
|
|
|
+ Args: TFPList;
|
|
|
|
+begin
|
|
|
|
+ if Expr is TBinaryExpr then
|
|
|
|
+ begin
|
|
|
|
+ Bin:=TBinaryExpr(Expr);
|
|
|
|
+ if Bin.OpCode=eopSubIdent then
|
|
|
|
+ Expr:=Bin.right;
|
|
|
|
+ end;
|
|
|
|
+ if Expr.CustomData is TResolvedReference then
|
|
|
|
+ begin
|
|
|
|
+ Ref:=TResolvedReference(Expr.CustomData);
|
|
|
|
+ if Ref.Declaration is TPasProperty then
|
|
|
|
+ begin
|
|
|
|
+ Prop:=TPasProperty(Ref.Declaration);
|
|
|
|
+ Setter:=AContext.Resolver.GetPasPropertySetter(Prop);
|
|
|
|
+ if Setter is TPasProcedure then
|
|
|
|
+ begin
|
|
|
|
+ Args:=TPasProcedure(Setter).ProcType.Args;
|
|
|
|
+ if Args.Count>0 then
|
|
|
|
+ begin
|
|
|
|
+ Arg:=TPasElement(Args[Args.Count-1]);
|
|
|
|
+ if (Arg is TPasArgument) and (TPasArgument(Arg).Access in [argConst,argConstRef]) then
|
|
|
|
+ exit(true);
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ Result:=false;
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure TPasToJSConverter.FindAvailableLocalName(var aName: string;
|
|
procedure TPasToJSConverter.FindAvailableLocalName(var aName: string;
|
|
JSExpr: TJSElement);
|
|
JSExpr: TJSElement);
|
|
var
|
|
var
|
|
@@ -21197,7 +21347,21 @@ end;
|
|
function TPasToJSConverter.CreateProcCallArg(El: TPasExpr;
|
|
function TPasToJSConverter.CreateProcCallArg(El: TPasExpr;
|
|
TargetArg: TPasArgument; AContext: TConvertContext): TJSElement;
|
|
TargetArg: TPasArgument; AContext: TConvertContext): TJSElement;
|
|
var
|
|
var
|
|
|
|
+ ExprIsTemp, ExprIsTempValid: boolean;
|
|
ExprResolved, ArgResolved: TPasResolverResult;
|
|
ExprResolved, ArgResolved: TPasResolverResult;
|
|
|
|
+
|
|
|
|
+ function ExprIsTemporaryVar: boolean;
|
|
|
|
+ // returns true if Expr is a temporary variable, e.g. a function result
|
|
|
|
+ begin
|
|
|
|
+ if not ExprIsTempValid then
|
|
|
|
+ begin
|
|
|
|
+ ExprIsTempValid:=true;
|
|
|
|
+ ExprIsTemp:=IsExprTemporaryVar(El);
|
|
|
|
+ end;
|
|
|
|
+ Result:=ExprIsTemp;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+var
|
|
ExprFlags: TPasResolverComputeFlags;
|
|
ExprFlags: TPasResolverComputeFlags;
|
|
IsRecord, NeedVar, ArgTypeIsArray: Boolean;
|
|
IsRecord, NeedVar, ArgTypeIsArray: Boolean;
|
|
ArgTypeEl, ExprTypeEl: TPasType;
|
|
ArgTypeEl, ExprTypeEl: TPasType;
|
|
@@ -21230,6 +21394,7 @@ begin
|
|
Include(ExprFlags,rcNoImplicitProcType);
|
|
Include(ExprFlags,rcNoImplicitProcType);
|
|
|
|
|
|
aResolver.ComputeElement(El,ExprResolved,ExprFlags);
|
|
aResolver.ComputeElement(El,ExprResolved,ExprFlags);
|
|
|
|
+ ExprIsTempValid:=false;
|
|
|
|
|
|
// consider TargetArg access
|
|
// consider TargetArg access
|
|
if NeedVar then
|
|
if NeedVar then
|
|
@@ -21305,11 +21470,25 @@ begin
|
|
begin
|
|
begin
|
|
if length(TPasArrayType(ExprTypeEl).Ranges)>0 then
|
|
if length(TPasArrayType(ExprTypeEl).Ranges)>0 then
|
|
begin
|
|
begin
|
|
- if TargetArg.Access=argDefault then
|
|
|
|
|
|
+ if (TargetArg.Access=argDefault)
|
|
|
|
+ and not ExprIsTemporaryVar then
|
|
begin
|
|
begin
|
|
// pass static array with argDefault -> clone
|
|
// pass static array with argDefault -> clone
|
|
Result:=CreateCloneStaticArray(El,TPasArrayType(ExprTypeEl),Result,AContext);
|
|
Result:=CreateCloneStaticArray(El,TPasArrayType(ExprTypeEl),Result,AContext);
|
|
end;
|
|
end;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ // pass dyn or open array
|
|
|
|
+ if (TargetArg.Access=argDefault)
|
|
|
|
+ and (ArgResolved.BaseType=btContext)
|
|
|
|
+ and (ArgResolved.LoTypeEl is TPasArrayType)
|
|
|
|
+ and not (ArgResolved.LoTypeEl.Parent is TPasArgument)
|
|
|
|
+ and not ExprIsTemporaryVar then
|
|
|
|
+ begin
|
|
|
|
+ // pass dyn array to argDefault array -> reference
|
|
|
|
+ Result:=CreateArrayRef(El,Result);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
end
|
|
end
|
|
else if ExprTypeEl.ClassType=TPasClassType then
|
|
else if ExprTypeEl.ClassType=TPasClassType then
|