Use of long in Nashorn
Attila Szegedi
attila.szegedi at oracle.com
Fri Nov 13 14:06:46 UTC 2015
Well, we could just box them in that case. If we only used int and double as primitive number types internally, then a natural representation for a long becomes Long. Java methods returning long could have an optimistic filter that first checks if the value fits in an int (32-bit signed), then in a double (53-bit signed) without loss of precision, and finally deoptimizes to Object and uses Long. int->long->double->Object becomes int->double->Object, with longs of too large magnitude becoming boxed.
Attila.
> On Nov 13, 2015, at 2:46 PM, Jim Laskey (Oracle) <james.laskey at oracle.com> wrote:
>
> The main thing to watch for here is that longs/Longs need to survive unobstructed between Java calls. Remember we ran into trouble in this area (loss of precision when using longs for encoding.)
>
>
>
>
>> On Nov 13, 2015, at 8:26 AM, Attila Szegedi <attila.szegedi at oracle.com> wrote:
>>
>>> On Nov 13, 2015, at 10:31 AM, Hannes Wallnoefer <hannes.wallnoefer at oracle.com> wrote:
>>>
>>> Hi all,
>>>
>>> I'm currently questioning our use of longs to represent numbers in combination with optimistic typing.
>>
>> I often feel that the presence of longs is more hassle than they’re worth. I’d be all for eliminating them.
>>
>>> After all, there's a pretty large range where long arithmetic will be more precise than the doubles required by ECMA.
>>
>> There’s currently several different places in Nashorn where we try to confine the precision of longs to 53 bits (so they aren’t more precise than doubles). It’s a bit of a whack-a-mole where you can’t always be sure whether you found all instances.
>>
>>>
>>> For context see this bug, especially the last two comments (the original bug was about number to string conversion which has been solved in the meantime):
>>>
>>> https://bugs.openjdk.java.net/browse/JDK-8065910
>>>
>>> So the question is: can we use longs at all and be confident that results won't be too precise (and thus, strictly speaking, incorrect)?
>>
>> Internally, the longs are also used for representing UInt32 even in non-optimistic setting, which is only really significant for the >>> operator and array indices and lengths; maybe we should limit longs to that usage only, or even just use doubles internally for UInt32 values that can’t be represented as Int32. FWIW, even for the >>> operator we only need it when shifting by zero, as in every other case the result will have the topmost bit set to 0 and thus fit in Int32 too.
>>
>> I guess once Valhalla rolls around, we could easily have an unsigned 32 bit int type.
>>
>>> Hannes
>>
>> Attila.
>>
>
More information about the nashorn-dev
mailing list