Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function TLapeTree_InternalMethod_Find.Compile(var Offset: Integer): TResVar;
- var
- itemVar, arrayVar, counterVar: TResVar;
- forLoop: TLapeTree_For;
- Assign: TLapeTree_Operator;
- begin
- Dest := NullResVar;
- Result := NullResVar;
- if (FParams.Count < 2) then
- LapeExceptionFmt(lpeWrongNumberParams, [2], DocPos);
- FParams[0].CompileToTempVar(Offset, itemVar);
- FParams[1].CompileToTempVar(Offset, arrayVar);
- Result := _ResVar.New(FCompiler.getTempVar(Self.resType()));
- counterVar := _ResVar.New(FCompiler.getTempVar(FCompiler.getBaseType(ltInt32)));
- forLoop := TLapeTree_For.Create(Self);
- with forLoop do
- try
- Counter := TLapeTree_ResVar.Create(counterVar.IncLock(), forLoop);
- Limit := TLapeTree_InternalMethod_High.Create(forLoop);
- TLapeTree_InternalMethod_High(Limit).addParam(FParams[1]);
- Body := TLapeTree_If.Create(forLoop);
- with TLapeTree_If(Body) do
- begin
- Condition := TLapeTree_Operator.Create(op_cmp_Equal, forLoop);
- with TLapeTree_Operator(Condition) do
- begin
- Left := TLapeTree_Operator.Create(op_Index, forLoop);
- with TLapeTree_Operator(Left) do
- begin
- Left := TLapeTree_ResVar.Create(arrayVar.IncLock(), forLoop);
- Right := TLapeTree_ResVar.Create(counterVar.IncLock(), forLoop);
- end;
- Right := TLapeTree_ResVar.Create(itemVar.IncLock(), forLoop);
- end;
- Body := TLapeTree_StatementList.Create(forLoop);
- Assign := TLapeTree_Operator.Create(op_Assign, forLoop);
- Assign.Left := TlapeTree_ResVar.Create(Result.IncLock(), forLoop);
- Assign.Right := TLapeTree_ResVar.Create(counterVar.IncLock(), forLoop);
- TLapeTree_StatementList(Body).addStatement(Assign);
- TLapeTree_StatementList(Body).addStatement(TLapeTree_InternalMethod_Break.Create(forLoop));
- end;
- Compile(Offset);
- finally
- Free();
- counterVar.Spill(3);
- itemVar.Spill(1);
- arrayVar.Spill(1);
- Result.DecLock();
- end;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement