Pointer ofNull method naming

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Nov 14 12:13:21 UTC 2019


Seems to me that what you have built is something that gives you a bunch 
of constant pointers of the right type - whose contents are left empty 
(and likely not meant to be de-referenceable?).

This seems pretty specific to the use case you envision and the API you 
are interacting with. I can't see this being made available as a part of 
the foreign API.

As for 'what are Scopes for' - I think you might be confused a bit here; 
a scope is a unit of allocation. All stuff crated inside a scope is 
deallocated at once when the scope is closed. There are some 
restrictions on putting pointers from scope A into scope B - but the 
restriction checks that, when you do that, the lifecycle of A is bigger 
than that of B (e.g. make sure that accessing the pointer from B will 
never give you an invalid pointer).

Since your code is using the global scope to allocate - and the global 
scope outlives everything, you can safely store these pointers in any 
other scope. This is not a bug, it's a feature.

Maurizio


On 14/11/2019 11:19, Ty Young wrote:
>
> On 11/13/19 10:01 PM, Henry Jen wrote:
>> 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?
>
>
> Yes, although the fact that the Pointer happens to be Null is kinda 
> irrelevant. What's important is that the Pointer is a singleton of the 
> needed function Pointer type.
>
>
>>
>> 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.
>
>
> As in a straight up "null" value being passed? FWIW, I don't like that 
> idea personally. C source code clearly asks for a null Pointer, not a 
> null value. Code documentation will probably even state this and 
> people will go looking for a Pointer representing a null value, like 
> Pointer.ofNull().
>
>
> (Although Pointer.ofNull conforms to the function argument type using 
> a null layout, not Null which is semi confusing)
>
>
> The differences between what C and Java sees in regards to function 
> calls is already annoyingly painful as-is with enums being converted 
> to ints, forcing you to create Java equivalent enums in order to make 
> function calls humanly readable. Please don't make it any worse.
>
>
> Anyway, I decided to just make what I want/need[1]. I'm still really 
> confused as to what the point of Scopes are, seeing as you can use 
> Pointers from one scope on another scope without issues.
>
>
> [1] https://gist.github.com/BlueGoliath/3fe527ea9bc7df2583a335962a02e1fe
>
>
>>
>> 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