Browse Source

* more robust get_caller_frame and get_caller_addr for win32 which has always a valid StackTop value

git-svn-id: trunk@21919 -
florian 13 years ago
parent
commit
a5754ed02b
1 changed files with 25 additions and 2 deletions
  1. 25 2
      rtl/i386/i386.inc

+ 25 - 2
rtl/i386/i386.inc

@@ -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}