__exec_obj_fn : comunicare verso oggetti locali
Come abbiamo scritto, un oggetto locale è noto attraverso la sua istanza, cioè un puntatore ad un oggetto di interfaccia OPERATION_CALL; in questo caso si usa la macro variadic __exec_obj_fn definita anch’essa in CLB_language.h:
#define __exec_obj_fn(...) test_request::exec_obj_fn(__VA_ARGS__,_$end)
In questo caso il primo argomento sarà un puntatore obj_ptr all’oggetto chiamato, seguito dalla serie di argomenti definiti:
(obj_ptr, func_name, [op_id], [args])
Ad esempio:
.. __arg_value ret = __exec_obj_fn(doc, _$create, _$color_table, _$mask, _$str->mask_name.Value(), _$str->mask_name.Value()); ..
Nel frammento di codice l’oggetto chiamato è un SPECTRAL_IMAGE doc al quale si richiede di creare una tabella colori da una mask della quale è indicato il nome ;
Le macro __exec_obj_fn e __exec_global_fn rimandano un tipo __arg_value (void *) definito dall’oggetto chiamato, e riconoscibile dal chiamante per operazioni successive; spesso il valore ritornato è _$true o _$false, e l’individuazione di questi valori può essere fatto usando le macro __is_true e __is_false , come si vede nell’esempio reale tratto dal codice di Colibri:
static void CREATE_TABLE(CLASS_STR) { DOC_MASK_LIST *list=IMG->GetMaskList(); if (!list) return; for (int i=0;i<list->Num();i++) { MSK *msk=list->GetMask(i); if (msk->flags.GetBit(LY_SEL)) { __arg_value ret = __exec_obj_fn((OPERATION_CALL *)IMG, _$create, _$color_table, _$mask, msk->id.Value(), msk->id.Value()); __is_true(ret) { ........ ........ } return; } } }