Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.04 KB | None | 0 0
  1. function TLapeTree_InternalMethod_Find.Compile(var Offset: Integer): TResVar;
  2. var
  3.   itemVar, arrayVar, counterVar: TResVar;
  4.   forLoop: TLapeTree_For;
  5.   Assign: TLapeTree_Operator;
  6. begin
  7.   Dest := NullResVar;
  8.   Result := NullResVar;
  9.  
  10.   if (FParams.Count < 2) then
  11.     LapeExceptionFmt(lpeWrongNumberParams, [2], DocPos);
  12.  
  13.   FParams[0].CompileToTempVar(Offset, itemVar);
  14.   FParams[1].CompileToTempVar(Offset, arrayVar);
  15.  
  16.   Result := _ResVar.New(FCompiler.getTempVar(Self.resType()));
  17.   counterVar := _ResVar.New(FCompiler.getTempVar(FCompiler.getBaseType(ltInt32)));
  18.  
  19.   forLoop := TLapeTree_For.Create(Self);
  20.   with forLoop do
  21.   try
  22.     Counter := TLapeTree_ResVar.Create(counterVar.IncLock(), forLoop);
  23.     Limit := TLapeTree_InternalMethod_High.Create(forLoop);
  24.     TLapeTree_InternalMethod_High(Limit).addParam(FParams[1]);
  25.  
  26.     Body := TLapeTree_If.Create(forLoop);
  27.     with TLapeTree_If(Body) do
  28.     begin
  29.       Condition := TLapeTree_Operator.Create(op_cmp_Equal, forLoop);
  30.  
  31.       with TLapeTree_Operator(Condition) do
  32.       begin
  33.         Left := TLapeTree_Operator.Create(op_Index, forLoop);
  34.         with TLapeTree_Operator(Left) do
  35.         begin
  36.           Left := TLapeTree_ResVar.Create(arrayVar.IncLock(), forLoop);
  37.           Right := TLapeTree_ResVar.Create(counterVar.IncLock(), forLoop);
  38.         end;
  39.         Right := TLapeTree_ResVar.Create(itemVar.IncLock(), forLoop);
  40.       end;
  41.  
  42.       Body := TLapeTree_StatementList.Create(forLoop);
  43.  
  44.       Assign := TLapeTree_Operator.Create(op_Assign, forLoop);
  45.       Assign.Left := TlapeTree_ResVar.Create(Result.IncLock(), forLoop);
  46.       Assign.Right := TLapeTree_ResVar.Create(counterVar.IncLock(), forLoop);
  47.  
  48.       TLapeTree_StatementList(Body).addStatement(Assign);
  49.       TLapeTree_StatementList(Body).addStatement(TLapeTree_InternalMethod_Break.Create(forLoop));
  50.     end;
  51.  
  52.     Compile(Offset);
  53.   finally
  54.     Free();
  55.  
  56.     counterVar.Spill(3);
  57.     itemVar.Spill(1);
  58.     arrayVar.Spill(1);
  59.  
  60.     Result.DecLock();
  61.   end;
  62. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement