Browse Source

Use need system macro FPC_LOCALS_ARE_STACK_REG_RELATIVE for mips support

git-svn-id: trunk@21898 -
pierre 13 years ago
parent
commit
edcb02b571
2 changed files with 44 additions and 6 deletions
  1. 22 2
      packages/fv/src/outline.pas
  2. 22 4
      packages/fv/src/views.pas

+ 22 - 2
packages/fv/src/outline.pas

@@ -333,7 +333,17 @@ end;
 function Toutlineviewer.firstthat(test:pointer):pointer;
 
 begin
-  firstthat:=do_recurse(test,get_caller_frame(get_frame),true);
+  firstthat:=do_recurse(test,
+      { On most systems, locals are accessed relative to base pointer,
+        but for MIPS cpu, they are accessed relative to stack pointer.
+        This needs adaptation for so low level routines,
+        like MethodPointerLocal and related objects unit functions. }
+{$ifndef FPC_LOCALS_ARE_STACK_REG_RELATIVE}
+      get_caller_frame(get_frame,get_pc_addr)
+{$else}
+      get_frame
+{$endif}
+      ,true);
 end;
 
 procedure Toutlineviewer.focused(i:sw_integer);
@@ -345,7 +355,17 @@ end;
 procedure Toutlineviewer.foreach(action:pointer);
 
 begin
-  do_recurse(action,get_caller_frame(get_frame),false);
+  do_recurse(action,
+      { On most systems, locals are accessed relative to base pointer,
+        but for MIPS cpu, they are accessed relative to stack pointer.
+        This needs adaptation for so low level routines,
+        like MethodPointerLocal and related objects unit functions. }
+{$ifndef FPC_LOCALS_ARE_STACK_REG_RELATIVE}
+      get_caller_frame(get_frame,get_pc_addr)
+{$else}
+      get_frame
+{$endif}
+      ,false);
 end;
 
 function Toutlineviewer.getchild(node:pointer;i:sw_integer):pointer;

+ 22 - 4
packages/fv/src/views.pas

@@ -2111,8 +2111,17 @@ BEGIN
      Tp := Last;                                      { Set temporary ptr }
      Repeat
        Tp := Tp^.Next;                                { Get next view }
-       IF Byte(Longint(CallPointerMethodLocal(P,get_caller_frame(
-                 get_frame,get_pc_addr),@self,Tp)))<>0 THEN
+       IF Byte(Longint(CallPointerMethodLocal(P,
+         { On most systems, locals are accessed relative to base pointer,
+           but for MIPS cpu, they are accessed relative to stack pointer.
+           This needs adaptation for so low level routines,
+           like MethodPointerLocal and related objects unit functions. }
+{$ifndef FPC_LOCALS_ARE_STACK_REG_RELATIVE}
+         get_caller_frame(get_frame,get_pc_addr)
+{$else}
+         get_frame
+{$endif}
+         ,@self,Tp)))<>0 THEN
         Begin       { Test each view }
           FirstThat := Tp;                             { View returned true }
           Exit;                                        { Now exit }
@@ -2307,8 +2316,17 @@ BEGIN
        if tp=nil then
         exit;
        Hp:=Tp^.Next;                        { Get next view }
-       CallPointerMethodLocal(P,get_caller_frame(
-               get_frame,get_pc_addr),@self,Tp);
+       CallPointerMethodLocal(P,
+         { On most systems, locals are accessed relative to base pointer,
+           but for MIPS cpu, they are accessed relative to stack pointer.
+           This needs adaptation for so low level routines,
+           like MethodPointerLocal and related objects unit functions. }
+{$ifndef FPC_LOCALS_ARE_STACK_REG_RELATIVE}
+         get_caller_frame(get_frame,get_pc_addr)
+{$else}
+         get_frame
+{$endif}
+         ,@self,Tp);
      Until (Tp=L0);                                   { Until last }
    End;
 END;