Pointer ofNull method naming

Henry Jen henry.jen at oracle.com
Thu Nov 14 04:01:40 UTC 2019


Let me see if I understand correctly, the native API basically have an output and expecting a pointer to receive it. if you don’t care, you can pass NULL as in C, right?

Because the native API accept NULL pointer, that’s why you can use Pointer.ofNull(). As Mauricio mentioned, we are reconsidering if we can just use java null instead of Pointer.ofNull(), which I prefer personally.

Cheers,
Henry

> On Nov 13, 2019, at 4:46 PM, Ty Young <youngty1997 at gmail.com> wrote:
> 
> 
> On 11/13/19 6:01 PM, Maurizio Cimadamore wrote:
>> Sorry, still not getting what you are trying to say. Let's pop back; you have this function:
>> 
>> int foo(Pointer<Pointer<Byte>> array, Pointer<Integer> size);
>> 
>> Can you please explain what this function is expected to do? What are the inputs and what are the outputs? How is 'size' connected 'array'? 
> 
> 
> Pointer<Pointer<Byte>> arrayPointer = Bar.scope().allocate(NativeTypes.CHAR.pointer());
> 
> Pointer<Integer> sizePointer = Bar.scope().allocate(NativeTypes.INT);
> 
> 
> Bar.foo(sizePointer, sizePointer);
> 
> Array<Byte> bytes = arrayPointer.get().withSize(size.get());
> 
> for(int i = 0; i < bytes.length(); i++)
>     System.out.println(bytes.get(i));
> 
> 
> Is how you're supposed to use it, but if you aren't interested in in the bitmask values you can just do:
> 
> 
> arrayPointer.get().get()
> 
> 
> which returns the first array element, saving both a Pointer and array allocation.
> 
> 
> 
>> What is that 'int' return value?
> 
> 
> It's a "Bool" in C. Just returns whether the function call succeeded or not.
> 
> 
>> 
>> I vaguely understand (from your previous emails) that the 'array' is expected to have a certain encoding where first element is 'size' (of what?) 
> 
> 
> It's... complicated. The example provided is extremely simplified. The *actual* function uses 6 parameters, including enums(ints in Java) as well as index values to produce different results for a wide range of things. It's nuts.
> 
> 
> What the byte value at index 0 represents depends on the arguments passed to this unholy abomination of a function, like the number of fans or displays connected. Some of the parameters are even optional.
> 
> 
>> then you have some element bitmasks. But it's not clear whether the 'array' is provided as input by the user, or is expected to be filled by the function (same for 'size').
> 
> 
> Both.
> 
> 
>> 
>> Maurizio
>> 
>> On 13/11/2019 23:01, Ty Young wrote:
>>> 
>>> On 11/13/19 4:28 PM, Maurizio Cimadamore wrote:
>>>> 
>>>> On 13/11/2019 22:15, Ty Young wrote:
>>>>> 
>>>>> On 11/13/19 3:19 PM, Maurizio Cimadamore wrote:
>>>>>> 
>>>>>> On 13/11/2019 12:43, Ty Young wrote:
>>>>>>> 
>>>>>>> On 11/13/19 2:28 AM, Maurizio Cimadamore wrote:
>>>>>>>> I'm ok with making the documentation more precise (I'm not sure I like ofTyped()). Can you please clarify a bit what you mean by 'filler' ? Like passing null ptr to a struct setter?
>>>>>>> 
>>>>>>> 
>>>>>>> Not struct types but more primitive native types like Pointer<Byte> or Pointer<Integer>.
>>>>>>> 
>>>>>>> 
>>>>>>> As an example, you have a function like this:
>>>>>>> 
>>>>>>> 
>>>>>>> int foo(Pointer<Pointer<Byte>> array, Pointer<Integer> size);
>>>>>>> 
>>>>>>> 
>>>>>>> But what you're actually interested in is at index 0 of the array, so "size" isn't needed and allocating a new Pointer would be a waste.
>>>>>> 
>>>>>> Not sure I follow - if you are interested in index 0, doesn't that mean that the array would need to have at least _one_ element (e.g. size >= 1) ?
>>>>> 
>>>>> 
>>>>> It does. It's just that the data that is actually desired is located at index 0, so doing:
>>>>> 
>>>>> 
>>>>> array.get().get()
>>>>> 
>>>>> 
>>>>> returns index 0 anyway.
>>>>> 
>>>>> 
>>>>> For context, the function in question returns a Pointer to an array in the format:
>>>>> 
>>>>> 
>>>>> Index 0 = number of items
>>>>> 
>>>>> index 4 * number of item = bitmask of a given item
>>>> 
>>>> Really confused by this example - if the size is always at position 0 of the array, then what is the second argument Pointer<Integer> used for?
>>> 
>>> 
>>> "size" is the amount of something connected to the system, not the Pointer<Integer> size.
>>> 
>>> 
>>> So the bitmask of item 1 is located at index 4, item 2 at 8, etc. in the array.
>>> 
>>> 
>>>> 
>>>> I'm trying to understand whether this is really a 'new' use for Pointer.ofNull, or whether you are just exploiting the fact that the underlying function you are using happens to work even if the second parameter is null. 
>>> 
>>> 
>>> It does exploit the lack of null checks *technically* although you could just as easily lazily allocate a non null Pointer of the desired type to do the same thing. Would providing something like that be out of API scope?
>>> 
>>> 
>>> Although, it's never explained(nor have I tried it) whether a Pointer allocated from a different scope can be used in another one so maybe that isn't even possible? If it is, then what's the point of Scope class anyway?
>>> 
>>> 
>>>> in other words, I'm having problems understand what you mean by this 'filler' capability of Pointer.ofNull.
>>> 
>>> 
>>> The function requires a pointer be passed even if you aren't interested in what's inside that pointer after calling the function, therefor it's "filler".
>>> 
>>> 
>>>> 
>>>> Maurizio
>>>> 
>>>>> 
>>>>> 
>>>>> However, one might only be interested in index 0 or in this case, the number of items, so allocating another Pointer just to make the function call seems like a waste.
>>>>> 
>>>>> 
>>>>> It seems like *some* functions check whether a given Pointer is null or not but not all do such as the functions I'm working with. It just fills the array Pointer regardless.
>>>>> 
>>>>> 
>>>>>> 
>>>>>> Maurizio
>>>>>> 
>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>> (p.s. in these cases we have been also discussing bringing back special treatment for Java null, so that null is re-interpreted to Pointer.ofNull)
>>>>>>> 
>>>>>>> 
>>>>>>> I haven't gone too deep down the rabbit hole, but I see "LayoutTypeImpl.nullType" in BoundedPointer. Isn't that the null interpretation for a Pointer?
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>> Maurizio
>>>>>>>> 



More information about the panama-dev mailing list