Skip to content

Commit 7462ddd

Browse files
committed
Add ark_trace_back()
1 parent 288f995 commit 7462ddd

File tree

4 files changed

+22
-0
lines changed

4 files changed

+22
-0
lines changed

crates/ark/src/debug.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ typedef struct SEXPREC *SEXP;
77

88
const char* ark_print_rs(SEXP x);
99
const char* ark_inspect_rs(SEXP x);
10+
const char* ark_trace_back_rs();
1011
const char* ark_display_value_rs(SEXP x);
1112

1213
const char* ark_print(SEXP x) {
@@ -17,6 +18,10 @@ const char* ark_inspect(SEXP x) {
1718
return ark_inspect_rs(x);
1819
}
1920

21+
const char* ark_trace_back() {
22+
return ark_trace_back_rs();
23+
}
24+
2025
const char* ark_display_value(SEXP x) {
2126
return ark_display_value_rs(x);
2227
}

crates/ark/src/debug.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@ pub extern "C" fn ark_inspect_rs(x: libr::SEXP) -> *const ffi::c_char {
2222
})
2323
}
2424

25+
#[no_mangle]
26+
pub extern "C" fn ark_trace_back_rs() -> *const ffi::c_char {
27+
capture_console_output(|| {
28+
// https://github.com/r-lib/rlang/issues/1059
29+
unsafe {
30+
let fun =
31+
libr::R_GetCCallable(c"rlang".as_ptr(), c"rlang_print_backtrace".as_ptr()).unwrap();
32+
fun(1);
33+
};
34+
})
35+
}
36+
2537
#[no_mangle]
2638
pub extern "C" fn ark_display_value_rs(x: libr::SEXP) -> *const ffi::c_char {
2739
let value = unsafe {

crates/harp/src/utils.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,13 +770,15 @@ pub fn r_subset_vec(x: SEXP, indices: Vec<i64>) -> Result<SEXP> {
770770
extern "C" {
771771
fn ark_print(x: libr::SEXP) -> *const ffi::c_char;
772772
fn ark_inspect(x: libr::SEXP) -> *const ffi::c_char;
773+
fn ark_trace_back() -> *const ffi::c_char;
773774
fn ark_display_value(x: libr::SEXP) -> *const ffi::c_char;
774775
}
775776

776777
#[ensure_used]
777778
pub extern "C" fn _placeholder() {
778779
unsafe { ark_print(libr::R_NilValue) };
779780
unsafe { ark_inspect(libr::R_NilValue) };
781+
unsafe { ark_trace_back() };
780782
unsafe { ark_display_value(libr::R_NilValue) };
781783
}
782784

crates/libr/src/r.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ functions::generate! {
4141
externalRoutines: *const R_ExternalMethodDef
4242
) -> std::ffi::c_int;
4343

44+
pub fn R_GetCCallable(pkg: *const std::ffi::c_char, fun: *const std::ffi::c_char) ->
45+
Option<unsafe extern "C-unwind" fn(std::ffi::c_int) -> *mut std::ffi::c_void>;
46+
4447
pub fn vmaxget() -> *mut std::ffi::c_void;
4548

4649
pub fn vmaxset(arg1: *const std::ffi::c_void);

0 commit comments

Comments
 (0)