<html>
<head>
<meta http-equiv="content-type" content="text/html;
charset=ISO-8859-15">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Hi there.<br>
<br>
This is a cross-post (cross-mail ?) to <a
class="moz-txt-link-freetext"
href="http://www.lazarus.freepascal.org/index.php/topic,17978.0.html">http://www.lazarus.freepascal.org/index.php/topic,17978.0.html</a>
as I got the hint there that it might be better to ask on the list
instead of in the forum, at least concerning the calling conventions
- but I'll ask the whole lot, anyway; I hope that's ok (and, yes, I
made the mistake to ask on the Lazarus list before, so I sincerely
hope I won't bother the wrong people again, sorry)<br>
<br>
Question: <br>
Is there any difference in the calling convention on x64-Systems
between Delphi and Lazarus? I could only find the "standard"
information on Windows x64 calling conventions, without special care
of constructors, if there is any.<br>
<br>
The reason why I'm asking is the following: <br>
I'm trying to get PascalScript running (completely, it does up to
some extend) on Win x64. I had to do some changes in x64.inc, see
below - but as far as I know, that should work - and it does, for
all kinds of calls, except calling constructors on Components.<br>
Scripts like the following will crash the Program with a SIGSEGV.<br>
<br>
<pre style="margin: 0; padding: 0;"><code class="bbc_code">program Script;
var
f:TForm;
b:TButton;
begin
f:=TForm.CreateNew(nil); //<- Works
b:=TButton.Create(f); //<- crash
b.Parent:=f;
f.Show;
end.</code></pre>
<br>
Crash in the Program is here:<br>
<br>
<pre style="margin: 0; padding: 0;"><code class="bbc_code">CLASSES_TCOMPONENT_$__INSERTCOMPONENT$TCOMPONENT
000000000044F900 4883ec38 sub $0x38,%rsp
000000000044F904 48895c2420 mov %rbx,0x20(%rsp)
000000000044F909 4889742428 mov %rsi,0x28(%rsp)
000000000044F90E 4889cb mov %rcx,%rbx
000000000044F911 4889d6 mov %rdx,%rsi
000000000044F914 4889da mov %rbx,%rdx
000000000044F917 4889f1 mov %rsi,%rcx
000000000044F91A 4889f0 mov %rsi,%rax
000000000044F91D 488b00 mov (%rax),%rax
000000000044F920 ff9068010000 callq *0x168(%rax) <-- crash</code><tt> </tt>
</pre>
<br>
The same Script runs fine when the Application was compiled with x86
Lazarus 1.0. By the way: creating a TObject with e.g.
o:=TObject.Create doesn't break at al.<br>
<br>
Interestingly (and that is how I came to ask about the calling
conventions), when I start debugging
<SomeClass>.Create(aOwner:TComponent)-Type of Constructors,
there is some difference in the Register values, depending on
whether the Constructor was called from "pure" FPC-Code or the
Script (at least so it seems):<br>
<br>
o Called from FPC: rcx: 0 (nil), rdx: Class Reference, r8: Value of
aOwner<br>
o Called from Script: rcx: Class Reference, rdx: 1 (!?), r8: Value
of aOwner (at least so it seems)<br>
<br>
Did anybody else stumble about that problem before? <br>
<br>
Thanks for your help!<br>
<br>
<br>
I can compile the downloadable latest stable version from
RemObject's website (the one with the EXE-Installer) as well as the
latest development version from <a
href="https://github.com/remobjects/pascalscript" class="bbc_link"
target="_blank">https://github.com/remobjects/pascalscript</a> OR
(that's not in the Forum) the PascalScript-version included in
Lazarus' SVN, no Problem there, after two small changes in x64.inc
(see below). My knowledge of Assembler is limited at best, but It
works for calling other types of methods...<br>
<br>
<tt>Index: x64.inc</tt><tt><br>
</tt><tt>===================================================================</tt><tt><br>
</tt><tt>--- x64.inc (revision 38441)</tt><tt><br>
</tt><tt>+++ x64.inc (working copy)</tt><tt><br>
</tt><tt>@@ -14,7 +14,7 @@</tt><tt><br>
</tt><tt> _RCX, _RDX, _R8, _R9: IPointer;</tt><tt><br>
</tt><tt> var _XMM0: Double;</tt><tt><br>
</tt><tt> _XMM1, _XMM2, _XMM3: Double;</tt><tt><br>
</tt><tt>- aStack: Pointer; aItems: IntPtr); assembler; {$IFDEF
FPC}nostackframe;{$ENDIF}</tt><tt><br>
</tt><tt>+ aStack: Pointer; aItems: PtrUInt); assembler; {$IFDEF
FPC}nostackframe;{$ENDIF}</tt><tt><br>
</tt><tt> asm</tt><tt><br>
</tt><tt> (* Registers:</tt><tt><br>
</tt><tt> RCX: Address</tt><tt><br>
</tt><tt>@@ -37,7 +37,7 @@</tt><tt><br>
</tt><tt> mov rdx, aStack</tt><tt><br>
</tt><tt> jmp @compareitems</tt><tt><br>
</tt><tt> @work:</tt><tt><br>
</tt><tt>- push [rdx]</tt><tt><br>
</tt><tt>+ push qword ptr [rdx]</tt><tt><br>
</tt><tt> dec rcx</tt><tt><br>
</tt><tt> sub rdx,8</tt><tt><br>
</tt><tt> @compareitems:</tt><br>
<br>
</body>
</html>