Moin Moin,
früher hatte ich eher das Problem, dass ich schwer aus dem Assembler wieder raus kam, in den Quellcode,
aber jetzt hab ich das Problem andersrum, also dass es ständig zurück in den Quellcode springt, ohne dass ich es will.
Im Grunde wollte ich schauen ob und wann Delphi bei den Custom-Managed-Records das Standardverhalten ausführt und wie dazu die neuen Operatoren arbeiten.
Speziell beim Assign, hatte musste ich das genauer wissen.
Delphi 12.1 mit Patch 1
Neue
Win32-
VCL-Anwendung
der Dreck bezückglich DebugDCUs ist ja inzwischen immernoch standardmäßig aktiv.
und die beiden markierten Haltepunkte setzen (F5)
Delphi-Quellcode:
implementation
{$R *.dfm}
type
TTest = record
FInt: Integer;
FStr: string;
class operator Initialize(out Dest: TTest);
class operator Finalize(var Dest: TTest);
class operator Assign(var Dest: TTest; const [ref] Src: TTest);
end;
class operator TTest.Initialize(out Dest: TTest);
begin
Dest.FInt := 123;
Dest.FStr := 'abc';
end;
class operator TTest.Finalize(var Dest: TTest);
begin
Dest.FInt := 0;
Dest.FStr := '';
end;
class operator TTest.Assign(var Dest: TTest; const [ref] Src: TTest);
begin
Dest.FInt := Src.FInt;
Dest.FStr := Src.FStr;
end;
procedure Test;
var
A, B: TTest;
begin
A.FInt := 456;
A.FStr := 'def';
B := A; {HALTEPUNKT}
if B.FInt = 0 then;
end;
procedure TForm1.FormCreate(Sender: TObject); // Form1.OnCreate ;)
begin
Test; {HALTEPUNKT}
Test; {HALTEPUNKT}
end;
end.
*
[F9] bis zum Haltepunkt im FormCreate
*
Strg+Alt+C -> ins Assembler
* dann
[F7]
* OK, hier nur ein CALL und es landet beim BEGIN der Test-Ptozedur, aber im Pascal.
* erneut
Strg+Alt+C
* gut, es ist immernoch direkt am Anfang und der Code für die Initialisierung der lokalen Variablen ist noch nicht durch
*
[F7]
* so, jetzt müsste ich den Assembler eigentlich mit
[F7] mindestens Zeilenweise bis zum CALL kommen
* aber
NEIN, ich lande wieder beim BEGIN der TEST-Prozedur
*
Strg+Alt+C und es ging zum Glück doch bloß den einen
ASM-Befehl
* wieder
[F7], zurück im Pascal, immernoch beim BEGIN ...
Strg+Alt+F7 und war doch bloß der eine
ASM-Befehl
Ist das bei euch auch so?
Kann noch nicht sein ... beim ersten
ASM-Befehl einer Zeile wäre es schon OK, aber die dazwischen
Das sind hier 17
ASM-Befehle ... bei jedem müßte ich hin und her,
Ganz pervers wird es beim [F8], dann sollte es nur den CALL abarbeiten und in die nächste Zeile,
aber MANCHMAL überspringt es nicht nur den CALL, sondern stoppt erst beim nächsten Haltepunkt.
Und beim Strg+F2 (Debuggen beenden), schließt Delphi einfach so bösartig mein, nicht automatisch, sondern von
MIR manuell geöffneten CPU-Tab.
Ach ja, zu Beginn werden die beiden Variablen A und B initialisiert,
der FInt ist nicht initialisiert (Random), der String aber schon, also wie erwartet ... deswegen ja das TTest.Initialize,
aber ich hätte erwartet, dass vor dem Aufruf der Standard-Code vom delphi kommt, welcher den String initialisiert (NIL).
Hab gerade das Gefühl, als wäre er im BEGIN meiner Initialization-Prpzedur ... sicher bin ich mir noch nicht ... aber irgendwo muß das NIL sich ja verstecken (hoffe ich).
Beim Assign scheint das standardmäßige System.CopyRecord bzw. System.MoveRecord,
oder ein einfacher Register-Kopieren oder System.Move (für einfache Records ohne Managed-Types),
garnicht ausgeführt zu werden und man muß alles manuell machen.
Was passiert wohl, wenn man faul ist .... ähhhhh, ich meine auf Nummer sicher gehen will .... und
Dest := Src;
macht?
Nja, so weit bin ich noch nicht, da das Debuggen keinen Spaß macht und ich noch Stunden benötige, bis ich an der Stelle bin, weil mit vorher alle Finger weh tun.