mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 02:11:30 +01: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
	 Mattias Gaertner
						Mattias Gaertner