AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte ScriptEngine II (v. 0.6.1)

ScriptEngine II (v. 0.6.1)

Ein Thema von littleDave · begonnen am 21. Sep 2009 · letzter Beitrag vom 4. Aug 2011
Antwort Antwort
Benutzerbild von littleDave
littleDave

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

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
Florian Hämmerle
(Gast)

n/a Beiträge
 
#2

AW: ScriptEngine II (v. 0.6)

  Alt 28. Nov 2010, 17:07
NICE (:

Freut mich zu hören, dass sich in der SE2 immer noch so viel tut. Weiter so (:
wenn das hier jetzt facebook wäre, würde ich mal "gefällt mir" klicken

mfg Florian
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#3

AW: ScriptEngine II (v. 0.6)

  Alt 28. Nov 2010, 17:49
wenn das hier jetzt facebook wäre, würde ich mal "gefällt mir" klicken
Sowas sollte man hier wirklich mal einführen
Oder einen Danke-Button wie in der EE.
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#4

AW: ScriptEngine II (v. 0.6)

  Alt 2. Jan 2011, 14:58
Hi,

ich denke gerade darüber von RemObjects PascalScript auf deine ScriptEngine umzusteigen, aus dem einfachen Grund weil hier overloading unterstützt wird. Eines stört mich jedoch: Die Scripts müssen immer einen program-Header haben, in PascalScript konnte man den abschalten (über CompilerOptions). Kannst du das auch abschaltbar machen? Der verschwendet bei mir nur Platz, da ich ihn eh immer NPCScript oder so nennen würde und die Scripts über Dateinamen identifiziert werden.

Edit: Und gibt es irgendwo Inc() und Dec()? Wenn nein, warum nicht?

Edit 2: So, läuft ganz gut jetzt. Allerdings habe ich noch einen Feature-Wunsch:
Meine Scripts terminieren die Runtime aus sich heraus und wenn ich direkt nach Abort() Finalize() und Free() aufrufe, knallt es. Daher brauche ich ein Notify-Event, irgendwie OnAborted oder so in der Runtime. Im finally ganz unten in TSE2ExecutionContext.Call dann so aufrufen:
Delphi-Quellcode:
    if FDoAbort and Assigned(FOnAborted) then
      FOnAborted(TObject(FExecutionData.RunTime));

Geändert von WorstNightmare ( 2. Jan 2011 um 22:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

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

AW: ScriptEngine II (v. 0.6)

  Alt 4. Jan 2011, 20:23
Hallo WorstNightmare,

sorry für die späte Antwort, bin bisher nicht dazu gekommen

Zitat:
ich denke gerade darüber von RemObjects PascalScript auf deine ScriptEngine umzusteigen, aus dem einfachen Grund weil hier overloading unterstützt wird. Eines stört mich jedoch: Die Scripts müssen immer einen program-Header haben, in PascalScript konnte man den abschalten (über CompilerOptions). Kannst du das auch abschaltbar machen?
Ja, ich werde schauen, was sich da machen lässt. Wird jedoch noch etwas dauern, da ich mich endlich dazu überwunden habe und im Moment arrays einbaue. Ich bin dabei gerade mitten in der Implementierungs- und Testphase. Dadurch wäre es im Moment nicht so gut, den halbfertigen Code herauszugeben. Bis dahin kannst du ja vor dem Übergeben an den Compiler folgendes schreiben:
Delphi-Quellcode:
function CompileScript(const Source: string): TSE2PE;
begin
  result := Compiler.Compile('program program1; ' + Source + ' begin end.';
end;
Zitat:
Edit: Und gibt es irgendwo Inc() und Dec()? Wenn nein, warum nicht?
Diese Routinen habe ich zum einen aus Zeitgründen, zum anderen aus Featuregründen noch nicht drinnen (ich will eigentlich keine "Compiler-Magic" einbauen).
  • Zeitgrund: für jeden Typ müssen die Routinen alle manuell deklarieren muss (also für byte, integer, etc. - jeweils mit und ohne Parameter).
  • Feature-Grund: für ein einfaches "+1" eine einzelne Funktion aufrufen ist doch etwas overhead, daher wollte ich warten, bis ich "inline" - Methoden eingebaut habe.
Bei "pred()" und "succ()" hört der Spaß dann aber auf - die kommen mir nicht in die System-Unit (ich finde die total unübersichtlich)

Zitat:
Edit 2: So, läuft ganz gut jetzt. Allerdings habe ich noch einen Feature-Wunsch:
Meine Scripts terminieren die Runtime aus sich heraus und wenn ich direkt nach Abort() Finalize() und Free() aufrufe, knallt es. Daher brauche ich ein Notify-Event, irgendwie OnAborted oder so in der Runtime. Im finally ganz unten in TSE2ExecutionContext.Call dann so aufrufen:
Delphi-Quellcode:
    if FDoAbort and Assigned(FOnAborted) then
      FOnAborted(TObject(FExecutionData.RunTime));
Das versteh ich nicht, wieso das nötig sein sollte. Gehe ich richtig in der Annahme, dass du im Script einen Methode aufrufst, die die RunTime beenden und schließen soll? Das kann nicht funktionieren! denn so ziehst du dem Script die RunTime unter den Füßen weg und knallt somit auf den Boden. Die RunTime darf nicht von einer Funktion heraus gelöscht werden, wenn diese aus der RunTime heraus aufgerufen wird.
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
EugenB

Registriert seit: 7. Dez 2006
98 Beiträge
 
Lazarus
 
#6

AW: ScriptEngine II (v. 0.6)

  Alt 5. Jan 2011, 18:47
Hi

Zitat:
Edit: Und gibt es irgendwo Inc() und Dec()? Wenn nein, warum nicht?
Diese Routinen habe ich zum einen aus Zeitgründen, zum anderen aus Featuregründen noch nicht drinnen (ich will eigentlich keine "Compiler-Magic" einbauen).
Wäre sowas nicht "einfach" durch ne Helper-Klasse besser realisiert?

IntVar.Inc;
IntVar.Dec;

Oder geht sowas nicht bei einfachen Variablen?

Btw, schön zu hören das es bald Arrays gibt, obwohl man jetzt sowieso alles mit Listen machen würde (ich zumindest

Btw2, ist es möglich / auf der Todo Liste, dass man Generics nutzen kann?

Gruß
Eugen
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#7

AW: ScriptEngine II (v. 0.6)

  Alt 5. Jan 2011, 22:57
Mein RTTI-ClassImporter fügt jetzt einfach noch nach der Klasse, mit der das Script aufs Hauptprogramm zugreift, Inc und Dec für Integer ein. Ich hatte einfach keine Lust das in allen 250 Scripts mit + bzw - 1 zu ersetzen.

Zum Abbrechen der Runtime:
Das habe ich dann auch schnell festgestellt^^
Deswegen möchte ich ja, dass wenn ich Abort aufrufe, ich benachrichtigt werde wenn es fertig mit Abbrechen ist und dann Free aufrufen kann. Eine andere Möglichkeit habe ich nicht, denn das Hauptprogramm weiß nicht automatisch, wann das Script fertig ist (die Teile haben eine Methode, die bei jedem Script unterschiedlich oft aufgerufen wird).
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz