Zitat von
mr2:
Warum?
Private Felder sind nun mal privat und wenn ihr über Trick 17 versucht direkt darauf zuzugreifen, macht ihr damit das ganze Konzept von
OOP & Kapselung zu nichte
Hallo mr2,
wenn ich OLLI richtig verstehe, ist das nicht das eigentliche Problem: Private Felder sind außerhalb des Scopes auch in
ASM nicht sichtbar. Vielmehr scheint er einen performaten Zugriff aus einer Hilfsklasse heraus erreich zu wollen (dies hätte man in C++ mit Friends, in Java mit protected und Packages und in Delphi eben über das selbe
PAS-File erreicht). Darüber hinaus sind solche "17er Tricks", die Du zu meinen scheinst, auch mit purem ObjectPascal hinzubekommen...
[Edit]Inzwischen (ich hab mal wieder zulange getippt) hat OLLI das ja bestätigt
[/EDIT]
Zitat von
OLLI_T:
Es muss doch einen Weg geben, dem Compiler begreiflich zu machen, dass im Register ebx nicht der Zeiger auf das Objekt Self sondern eben ein anderes Objekt steht.
Hallo OLLI,
das sollte so Funktionieren (nur mit D7 getestet):
Delphi-Quellcode:
type
TMyClass =
class
private
FAttribute : Integer;
public
constructor Create(AValue: Integer);
end;
constructor TMyClass.Create(AValue: Integer);
begin
inherited Create;
FAttribute:= AValue;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
myObject: TMyClass;
myInt: Integer;
begin
myObject:= TMyClass.Create(42);
try
asm
mov ebx, myObject
mov eax, TMyClass([ebx]).FAttribute
end
finally
myObject.Free;
end;
end;
in
eax landet, wir erwartet,
0x2a.
Vielleicht kannst Du einmal eine Zuweisung in der Delphi Language schreiben, die Du gerne 1:1 in
ASM hättest?