Thanks.

So the following will give an address+frame of the calling routine ?
    get_caller_addr(get_frame),  get_caller_frame(get_frame)

Dennis

Sven Barth via fpc-pascal wrote:
Dennis <de...@avidsoft.com.hk <mailto:de...@avidsoft.com.hk>> schrieb am Mi., 18. Juli 2018, 17:19:

    The following delphi code when compiled by FPC, raised these errors:
    Compile Project, Target: lib\x86_64-win64\Project1.exe: Exit code 1,
    Errors: 10, Warnings: 2
    StrBuffer.pas(100,19) Error: Unknown identifier "EAX"
    StrBuffer.pas(100,23) Error: Assembler syntax error in operand
    StrBuffer.pas(100,24) Error: Unknown identifier "EBP"
    StrBuffer.pas(100,29) Error: Invalid constant expression
    StrBuffer.pas(100,29) Error: Invalid reference syntax
    StrBuffer.pas(100,29) Warning: No size specified and unable to
    determine
    the size of the operands, using DWORD as default
    StrBuffer.pas(207,19) Error: Unknown identifier "EAX"
    StrBuffer.pas(207,23) Error: Assembler syntax error in operand
    StrBuffer.pas(207,24) Error: Unknown identifier "EBP"
    StrBuffer.pas(207,29) Error: Invalid constant expression
    StrBuffer.pas(207,29) Error: Invalid reference syntax
    StrBuffer.pas(207,29) Warning: No size specified and unable to
    determine
    the size of the operands, using DWORD as default

    Can anyone help me?

    class procedure TStrBuffer.Error(const Msg: string; Data: Integer);

       function ReturnAddr: Pointer;
       asm
               MOV     EAX,[EBP+4]
       end;

    begin
       raise EListError.CreateFmt(Msg, [Data])at ReturnAddr;
    end;


There are two ways to solve this.

The first one is an easy one, however the code still won't be platform independent due to the assembly code. For this simply add "{$asmmode intel}" at the top.

The second solution is cross platform and with correct checks also Delphi compatible:

=== code begin ===
raise EListError.CreateFmt(Msg, [Data]) at
{$ifdef fpc}
get_caller_addr(get_frame),
    get_caller_frame(get_frame)
{$else}
ReturnAddr
{$endif} ;
=== code end ===

Disable the ReturnAddr function also with "{$ifndef fpc}...{$endif}" and you should be set.

Regards,
Sven


_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to