mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-23 23:13:17 +02:00
pastojs: fixed inc(classvar)
git-svn-id: trunk@40152 -
This commit is contained in:
parent
f5574bebc9
commit
5951a3c0ce
@ -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;
|
||||
|
@ -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;',
|
||||
' };',
|
||||
|
Loading…
Reference in New Issue
Block a user