mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-25 06:13:40 +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;
|
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;
|
||||||
|
|||||||
@ -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;',
|
||||||
' };',
|
' };',
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user