Einzelnen Beitrag anzeigen

Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#108

AW: ScriptEngine II (v. 0.6)

  Alt 28. Nov 2010, 16:47
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.dllname '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
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat