pastojs: fixed inc(classvar)

git-svn-id: trunk@40152 -
This commit is contained in:
Mattias Gaertner 2018-11-01 15:06:59 +00:00
parent f5574bebc9
commit 5951a3c0ce
2 changed files with 69 additions and 31 deletions

View File

@ -9310,10 +9310,11 @@ var
Expr, SrcEl: TPasExpr;
ExprResolved: TPasResolverResult;
ExprArg: TPasArgument;
ValueJS: TJSElement;
LHS, ValueJS: TJSElement;
Call: TJSCallExpression;
IsInc: Boolean;
AddJS: TJSAdditiveExpression;
AssignContext: TAssignContext;
begin
Result:=nil;
IsInc:=CompareText((El.Value as TPrimitiveExpr).Value,'inc')=0;
@ -9330,6 +9331,8 @@ begin
// check target variable
AssignSt:=nil;
Call:=nil;
AssignContext:=nil;
LHS:=nil;
try
if ExprResolved.IdentEl is TPasArgument then
begin
@ -9367,14 +9370,38 @@ begin
RaiseNotSupported(Expr,AContext,20170501151316);
end;
AssignContext:=TAssignContext.Create(Expr,nil,AContext);
AContext.Resolver.ComputeElement(Expr,AssignContext.LeftResolved,[rcNoImplicitProc]);
SetResolverValueExpr(AssignContext.RightResolved,
AssignContext.LeftResolved.BaseType,AssignContext.LeftResolved.LoTypeEl,
AssignContext.LeftResolved.HiTypeEl,Expr,[rrfReadable]);
AssignContext.RightSide:=ValueJS;
ValueJS:=nil;
LHS:=ConvertElement(Expr,AssignContext);
if AssignContext.Call<>nil then
begin
// left side is a Setter -> RightSide was already inserted as parameter
RaiseNotSupported(El,AContext,20181101154351);
end
else
begin
// left side is a variable
if AssignContext.RightSide=nil then
RaiseInconsistency(20180622211919,El);
end;
// convert inc(avar,b) to a+=b
if IsInc then
AssignSt:=TJSAddEqAssignStatement(CreateElement(TJSAddEqAssignStatement,SrcEl))
else
AssignSt:=TJSSubEqAssignStatement(CreateElement(TJSSubEqAssignStatement,SrcEl));
AssignSt.LHS:=ConvertExpression(El.Params[0],AContext);
AssignSt.Expr:=ValueJS;
ValueJS:=nil;
AssignSt.LHS:=LHS;
LHS:=nil;
AssignSt.Expr:=AssignContext.RightSide;
AssignContext.RightSide:=nil;
Result:=AssignSt;
finally
ValueJS.Free;
@ -9382,6 +9409,12 @@ begin
begin
AssignSt.Free;
Call.Free;
LHS.Free;
end;
if AssignContext<>nil then
begin
AssignContext.RightSide.Free;
AssignContext.Free;
end;
end;
end;

View File

@ -9960,33 +9960,36 @@ end;
procedure TTestModule.TestClass_ClassVar;
begin
StartProgram(false);
Add('type');
Add(' TObject = class');
Add(' public');
Add(' class var vI: longint;');
Add(' class var Sub: TObject;');
Add(' constructor Create;');
Add(' class function GetIt(Par: longint): tobject;');
Add(' end;');
Add('constructor tobject.create;');
Add('begin');
Add(' vi:=vi+1;');
Add(' Self.vi:=Self.vi+1;');
Add('end;');
Add('class function tobject.getit(par: longint): tobject;');
Add('begin');
Add(' vi:=vi+par;');
Add(' Self.vi:=Self.vi+par;');
Add(' Result:=self.sub;');
Add('end;');
Add('var Obj: tobject;');
Add('begin');
Add(' obj:=tobject.create;');
Add(' tobject.vi:=3;');
Add(' if tobject.vi=4 then ;');
Add(' tobject.sub:=nil;');
Add(' obj.sub:=nil;');
Add(' obj.sub.sub:=nil;');
Add([
'type',
' TObject = class',
' public',
' class var vI: longint;',
' class var Sub: TObject;',
' constructor Create;',
' class function GetIt(Par: longint): tobject;',
' end;',
'constructor tobject.create;',
'begin',
' vi:=vi+1;',
' Self.vi:=Self.vi+1;',
' inc(vi);',
'end;',
'class function tobject.getit(par: longint): tobject;',
'begin',
' vi:=vi+par;',
' Self.vi:=Self.vi+par;',
' inc(vi);',
' Result:=self.sub;',
'end;',
'var Obj: tobject;',
'begin',
' obj:=tobject.create;',
' tobject.vi:=3;',
' if tobject.vi=4 then ;',
' tobject.sub:=nil;',
' obj.sub:=nil;',
' obj.sub.sub:=nil;']);
ConvertProgram;
CheckSource('TestClass_ClassVar',
LinesToStr([ // statements
@ -10000,11 +10003,13 @@ begin
' this.Create = function(){',
' this.$class.vI = this.vI+1;',
' this.$class.vI = this.vI+1;',
' this.$class.vI += 1;',
' };',
' this.GetIt = function(Par){',
' var Result = null;',
' this.vI = this.vI + Par;',
' this.vI = this.vI + Par;',
' this.vI += 1;',
' Result = this.Sub;',
' return Result;',
' };',