|
@@ -1067,24 +1067,47 @@ asm
|
|
movl (%esp),%eax
|
|
movl (%esp),%eax
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
{$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
|
|
{$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
|
|
-function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;nostackframe;assembler;
|
|
|
|
|
|
+function get_caller_addr(framebp:pointer;addr:pointer=nil):pointer;
|
|
|
|
+{$if defined(win32)}
|
|
|
|
+{ Windows has StackTop always properly set }
|
|
|
|
+begin
|
|
|
|
+ if assigned(framebp) and (framebp<=StackTop) and (framebp>=Sptr) then
|
|
|
|
+ Result:=PPointer(framebp+4)^
|
|
|
|
+ else
|
|
|
|
+ Result:=nil;
|
|
|
|
+end;
|
|
|
|
+{$else defined(win32)}
|
|
|
|
+nostackframe;assembler;
|
|
asm
|
|
asm
|
|
orl %eax,%eax
|
|
orl %eax,%eax
|
|
jz .Lg_a_null
|
|
jz .Lg_a_null
|
|
movl 4(%eax),%eax
|
|
movl 4(%eax),%eax
|
|
.Lg_a_null:
|
|
.Lg_a_null:
|
|
end;
|
|
end;
|
|
|
|
+{$endif defined(win32)}
|
|
|
|
|
|
|
|
|
|
{$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
|
|
{$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
|
|
-function get_caller_frame(framebp:pointer;addr:pointer=nil):pointer;nostackframe;assembler;
|
|
|
|
|
|
+function get_caller_frame(framebp:pointer;addr:pointer=nil):pointer;
|
|
|
|
+{$if defined(win32)}
|
|
|
|
+{ Windows has StackTop always properly set }
|
|
|
|
+begin
|
|
|
|
+ if assigned(framebp) and (framebp<=StackTop) and (framebp>=Sptr) then
|
|
|
|
+ Result:=PPointer(framebp)^
|
|
|
|
+ else
|
|
|
|
+ Result:=nil;
|
|
|
|
+end;
|
|
|
|
+{$else defined(win32)}
|
|
|
|
+nostackframe;assembler;
|
|
asm
|
|
asm
|
|
orl %eax,%eax
|
|
orl %eax,%eax
|
|
jz .Lgnf_null
|
|
jz .Lgnf_null
|
|
movl (%eax),%eax
|
|
movl (%eax),%eax
|
|
.Lgnf_null:
|
|
.Lgnf_null:
|
|
end;
|
|
end;
|
|
|
|
+{$endif defined(win32)}
|
|
|
|
|
|
|
|
|
|
{$define FPC_SYSTEM_HAS_SPTR}
|
|
{$define FPC_SYSTEM_HAS_SPTR}
|