Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> writes:
> Alvaro Herrera <alvherre(at)commandprompt(dot)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:
> [ 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
In response to
pgsql-patches by date
|Next:||From: Alvaro Herrera||Date: 2008-04-18 20:19:24|
|Subject: Re: float4/float8/int64 passed by value with tsearchfixup|
|Previous:||From: Tom Lane||Date: 2008-04-18 19:41:28|
|Subject: Re: float4/float8/int64 passed by value with tsearch fixup |