Neue Version
Version 0.6
Ist wurde mal wieder Zeit für einen größeren Versionssprung. Neu dabei ist unter anderem die for-in-Schleife, hier mal (wie immer) die Übersicht:
- Neuerungen
- Die for-in-Schleife ist nun im Script möglich. Der benötigte Enumerator und dessen Aufbau ist im PDF beschrieben.
- Enumeratoren für TList, TStrings, TIntegerList, TInt64List und TFloatList hinzugefügt
- Der Index von for-Schleifen kann jetzt lokal im Schleifenkopf definiert werden: for var i: integer := 0 to 10 do ;
- Die Inhaltsvariable von for-in-Schleifen kann ebenfalls lokal definiert werden: for var s: string in AList do ;
- Die Script-Engine kann jetzt mit direkten Funktionspointern zu externen Methoden umgehen. Das schaut z.B. so aus:
Delphi-Quellcode:
type
TMyCallback = procedure(SomeArg: integer); external; // wichtig: muss als external definiert sein, stdcall etc. ist erlaubt
function GetCallbackEntryPoint: Pointer; external; // liefert den direkten Funktionspointer
var t: TMyCallback;
begin
t := GetCallbackEntryPoint;
t(1234); // Funktion wird ausgeführt
end;
- DLL-Methoden können jetzt direkt im Script definiert und importiert werden. Die RunTime hat zudem ein eingebautes Sicherheitsfeature, mit dem gesteuert werden kann, ob eine Funktion importiert werden kann. Dies ist Standard-mäßig verboten, im PDF ist aber beschrieben, wie man das erlaubt.
Delphi-Quellcode:
procedure Sleep(dwMilliseconds: DWORD); external 'kernel32.dll' name 'Sleep'; stdcall;
begin
Sleep(1000);
end;
- Neue Unit: System.Interop.Windows: Bietet die Klasse "TDynamicLinkLibrary" an, mit der man Funktionspointer aus DLLs dynamisch laden kann. Der gerade genannte Sicherheitsaspekt ist für diese Methode ebenfalls von Bedeutung.
Delphi-Quellcode:
uses
System.Interop.Windows;
type
TSleep = procedure(dwMilliseconds: DWORD); external; stdcall;
var Sleep: TSleep;
Lib : TDynamicLinkLibrary;
begin
Lib := TDynamicLinkLibrary.Create('kernel32.dll');
try
Sleep := Lib.FindMethod('Sleep');
if @Sleep <> nil then
Sleep(1000);
finally
Lib.Free;
end;
end.
- Änderungen
- Compiler-Geschwindigkeit sowie Linker-Geschwindigkeit etwas verbessert
- "exit", "break" oder "continue" ist jetzt innerhalb eines finally-end-Blockes verboten (wie in Delphi auch)
- Bug-Fixes
- try-except-Block und try-finally-Block komplett neu geschrieben. Es gab einige Probleme mit den Anweisungen "exit", "break" und "continue" innerhalb eines try-Blockes.
- interne Größe von set-of-Typen hängt jetzt ebenfalls von der Anzahl der Elemente in der Aufzählung ab. Dies ist jetzt kompatibel zu Delphi, was vor allem in Records Probleme machen konnte
- Compiler hat innerhalb es "uses"-Blockes das Script nicht korrekt validiert
- Funktionsaufrufe mit Rückgabewert über einen Funktionspointer haben nicht korrekt funktioniert
- Fehler in der RunTime beim OpCode "JIZ" und "JNZ" behoben
Download-Link ist im ersten Post.
Grüße