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; Expr, SrcEl: TPasExpr;
ExprResolved: TPasResolverResult; ExprResolved: TPasResolverResult;
ExprArg: TPasArgument; ExprArg: TPasArgument;
ValueJS: TJSElement; LHS, ValueJS: TJSElement;
Call: TJSCallExpression; Call: TJSCallExpression;
IsInc: Boolean; IsInc: Boolean;
AddJS: TJSAdditiveExpression; AddJS: TJSAdditiveExpression;
AssignContext: TAssignContext;
begin begin
Result:=nil; Result:=nil;
IsInc:=CompareText((El.Value as TPrimitiveExpr).Value,'inc')=0; IsInc:=CompareText((El.Value as TPrimitiveExpr).Value,'inc')=0;
@ -9330,6 +9331,8 @@ begin
// check target variable // check target variable
AssignSt:=nil; AssignSt:=nil;
Call:=nil; Call:=nil;
AssignContext:=nil;
LHS:=nil;
try try
if ExprResolved.IdentEl is TPasArgument then if ExprResolved.IdentEl is TPasArgument then
begin begin
@ -9367,14 +9370,38 @@ begin
RaiseNotSupported(Expr,AContext,20170501151316); RaiseNotSupported(Expr,AContext,20170501151316);
end; 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 // convert inc(avar,b) to a+=b
if IsInc then if IsInc then
AssignSt:=TJSAddEqAssignStatement(CreateElement(TJSAddEqAssignStatement,SrcEl)) AssignSt:=TJSAddEqAssignStatement(CreateElement(TJSAddEqAssignStatement,SrcEl))
else else
AssignSt:=TJSSubEqAssignStatement(CreateElement(TJSSubEqAssignStatement,SrcEl)); AssignSt:=TJSSubEqAssignStatement(CreateElement(TJSSubEqAssignStatement,SrcEl));
AssignSt.LHS:=ConvertExpression(El.Params[0],AContext);
AssignSt.Expr:=ValueJS; AssignSt.LHS:=LHS;
ValueJS:=nil; LHS:=nil;
AssignSt.Expr:=AssignContext.RightSide;
AssignContext.RightSide:=nil;
Result:=AssignSt; Result:=AssignSt;
finally finally
ValueJS.Free; ValueJS.Free;
@ -9382,6 +9409,12 @@ begin
begin begin
AssignSt.Free; AssignSt.Free;
Call.Free; Call.Free;
LHS.Free;
end;
if AssignContext<>nil then
begin
AssignContext.RightSide.Free;
AssignContext.Free;
end; end;
end; end;
end; end;

View File

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