Re: float4/float8/int64 passed by value with tsearch fixup - Mailing list pgsql-patches

From Tom Lane
Subject Re: float4/float8/int64 passed by value with tsearch fixup
Date
Msg-id 17697.1208549366@sss.pgh.pa.us
Whole thread Raw
In response to Re: float4/float8/int64 passed by value with tsearch fixup  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: float4/float8/int64 passed by value with tsearch fixup
List pgsql-patches
Tom Lane <tgl@sss.pgh.pa.us> writes:
> Alvaro Herrera <alvherre@commandprompt.com> writes:
>> Tom Lane wrote:
>>> Since they're v0, they'd have to explicitly know about the pass-by-ref
>>> status of float4.

>> Well, the previous code was doing some pallocs, and the new code is not:
>> http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/contrib/seg/seg.c.diff?r1=1.20;r2=1.21

> [ shrug... ]  So, you missed something.

Specifically, I think what you missed is that on some platforms C
functions pass or return float values differently from similar-sized
integer or pointer values (typically, the float values get passed in
floating-point registers).  On such platforms it is essentially
impossible for a v0 function to work with pass-by-val float4 ---
since fmgr_oldstyle thinks it's passing integers and getting back
pointers, the values are being transferred in the wrong registers.
The only way to make it work would be to mangle the function
declarations and then play union tricks like those in
Float4GetDatum/DatumGetFloat4, which is certainly not very practical.
It'd be less ugly to convert to v1 calling convention.

(This very likely explains why the Berkeley folk made float4 pass-by-ref
in the first place, a decision that doesn't make a lot of sense if
you don't know about this problem.)

So I think we really do need to offer that compile-time option.
Failing to do so will be tantamount to desupporting v0 functions
altogether, which I don't think we're prepared to do.

            regards, tom lane

pgsql-patches by date:

Previous
From: Tom Lane
Date:
Subject: Re: float4/float8/int64 passed by value with tsearch fixup
Next
From: Alvaro Herrera
Date:
Subject: Re: float4/float8/int64 passed by value with tsearch fixup