Hello,

These two functions are being used for i386:

// *** Skybuck: Fix Needed (porting issue 582)
function get_frame:pointer;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
asm
 movl    %ebp,%eax
end;

// *** Skybuck: Fix Needed (porting issue 583)
function get_caller_addr(framebp:pointer):pointer; nostackframe;assembler;
asm
{$ifndef REGCALL}
 movl    framebp,%eax
{$endif}
 orl     %eax,%eax
 jz      .Lg_a_null
 movl    4(%eax),%eax
.Lg_a_null:
end;

for the following code in cclasses.pas:

Raise EListError.CreateFmt(Msg,[Data]) at get_caller_addr(get_frame);


I'm not sure what kind of address is being returned here...

So I am taking a guess, would it be ok to replace the functions in Delphi as follows:

function get_caller_addr(framebp:pointer):pointer;
begin
   result := ErrorAddr;
end;

This calls ErrorAddr which is a function in Delphi's system.pas unit which looks as follows:

{ Return current exception address }
function ExceptAddr: Pointer;
begin
 if RaiseListPtr <> nil then
   Result := PRaiseFrame(RaiseListPtr)^.ExceptAddr
 else
   Result := nil;
end;

It seems to return the exception address that way.

Here is more information for the raise frame type:

 PRaiseFrame = ^TRaiseFrame;
 TRaiseFrame = packed record
   NextRaise: PRaiseFrame;
   ExceptAddr: Pointer;
   ExceptObject: TObject;
   ExceptionRecord: PExceptionRecord;
 end;

It also seems to have an exception record field, which again contains another ExceptionAddress inside it... not sure what that is ? Perhaps a nested thing ? or perhaps the same ?


{$IFDEF MSWINDOWS}
type
 PExceptionRecord = ^TExceptionRecord;
 TExceptionRecord = record
   ExceptionCode: Cardinal;
   ExceptionFlags: Cardinal;
   ExceptionRecord: PExceptionRecord;
   ExceptionAddress: Pointer;
   NumberParameters: Cardinal;
   case {IsOsException:} Boolean of
     True:  (ExceptionInformation : array [0..14] of NativeUInt);
     False: (ExceptAddr: Pointer; ExceptObject: Pointer);
 end;
 TExceptClsProc = function(P: PExceptionRecord): Pointer{ExceptClass};
 TExceptObjProc = function(P: PExceptionRecord): Pointer{Exception};
 TRaiseExceptObjProc = procedure(P: PExceptionRecord);

{$IF not defined(CPU386)}
 PContext = Pointer{^TContext};
 PExceptionPointers = ^TExceptionPointers;
 TExceptionPointers = record
   ExceptionRecord: PExceptionRecord;
   ContextRecord: PContext;
 end;
_TDelphiFinallyHandlerProc = function(ExceptionPointers: PExceptionPointers; EstablisherFrame: NativeUInt): Integer;
 _TExceptionHandlerProc = function(ExceptionPointers: PExceptionPointers;
                                   EstablisherFrame: NativeUInt): Integer;
 _TDelphiCatchHandlerProc = function(ExceptionPointers: PExceptionPointers;
EstablisherFrame: NativeUInt; ExceptionObject: Pointer): NativeUInt;
{$IFEND}
{$ENDIF}
{$IFDEF PC_MAPPED_EXCEPTIONS}
type
 PRaisedException = ^TRaisedException;
 TRaisedException = packed record
   RefCount: Integer;
   ExceptObject: TObject;
   ExceptionAddr: Pointer;
   HandlerEBP: LongWord;
   Flags: LongWord;
   Cleanup: Pointer;
   Prev: PRaisedException;
   ReleaseProc: Pointer;
 end;
 PExceptionRecord = PRaisedException;
 TExceptionRecord = TRaisedException;
{$ENDIF}

?

Bye,
Skybuck.
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to