While waiting for a 64 bits Delphi, I am doing experimentation with fpc-Lazarus 64 bits. And this is my problem:

In most of my programs I use my own library for parsing and evaluating floating point functions like

  'x sin(y z)'

passed by the user as strings. The basic organization is as follows:

{---------------simplified code------------}

  TFunctionEvaluator= class(TObject)
      ...
      code: AnsiString;
      ...
    public
         {call the parser}
      function ParseAFunctText(t, vars: AnsiString): AnsiString;

         {call the evaluator}
      V: function(X: array of Double): Double;
  end;

{----------end code------------------------}


Suppose that "theF" is an already created instance of TFunctionEvaluator and suppose that a program calls

  msg:= theF.ParseAFunctText('pi', 'xyz');

Here, 'pi' is the text of the constant funcion that must give 3.14... as result, 'xyz' contains the chars in the function text that the parser should take as independent variables if they appear in t. The result will be an error message "msg" if something fails. Then ParseAFunctText builds "code" and puts

   @V:= PChar(code);

Suppose that a program calls for example

   r:= theF.V([1, 2, 3]);

Then Lazarus (fpc 2.2.4, lazarus 0.9.28.2 beta, target windows 64 bits, mode Delphi) compiles, but it raises an

    'External:SIGSEGV' error.

In the debugger the exception is raised before the effective call of the function code. If then I press F7, then the debugger jumps to the following assemblies

   push    %rbp
   mov     %esp,%ebp
   fldpi                       {loads pi to the fpu}
   ftspl   -0x18(%rbp)         {copy pi to stack}
   movsd   -0x18(%rbp),%xmm0   {copies pi to XMM0, so caller
                               {may find also there the result}
   leaveq
   retq

I have tried all possible combinations like V:= PChar(code), V:= @code[1], etc. to no avail. Thus I think something is wrong in my understanding of the whole business in 64 bits or in fpc-Lazarus, because this is not a problem in Delphi nor it was in an old version of fpc-Lazarus 32 bits. Please give me a tip.
Many thanks in advance.

--
montesin at uv dot es

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

Reply via email to