pastojs: fixed static array clone function

git-svn-id: trunk@38512 -
This commit is contained in:
Mattias Gaertner 2018-03-12 23:17:13 +00:00
parent e644ef9439
commit e55cd25251
2 changed files with 13 additions and 10 deletions

View File

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

View File

@ -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;',