[PATCH v4] algol68: Add allocation function for leaf objects

Jose E. Marchesi jemarch@gnu.org
Fri Jan 16 09:24:37 GMT 2026


> On Thu, Jan 15, 2026, at 10:09 PM, Jose E. Marchesi wrote:
> ...
>
>>> +  a68_libcall_fn libcall
>>> +    = (HAS_REFS (m) || IS_REF (m)) ? A68_LIBCALL_MALLOC_LEAF : A68_LIBCALL_MALLOC;
>>
>> Can't this just be:
>>
>>       HAS_REFS (m) ? A68_LIBCALL_MALLOC_LEAF : A68_LIBCALL_MALLOC
>
> Yep, REF modes get has_refs set to true on creation.
> ...
>
>>> +  if (IS_ROW (m) || IS_FLEX (m))
>>> +    {
>>> +      for (MOID_T *s = SUB (m); s != NO_MOID; s = SUB (s))
>>> +	{
>>> +	  HAS_REFS (s) = is_mode_has_ref (s);
>>> +	  has_ref |= HAS_REFS (s);
>>> +	}
>>
>> Isn't this doing lots of redundant work?
>>
>> What about:
>>
>>   if (IS_ROW (m) || IS_FLEX (m))
>>     HAS_REFS (m) = is_mode_has_ref (SUB (m));
>>   else if
>>   ...
>>
>> ?
>
> Yes, we don't need to manually recurse into the mode. Hopefully GCC
> will turn this into a tail-call.
>
> ...
>>>  static void
>>> @@ -1185,6 +1215,10 @@ compute_derived_modes (MODULE_T *mod)
>>>    for (z = TOP_MOID (mod); z != NO_MOID; FORWARD (z))
>>>      HAS_ROWS (z) = is_mode_has_row (z);
>>>  
>>> +  /* Find out what modes contain refs.  */
>>> +  for (z = TOP_MOID (mod); z != NO_MOID; FORWARD (z))
>>> +    HAS_REFS (z) = is_mode_has_ref (z);
>>> +
>>
>> Surely these two loops can be merged in one?
>
> How about the one below?
>  
>>>    /* Check flexible modes.  */
>>>    for (z = TOP_MOID (mod); z != NO_MOID; FORWARD (z))
>>>      {

Well, setting the HAS_ROWS and HAS_REFS flags are very similar
operations, hence my suggestion.


>
> Thanks again,
> pietro


More information about the Algol68 mailing list