Skip to content

Commit b800597

Browse files
committed
Export r_obj_type_friendly()
Closes #1463
1 parent 4ce3dc0 commit b800597

5 files changed

Lines changed: 61 additions & 39 deletions

File tree

NEWS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
* Fixed backtrace display with calls containing long lists of
44
arguments (#1456).
55

6+
* New `r_obj_type_friendly()` function in the C library (#1463). It
7+
interfaces with `obj_type_friendly()` from `compat-obj-type.R` via a
8+
C callable.
9+
610

711
# rlang 1.0.4
812

src/internal/cnd.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,13 @@ r_obj* ffi_new_condition(r_obj* class,
156156
msg = r_chrs.empty_string;
157157
} else if (r_typeof(msg) != R_TYPE_character) {
158158
const char* arg = r_format_error_arg(r_sym("message"));
159-
const char* what = obj_type_friendly(msg);
159+
const char* what = r_obj_type_friendly(msg);
160160
r_abort("%s must be a character vector, not %s.", arg, what);
161161
}
162162

163163
if (r_typeof(class) != R_TYPE_character) {
164164
const char* arg = r_format_error_arg(r_sym("class"));
165-
const char* what = obj_type_friendly(class);
165+
const char* what = r_obj_type_friendly(class);
166166
r_abort("%s must be a character vector, not %s.", arg, what);
167167
}
168168

@@ -202,8 +202,12 @@ r_obj* new_condition_names(r_obj* data) {
202202
return nms;
203203
}
204204

205-
const char* obj_type_friendly(r_obj* x) {
206-
r_obj* out_obj = KEEP(r_eval_with_x(obj_type_friendly_call, x, rlang_ns_env));
205+
const char* rlang_obj_type_friendly_full(r_obj* x, bool value, bool length) {
206+
r_obj* out_obj = KEEP(r_eval_with_xyz(obj_type_friendly_call,
207+
x,
208+
r_lgl(value),
209+
r_lgl(length),
210+
rlang_ns_env));
207211

208212
if (!r_is_string(out_obj)) {
209213
r_stop_unexpected_type(r_typeof(out_obj));
@@ -219,12 +223,11 @@ const char* obj_type_friendly(r_obj* x) {
219223
return out;
220224
}
221225

222-
223226
void rlang_init_cnd(r_obj* ns) {
224227
format_arg_call = r_parse("format_arg(x)");
225228
r_preserve(format_arg_call);
226229

227-
obj_type_friendly_call = r_parse("obj_type_friendly(x)");
230+
obj_type_friendly_call = r_parse("obj_type_friendly(x, y, z)");
228231
r_preserve(obj_type_friendly_call);
229232
}
230233

src/internal/init.c

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -262,49 +262,50 @@ extern uint64_t XXH3_64bits(const void*, size_t);
262262

263263
r_visible
264264
void R_init_rlang(DllInfo* dll) {
265-
R_RegisterCCallable("rlang", "rlang_arg_match", (DL_FUNC) &arg_match_legacy);
266-
R_RegisterCCallable("rlang", "rlang_arg_match_2", (DL_FUNC) &cci_arg_match);
267-
R_RegisterCCallable("rlang", "rlang_as_data_mask_3.0.0", (DL_FUNC) &ffi_as_data_mask);
268-
R_RegisterCCallable("rlang", "rlang_as_data_pronoun", (DL_FUNC) &ffi_as_data_pronoun);
269-
R_RegisterCCallable("rlang", "rlang_env_unbind", (DL_FUNC) &r_env_unbind);
270-
R_RegisterCCallable("rlang", "rlang_eval_tidy", (DL_FUNC) &rlang_eval_tidy);
271-
R_RegisterCCallable("rlang", "rlang_format_error_arg", (DL_FUNC) &rlang_format_error_arg);
272-
R_RegisterCCallable("rlang", "rlang_is_quosure", (DL_FUNC) &is_quosure);
273-
R_RegisterCCallable("rlang", "rlang_names_as_unique", (DL_FUNC) &names_as_unique);
274-
R_RegisterCCallable("rlang", "rlang_new_data_mask_3.0.0", (DL_FUNC) &ffi_new_data_mask);
275-
R_RegisterCCallable("rlang", "rlang_new_quosure", (DL_FUNC) &ffi_new_quosure);
276-
R_RegisterCCallable("rlang", "rlang_quo_get_env", (DL_FUNC) &ffi_quo_get_env);
277-
R_RegisterCCallable("rlang", "rlang_quo_get_expr", (DL_FUNC) &ffi_quo_get_expr);
278-
R_RegisterCCallable("rlang", "rlang_quo_set_env", (DL_FUNC) &ffi_quo_set_env);
279-
R_RegisterCCallable("rlang", "rlang_quo_set_expr", (DL_FUNC) &ffi_quo_set_expr);
280-
R_RegisterCCallable("rlang", "rlang_stop_internal", (DL_FUNC) &rlang_stop_internal);
281-
R_RegisterCCallable("rlang", "rlang_stop_internal2", (DL_FUNC) &rlang_stop_internal2);
265+
R_RegisterCCallable("rlang", "rlang_arg_match", (DL_FUNC) &arg_match_legacy);
266+
R_RegisterCCallable("rlang", "rlang_arg_match_2", (DL_FUNC) &cci_arg_match);
267+
R_RegisterCCallable("rlang", "rlang_as_data_mask_3.0.0", (DL_FUNC) &ffi_as_data_mask);
268+
R_RegisterCCallable("rlang", "rlang_as_data_pronoun", (DL_FUNC) &ffi_as_data_pronoun);
269+
R_RegisterCCallable("rlang", "rlang_env_unbind", (DL_FUNC) &r_env_unbind);
270+
R_RegisterCCallable("rlang", "rlang_eval_tidy", (DL_FUNC) &rlang_eval_tidy);
271+
R_RegisterCCallable("rlang", "rlang_format_error_arg", (DL_FUNC) &rlang_format_error_arg);
272+
R_RegisterCCallable("rlang", "rlang_is_quosure", (DL_FUNC) &is_quosure);
273+
R_RegisterCCallable("rlang", "rlang_names_as_unique", (DL_FUNC) &names_as_unique);
274+
R_RegisterCCallable("rlang", "rlang_new_data_mask_3.0.0", (DL_FUNC) &ffi_new_data_mask);
275+
R_RegisterCCallable("rlang", "rlang_new_quosure", (DL_FUNC) &ffi_new_quosure);
276+
R_RegisterCCallable("rlang", "rlang_obj_type_friendly_full", (DL_FUNC) &rlang_obj_type_friendly_full);
277+
R_RegisterCCallable("rlang", "rlang_quo_get_env", (DL_FUNC) &ffi_quo_get_env);
278+
R_RegisterCCallable("rlang", "rlang_quo_get_expr", (DL_FUNC) &ffi_quo_get_expr);
279+
R_RegisterCCallable("rlang", "rlang_quo_set_env", (DL_FUNC) &ffi_quo_set_env);
280+
R_RegisterCCallable("rlang", "rlang_quo_set_expr", (DL_FUNC) &ffi_quo_set_expr);
281+
R_RegisterCCallable("rlang", "rlang_stop_internal", (DL_FUNC) &rlang_stop_internal);
282+
R_RegisterCCallable("rlang", "rlang_stop_internal2", (DL_FUNC) &rlang_stop_internal2);
282283

283284
r_obj* r_as_function(r_obj* x, const char* arg);
284-
R_RegisterCCallable("rlang", "rlang_as_function", (DL_FUNC) &r_as_function);
285+
R_RegisterCCallable("rlang", "rlang_as_function", (DL_FUNC) &r_as_function);
285286

286-
R_RegisterCCallable("rlang", "rlang_xxh3_64bits", (DL_FUNC) &XXH3_64bits);
287+
R_RegisterCCallable("rlang", "rlang_xxh3_64bits", (DL_FUNC) &XXH3_64bits);
287288

288289
// Maturing
289-
R_RegisterCCallable("rlang", "rlang_env_dots_list", (DL_FUNC) &rlang_env_dots_list);
290-
R_RegisterCCallable("rlang", "rlang_env_dots_values", (DL_FUNC) &rlang_env_dots_values);
291-
R_RegisterCCallable("rlang", "rlang_is_splice_box", (DL_FUNC) &is_splice_box);
292-
R_RegisterCCallable("rlang", "rlang_obj_encode_utf8", (DL_FUNC) &obj_encode_utf8);
293-
R_RegisterCCallable("rlang", "rlang_str_as_symbol", (DL_FUNC) &r_str_as_symbol);
294-
R_RegisterCCallable("rlang", "rlang_sym_as_character", (DL_FUNC) &ffi_sym_as_character);
295-
R_RegisterCCallable("rlang", "rlang_sym_as_string", (DL_FUNC) &ffi_sym_as_string);
296-
R_RegisterCCallable("rlang", "rlang_unbox", (DL_FUNC) &rlang_unbox);
290+
R_RegisterCCallable("rlang", "rlang_env_dots_list", (DL_FUNC) &rlang_env_dots_list);
291+
R_RegisterCCallable("rlang", "rlang_env_dots_values", (DL_FUNC) &rlang_env_dots_values);
292+
R_RegisterCCallable("rlang", "rlang_is_splice_box", (DL_FUNC) &is_splice_box);
293+
R_RegisterCCallable("rlang", "rlang_obj_encode_utf8", (DL_FUNC) &obj_encode_utf8);
294+
R_RegisterCCallable("rlang", "rlang_str_as_symbol", (DL_FUNC) &r_str_as_symbol);
295+
R_RegisterCCallable("rlang", "rlang_sym_as_character", (DL_FUNC) &ffi_sym_as_character);
296+
R_RegisterCCallable("rlang", "rlang_sym_as_string", (DL_FUNC) &ffi_sym_as_string);
297+
R_RegisterCCallable("rlang", "rlang_unbox", (DL_FUNC) &rlang_unbox);
297298

298299
// Experimental
299-
R_RegisterCCallable("rlang", "rlang_squash_if", (DL_FUNC) &r_squash_if);
300+
R_RegisterCCallable("rlang", "rlang_squash_if", (DL_FUNC) &r_squash_if);
300301

301302
// Compatibility
302-
R_RegisterCCallable("rlang", "rlang_as_data_mask", (DL_FUNC) &ffi_as_data_mask_compat);
303-
R_RegisterCCallable("rlang", "rlang_new_data_mask", (DL_FUNC) &ffi_new_data_mask_compat);
303+
R_RegisterCCallable("rlang", "rlang_as_data_mask", (DL_FUNC) &ffi_as_data_mask_compat);
304+
R_RegisterCCallable("rlang", "rlang_new_data_mask", (DL_FUNC) &ffi_new_data_mask_compat);
304305

305306
// Only for debugging - no stability guaranteed
306-
R_RegisterCCallable("rlang", "rlang_print_backtrace", (DL_FUNC) &rlang_print_backtrace);
307-
R_RegisterCCallable("rlang", "rlang_env_print", (DL_FUNC) &rlang_env_print);
307+
R_RegisterCCallable("rlang", "rlang_print_backtrace", (DL_FUNC) &rlang_print_backtrace);
308+
R_RegisterCCallable("rlang", "rlang_env_print", (DL_FUNC) &rlang_env_print);
308309

309310
R_registerRoutines(dll, NULL, r_callables, NULL, externals);
310311
R_useDynamicSymbols(dll, FALSE);

src/rlang/cnd.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ void r_init_library_cnd() {
159159
r_stop_internal = (r_stop_internal_t) R_GetCCallable("rlang", "rlang_stop_internal2");
160160

161161
r_format_error_arg = (const char* (*)(r_obj*)) r_peek_c_callable("rlang", "rlang_format_error_arg");
162+
r_obj_type_friendly_full = (const char* (*)(r_obj*, bool, bool)) r_peek_c_callable("rlang", "rlang_obj_type_friendly_full");
162163
}
163164

164165
r_no_return
@@ -172,6 +173,7 @@ static
172173
r_obj* cnd_signal_call = NULL;
173174

174175
const char* (*r_format_error_arg)(r_obj* arg) = NULL;
176+
const char* (*r_obj_type_friendly_full)(r_obj* x, bool value, bool length) = NULL;
175177

176178
const char* r_format_lazy_error_arg(struct r_lazy arg) {
177179
r_obj* ffi_arg = KEEP(r_lazy_eval(arg));

src/rlang/cnd.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,21 @@ void r_no_return r_abort_call(r_obj* call, const char* fmt, ...);
1313

1414
// Formats input as an argument, using cli if available. Returns a
1515
// vmax-protected string.
16-
extern const char* (*r_format_error_arg)(r_obj* arg);
16+
extern
17+
const char* (*r_format_error_arg)(r_obj* arg);
18+
1719
const char* r_format_lazy_error_arg(struct r_lazy arg);
1820

21+
// Return vmax-protected strings
22+
extern
23+
const char* (*r_obj_type_friendly_full)(r_obj* x, bool value, bool length);
24+
25+
static inline
26+
const char* r_obj_type_friendly(r_obj* x) {
27+
return r_obj_type_friendly_full(x, true, false);
28+
}
29+
30+
1931
extern
2032
r_no_return
2133
void (*r_stop_internal)(const char* file,

0 commit comments

Comments
 (0)