Generic (void *)int
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Feb 18 11:24:51 UTC 2019
Hi Giuseppe,
To generalize Jorn's trick, you can write a generic method like this:
Pointer<?> makePointer(Scope sc, long value) {
return
sc.allocate(NativeType.VOID).set(value).cast(NativeTypes.VOID).cast(NativeTypes.VOID.pointer()).get();
}
I think this does what you want.
As Jorn said, this is not 100% the same as in C code - as this will
actually allocate a pointer to long, set the long to the desired value,
then view it as pointer to pointer to void (so that the desired value
will be used as an address).
While an API can be added for this, we must also thread carefully -
there's a balance here between allowing common C idioms and safety - if
we make it too easy to create pointers to 'random' addresses, we also
make it easy for people to shoot themselves in the foot.
Also, in terms of API evolution, we should refrain from thinking that
pointer === address; there might be pointers (such as heap pointers)
whose notion of 'address' is more blurry. An heap pointer expresses its
address a pair of base Object + offset, so just creating a pointer out
of thin air with a long won't work there.
Maurizio
On 18/02/2019 09:56, Jorn Vernee wrote:
> Hi Giuseppe,
>
> You should be able to use this trick:
>
> long pointerValue = 12L; // e.g.
> Scope scope = Scope.newNativeScope; // or
> Scope.globalScope().fork() depending on which version you are
> Pointer<Long> ptr = scope.allocate(NativeTypes.UINT64);
> ptr.set(pointerValue);
> Pointer<?> result =
> ptr.cast(NativeTypes.VOID).cast(NativeTypes.VOID.pointer()).get();
> // use 'result'
>
> Be aware that this does do an allocation of a 64 bit int, so you might
> want to reuse the allocated space if you create a lot of pointers from
> literals.
>
> Maybe in the future we can add an API for creating pointers from long
> literals directly.
>
> Jorn
>
> Giuseppe Barbieri schreef op 2019-02-18 10:44:
>> Thanks Sundar,
>>
>> that works flawless for `(void *)0`
>>
>> But now I also would need a generic solution, for example:
>>
>> (void *)12
>>
>> There is a sill opengl call ( glVertexPointer ) requesting explicitely
>> that: https://stackoverflow.com/a/8283855/1047713
>>
>> Signature:
>>
>> void glVertexAttribPointer(int index, int size, int type, byte
>> normalized, int stride, Pointer<?> pointer);
>>
>>
>> is there actually a way?
>>
>>
>>
>>
>>
>>
>> You can use Pointer.nullPointer() method.
>>
>> -Sundar
>>
>> On 18/02/19, 8:09 AM, Giuseppe Barbieri wrote:
>>> Hi,
>>>
>>> I'm looking for a way to convert this:
>>>
>>> (void*)0
>>>
>>> in Java.
>>>
>>> I tried to allocate a pointer and set its value to 0, but it didnt work
>>>
>>> Any ideas, guys?
>>>
>>> Thanks in advance
More information about the panama-dev
mailing list