/* Gets the flag for whether to free a string after a call or not. */ static MVMint16 get_str_free_flag(MVMThreadContext *tc, MVMObject *info) { MVMString *flag = tc->instance->str_consts.free_str; if (MVM_repr_exists_key(tc, info, flag)) if (!MVM_repr_get_int(tc, MVM_repr_at_key_o(tc, info, flag))) return MVM_NATIVECALL_ARG_NO_FREE_STR; return MVM_NATIVECALL_ARG_FREE_STR; }
/* Gets the flag for whether an arg is rw or not. */ static MVMint16 get_rw_flag(MVMThreadContext *tc, MVMObject *info) { MVMString *flag = tc->instance->str_consts.rw; if (MVM_repr_exists_key(tc, info, flag)) { if (MVM_repr_get_int(tc, MVM_repr_at_key_o(tc, info, flag))) return MVM_NATIVECALL_ARG_RW; } return MVM_NATIVECALL_ARG_NO_RW; }
static void code_pair_configure_container_spec(MVMThreadContext *tc, MVMSTable *st, MVMObject *config) { CodePairContData *data = (CodePairContData *)st->container_data; MVMROOT(tc, config, { MVMString *fetch = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "fetch"); MVMString *store; if (!MVM_repr_exists_key(tc, config, fetch)) MVM_exception_throw_adhoc(tc, "Container spec 'code_pair' must be configured with a fetch"); MVM_ASSIGN_REF(tc, &(st->header), data->fetch_code, MVM_repr_at_key_o(tc, config, fetch)); store = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "store"); if (!MVM_repr_exists_key(tc, config, store)) MVM_exception_throw_adhoc(tc, "Container spec 'code_pair' must be configured with a store"); MVM_ASSIGN_REF(tc, &(st->header), data->store_code, MVM_repr_at_key_o(tc, config, store)); });
/* Gets the flag for whether an arg is rw or not. */ static MVMint16 get_refresh_flag(MVMThreadContext *tc, MVMObject *info) { MVMString *typeobj_str = tc->instance->str_consts.typeobj; if (MVM_repr_exists_key(tc, info, typeobj_str)) { MVMObject *typeobj = MVM_repr_at_key_o(tc, info, typeobj_str); if (REPR(typeobj)->ID == MVM_REPR_ID_MVMCArray) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)STABLE(typeobj)->REPR_data; /* No need to refresh numbers. They're stored directly in the array. */ if (repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_NUMERIC) return MVM_NATIVECALL_ARG_NO_REFRESH; return MVM_NATIVECALL_ARG_REFRESH; } } /* We don't know, so fail safe by assuming we have to refresh */ return MVM_NATIVECALL_ARG_REFRESH; }