Original in Russian: http://18delphi.blogspot.ru/2013/11/gui-2.html
GUI-testing. Table of contents
Now I’d like to tell about how TscriptCode and TscriptContext are organised.
For that we should recollect the following:
Reference counting and TRefcounted:
http://18delphi.blogspot.com/2015/02/containers-1-implementation-of.html
Abstract containers:
http://18delphi.blogspot.com/2015/02/containers-6-abstract-containers.html.
http://18delphi.blogspot.com/2015/02/containers-7-abstract-containers-part-2.html.
The “lucky owners” of ARC and generic's are happy. They can do it in a different way. But this thing (as said Feynman (https://en.wikipedia.org/wiki/Richard_Feynman) the readers can do on their own.
On the one hand, TscriptCode is a descendant of TRefcounted and, on the other hand, adds itself to the list of the references on TscriptKeyWord.
So:
I’m all done and can’t write about TscriptContext. I’ve been distracted by RTTI. It is late hour…
I’ll continue to tell about TscriptContext in the next series. Actually, it is banal, of course. “The stack”. But – not exactly…
GUI-testing. Table of contents
Now I’d like to tell about how TscriptCode and TscriptContext are organised.
For that we should recollect the following:
Reference counting and TRefcounted:
http://18delphi.blogspot.com/2015/02/containers-1-implementation-of.html
Abstract containers:
http://18delphi.blogspot.com/2015/02/containers-6-abstract-containers.html.
http://18delphi.blogspot.com/2015/02/containers-7-abstract-containers-part-2.html.
The “lucky owners” of ARC and generic's are happy. They can do it in a different way. But this thing (as said Feynman (https://en.wikipedia.org/wiki/Richard_Feynman) the readers can do on their own.
On the one hand, TscriptCode is a descendant of TRefcounted and, on the other hand, adds itself to the list of the references on TscriptKeyWord.
So:
interface
TscriptKeyWord = class(TRefcounted)
procedure DoIt(aContext: TscriptContext); virtual; abstract;
{* - code of the word execution.}
end;//TscriptKeyWord
_ItemType_ = TscriptKeyWord;
_List_Parent_ = TRefcounted;
{$Include _List_.imp.pas}
TscriptCode = class(_List_)
procedure CompileInteger(aValue: Integer);
procedure CompileString(const aValue: String);
procedure CompileKeyWord(aValue: TscriptKeyWord);
procedure Run; // - executes the compiled code
procedure RunInContext(aContext: TscriptContext); // - executes the compiled code in the specified context
...
end;//TscriptCode
implementation
function IsSame(const A: _ItemType_;
const B: _ItemType_): Boolean;
begin
Result := (A = B);
end;//IsSame
procedure FreeItem(var thePlace: _ItemType_);
begin
FreeAndNil(thePlace);
end;//FreeItem
procedure FillItem(var thePlace: _ItemType_;
const aFrom: _ItemType_);
begin
thePlace := aFrom.Use;
end;//FillItem
{$Include List.imp.pas}
procedure TscriptCode.CompileKeyWord(aValue: TscriptKeyWord);
begin
Self.Add(aValue);
end;
procedure TscriptCode.Run;
var
l_Context: TscriptContext;
begin
l_Context := TscriptContext.Create;
try
RunInContext(l_Context);
finally
FreeAndNil(l_Context);
end;//try..finally
end;
procedure TscriptCode.RunInContext(aContext: TscriptContext);
var
l_Index : Integer;
begin
for l_Index := 0 to Pred(Self.Count) do
Self.Items[l_Index].DoIt(aContext); // - we execute every compiled word
end;
type
TkwInteger = class(TscriptKeyWord)
private
f_Value : Integer;
protected
procedure DoIt(aContext: TscriptContext); override;
public
constructor Create(aValue : Integer);
end;//TkwInteger
procedure TkwInteger.DoIt(aContext: TscriptContext);
begin
aContext.PushInteger(f_Value);
end;
constructor TkwIntegerCreate(aValue : Integer);
begin
inherited Create;
f_Value := aValue;
end;
procedure TscriptCode.CompileInteger(aValue: Integer);
var
l_Integer : TkwInteger;
begin
l_Integer := TkwInteger.Create(aValue);
try
CompileKeyWord(l_Integer);
finally
FreeAndNil(l_Integer);
end;//try..finally
end;
type
TkwString = class(TscriptKeyWord)
private
f_Value : String;
protected
procedure DoIt(aContext: TscriptContext); override;
public
constructor Create(const aValue : String);
end;//TkwString
procedure TkwString.DoIt(aContext: TscriptContext);
begin
aContext.PushString(f_Value);
end;
constructor TkwString.Create(const aValue : String);
begin
inherited Create;
f_Value := aValue;
end;
procedure TscriptCode.CompileString(const aValue: String);
var
l_String : TkwString;
begin
l_String := TkwString.Create(aValue);
try
CompileKeyWord(l_String);
finally
FreeAndNil(l_String);
end;//try..finally
end;
I’m all done and can’t write about TscriptContext. I’ve been distracted by RTTI. It is late hour…
I’ll continue to tell about TscriptContext in the next series. Actually, it is banal, of course. “The stack”. But – not exactly…
Комментариев нет:
Отправить комментарий