mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 11:39:27 +02:00
pas2js: ArrayOfChar:=String, pass string to ArrayOfChar
git-svn-id: trunk@45321 -
This commit is contained in:
parent
a316229ef6
commit
042ad497d3
@ -1890,6 +1890,7 @@ type
|
||||
AssignContext: TAssignContext; PosEl: TPasElement): TJSCallExpression; virtual;
|
||||
Function AppendPropertyReadArgs(Call: TJSCallExpression; Prop: TPasProperty;
|
||||
aContext: TConvertContext; PosEl: TPasElement): TJSCallExpression; virtual;
|
||||
Function CreateDotSplit(El: TPasElement; Expr: TJSElement): TJSElement; virtual;
|
||||
Function CreatePrecompiledJS(El: TJSElement): string; virtual;
|
||||
Function CreateRaisePropReadOnly(PosEl: TPasElement): TJSElement; virtual;
|
||||
Procedure AddRTLVersionCheck(FuncContext: TFunctionContext; PosEl: TPasElement);
|
||||
@ -17427,6 +17428,21 @@ begin
|
||||
Result:=Call;
|
||||
end;
|
||||
|
||||
function TPasToJSConverter.CreateDotSplit(El: TPasElement; Expr: TJSElement
|
||||
): TJSElement;
|
||||
var
|
||||
DotExpr: TJSDotMemberExpression;
|
||||
Call: TJSCallExpression;
|
||||
begin
|
||||
Call:=CreateCallExpression(El);
|
||||
DotExpr:=TJSDotMemberExpression(CreateElement(TJSDotMemberExpression,El));
|
||||
Call.Expr:=DotExpr;
|
||||
DotExpr.MExpr:=Expr;
|
||||
DotExpr.Name:='split';
|
||||
Call.AddArg(CreateLiteralJSString(El,''));
|
||||
Result:=Call;
|
||||
end;
|
||||
|
||||
function TPasToJSConverter.CreatePrecompiledJS(El: TJSElement): string;
|
||||
var
|
||||
aWriter: TBufferWriter;
|
||||
@ -19812,6 +19828,17 @@ begin
|
||||
// e.g. double := currency -> double := currency/10000
|
||||
AssignContext.RightSide:=CreateDivideNumber(El,AssignContext.RightSide,10000);
|
||||
end
|
||||
else if AssignContext.RightResolved.BaseType in btAllStringAndChars then
|
||||
begin
|
||||
if AssignContext.LeftResolved.BaseType=btContext then
|
||||
begin
|
||||
if AssignContext.LeftResolved.LoTypeEl is TPasArrayType then
|
||||
begin
|
||||
// AnArray:=aString -> AnArray:=aString.split("")
|
||||
AssignContext.RightSide:=CreateDotSplit(El.right,AssignContext.RightSide);
|
||||
end;
|
||||
end;
|
||||
end
|
||||
else if AssignContext.RightResolved.BaseType=btContext then
|
||||
begin
|
||||
RightTypeEl:=AssignContext.RightResolved.LoTypeEl;
|
||||
@ -22689,14 +22716,21 @@ begin
|
||||
|
||||
if ArgTypeIsArray then
|
||||
begin
|
||||
// array as argument
|
||||
if ExprResolved.BaseType=btNil then
|
||||
begin
|
||||
// nil to array -> pass []
|
||||
Result:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,El));
|
||||
exit;
|
||||
end;
|
||||
// array as argument
|
||||
Result:=CreateArrayInit(TPasArrayType(ArgTypeEl),El,El,AContext);
|
||||
end
|
||||
else if ExprResolved.BaseType in btAllStringAndChars then
|
||||
begin
|
||||
// pass string to an array
|
||||
Result:=ConvertExpression(El,AContext);
|
||||
Result:=CreateDotSplit(El,Result);
|
||||
end
|
||||
else
|
||||
Result:=CreateArrayInit(TPasArrayType(ArgTypeEl),El,El,AContext);
|
||||
end;
|
||||
|
||||
if Result=nil then
|
||||
|
@ -9510,8 +9510,6 @@ end;
|
||||
|
||||
procedure TTestModule.TestArray_ArrayOfCharAssignString;
|
||||
begin
|
||||
exit; // todo
|
||||
|
||||
StartProgram(false);
|
||||
Add([
|
||||
'type TArr = array of char;',
|
||||
@ -9522,21 +9520,34 @@ begin
|
||||
'procedure Run(const a: array of char);',
|
||||
'begin',
|
||||
' Run(c);',
|
||||
//' Run(s);',
|
||||
' Run(s);',
|
||||
'end;',
|
||||
'begin',
|
||||
//' a:=c;',
|
||||
//' a:=s;',
|
||||
//' a:=#13;',
|
||||
//' a:=''Foo'';',
|
||||
//' Run(c);',
|
||||
//' Run(s);',
|
||||
' a:=c;',
|
||||
' a:=s;',
|
||||
' a:=#13;',
|
||||
' a:=''Foo'';',
|
||||
' Run(c);',
|
||||
' Run(s);',
|
||||
'']);
|
||||
ConvertProgram;
|
||||
CheckSource('TestArray_ArrayOfCharAssignString',
|
||||
LinesToStr([ // statements
|
||||
'this.c = "";',
|
||||
'this.s = "";',
|
||||
'this.a = [];',
|
||||
'this.Run = function (a) {',
|
||||
' $mod.Run($mod.c.split(""));',
|
||||
' $mod.Run($mod.s.split(""));',
|
||||
'};',
|
||||
'']),
|
||||
LinesToStr([
|
||||
'$mod.a = $mod.c.split("");',
|
||||
'$mod.a = $mod.s.split("");',
|
||||
'$mod.a = "\r".split("");',
|
||||
'$mod.a = "Foo".split("");',
|
||||
'$mod.Run($mod.c.split(""));',
|
||||
'$mod.Run($mod.s.split(""));',
|
||||
'']));
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user