Skip to content

Commit feea33f

Browse files
author
andrey.gruzdev
committed
Delphi for Mac OS 32 tested
stdcall for mac 32 (FPC ignores stdcall and always uses cdecl)
1 parent 7623fe0 commit feea33f

File tree

1 file changed

+26
-31
lines changed

1 file changed

+26
-31
lines changed

PythonForDelphi/Components/Sources/Core/MethodCallBack.pas

+26-31
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ procedure GetCodeMem(var ptr: PByte; size: integer);
180180
page:=VirtualAlloc(nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
181181
{$ELSE}
182182
//page := GetMem(PageSize);
183-
page := mmap($10000000, PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0);
183+
page := mmap(Pointer($10000000), PageSize, PROT_NONE, MAP_PRIVATE or MAP_ANON, -1, 0);
184184
mprotect(page, PageSize, PROT_READ or PROT_WRITE or PROT_EXEC);
185185
{$ENDIF}
186186
page^.next:=CodeMemPages;
@@ -505,15 +505,6 @@ function GetCallBack( self: TObject; method: Pointer;
505505
function GetCallBack( self: TObject; method: Pointer;
506506
argnum: Integer; calltype: tcalltype): Pointer;
507507
const
508-
// Short handling of stdcalls:
509-
S1: array [0..14] of byte = (
510-
$5A, //00 pop edx // pop return address
511-
$B8,0,0,0,0, //01 mov eax, self
512-
$50, //06 push eax
513-
$52, //07 push edx // now push return address
514-
// call the real callback
515-
$B8,0,0,0,0, //08 mov eax, Method
516-
$FF,$E0); //13 jmp eax
517508

518509
//Handling for ctCDECL:
519510
C1: array [0..5] of byte = (
@@ -530,7 +521,7 @@ function GetCallBack( self: TObject; method: Pointer;
530521
// end;
531522

532523
// self parameter
533-
C3: array [0..17] of byte = (
524+
C3: array [0..19] of byte = (
534525
$B8,0,0,0,0, //06+4*s mov eax, self
535526
$50, //11+4*s push eax
536527
// call the real callback
@@ -539,35 +530,30 @@ function GetCallBack( self: TObject; method: Pointer;
539530
// clear stack
540531
$83,$C4,0, //20+4*s add esp, 4+bytes+align
541532
$5D, //23+4*s pop ebp
542-
$C3); //24+4*s ret
543-
544-
533+
$C2,00,00); //24+4*s ret [0]
545534

546535
var
547536
bytes: Word;
548537
i: Integer;
549538
P,Q: PByte;
550539
align : integer;
551540
begin
552-
if calltype = ctSTDCALL then begin
553-
GetCodeMem(Q,15);
554-
P := Q;
555-
move(S1,P^,SizeOf(S1));
556-
Inc(P,2);
557-
move(self,P^,SizeOf(self));
558-
Inc(P,7);
559-
move(method,P^,SizeOf(method));
560-
{Inc(P,6); End of proc}
561-
end else begin {ctCDECL}
541+
// On mac FPC ctSTDCALL and ctCDECL are the same
542+
{$IFDEF FPC}
543+
{$IFDEF MACOS32}
544+
calltype := ctCDECL;
545+
{$ENDIF}
546+
{$ENDIF}
547+
562548
bytes := argnum * 4;
563-
align := ($10 - (bytes + 4{self} + 4{address} + 4{push bp}) and $f) and $f; // align to $10 for Mac compatibility
549+
align := ($10 - (bytes + 4{self} + 4{address} + 4{push bp}) and $f) and $f; // align to $10 for Mac compatibility
564550

565-
GetCodeMem(Q,24+4*argnum);
551+
GetCodeMem(Q,sizeof(c1)+sizeof(c3)+sizeof(c2)*argnum);
566552
P := Q;
567553
move(C1,P^,SizeOf(C1));
568554
Inc(P,SizeOf(C1)-1);
569555
p^ := align;
570-
Inc(P);
556+
Inc(P);
571557
for i:=argnum-1 downto 0 do begin
572558
move(C2,P^,SizeOf(C2));
573559
Inc(P,2);
@@ -580,10 +566,19 @@ function GetCallBack( self: TObject; method: Pointer;
580566
Inc(P,6);
581567
move(method,P^,SizeOf(method));
582568
Inc(P,8);
583-
P^ := 4+bytes+align;
584-
{Inc(P,3); End of proc}
585-
end;
586-
result := Q;
569+
if calltype = ctCDECL then
570+
begin
571+
P^ := 4+bytes+align;
572+
end
573+
else
574+
begin
575+
P^ := {4+}align;
576+
Inc(P,3);
577+
P^ := bytes;
578+
end;
579+
580+
581+
result := Q;
587582
end;
588583
{$ENDIF}
589584

0 commit comments

Comments
 (0)