mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-05 03:11:09 +02:00
pastojs: fixed static array clone function
git-svn-id: trunk@38512 -
This commit is contained in:
parent
e644ef9439
commit
e55cd25251
@ -9235,7 +9235,7 @@ end;
|
||||
function TPasToJSConverter.ConvertArrayType(El: TPasArrayType;
|
||||
AContext: TConvertContext): TJSElement;
|
||||
// Static array of static array need clone function:
|
||||
// TStaticArray$clone = function(a){
|
||||
// this.TStaticArray$clone = function(a){
|
||||
// var r = [];
|
||||
// for (var i=0; i<*High(a)*; i++) r.push(a[i].slice(0));
|
||||
// return r;
|
||||
@ -9255,6 +9255,7 @@ const
|
||||
CloneResultName = 'r';
|
||||
CloneRunName = 'i';
|
||||
var
|
||||
AssignSt: TJSSimpleAssignStatement;
|
||||
CallName: String;
|
||||
Obj: TJSObjectLiteral;
|
||||
Prop: TJSObjectLiteralElement;
|
||||
@ -9265,7 +9266,6 @@ var
|
||||
RangeEl: TPasExpr;
|
||||
Call: TJSCallExpression;
|
||||
RgLen, RangeEnd: MaxPrecInt;
|
||||
CloneFunc: TJSVarDeclaration;
|
||||
List: TJSStatementList;
|
||||
Func: TJSFunctionDeclarationStatement;
|
||||
Src: TJSSourceElements;
|
||||
@ -9288,20 +9288,23 @@ begin
|
||||
if AContext.Resolver.HasStaticArrayCloneFunc(El) then
|
||||
begin
|
||||
// For example: type TArr = array[1..2] of array[1..2] of longint;
|
||||
// TStaticArray$clone = function(a){
|
||||
// this.TStaticArray$clone = function(a){
|
||||
// var r = [];
|
||||
// for (var i=0; i<*High(a)*; i++) r.push(a[i].slice(0));
|
||||
// return r;
|
||||
// };
|
||||
BracketEx:=nil;
|
||||
CloneFunc:=TJSVarDeclaration(CreateElement(TJSVarDeclaration,El));
|
||||
AssignSt:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El));
|
||||
try
|
||||
// add 'this.TypeName = function(){}'
|
||||
AssignSt.LHS:=CreateSubDeclNameExpr(El,
|
||||
El.Name+FBuiltInNames[pbifnArray_Static_Clone],AContext);
|
||||
|
||||
Index:=0;
|
||||
RangeEl:=El.Ranges[Index];
|
||||
// function(a){...
|
||||
CloneFunc.Name:=El.Name+FBuiltInNames[pbifnArray_Static_Clone];
|
||||
Func:=CreateFunctionSt(El,true,true);
|
||||
CloneFunc.Init:=Func;
|
||||
AssignSt.Expr:=Func;
|
||||
Func.AFunction.Params.Add(CloneArrName);
|
||||
Src:=Func.AFunction.Body.A as TJSSourceElements;
|
||||
// var r = [];
|
||||
@ -9352,11 +9355,11 @@ begin
|
||||
AddToSourceElements(Src,ReturnSt);
|
||||
ReturnSt.Expr:=CreatePrimitiveDotExpr(CloneResultName,El);
|
||||
|
||||
Result:=CloneFunc;
|
||||
CloneFunc:=nil;
|
||||
Result:=AssignSt;
|
||||
AssignSt:=nil;
|
||||
finally
|
||||
BracketEx.Free;
|
||||
CloneFunc.Free;
|
||||
AssignSt.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -6202,7 +6202,7 @@ begin
|
||||
ConvertProgram;
|
||||
CheckSource('TestArray_StaticMultiDim',
|
||||
LinesToStr([ // statements
|
||||
'TArrayArrayInt$clone = function (a) {',
|
||||
'this.TArrayArrayInt$clone = function (a) {',
|
||||
' var r = [];',
|
||||
' for (var i = 0; i < 2; i++) r.push(a[i].slice(0));',
|
||||
' return r;',
|
||||
|
Loading…
Reference in New Issue
Block a user