void kp_objclone(ktap_state *ks, const ktap_value *o, ktap_value *newo) { if (ttisbtrace(o)) { ktap_btrace *bt; bt = kp_newbacktrace(ks); bt->nr_entries = btvalue(o)->nr_entries; memcpy(&bt->entries[0], &btvalue(o)->entries[0], sizeof(bt->entries)); setbtvalue(newo, bt); } else { kp_error(ks, "cannot clone ktap value type %d\n", ttype(o)); setnilvalue(newo); } }
void kp_objclone(ktap_state *ks, const ktap_value *o, ktap_value *newo, ktap_gcobject **list) { if (ttisbtrace(o)) { int nr_entries = btvalue(o)->nr_entries; ktap_btrace *bt; bt = kp_newbacktrace(ks, nr_entries, list); memcpy((unsigned long *)(bt + 1), btvalue(o) + 1, nr_entries * sizeof(unsigned long)); setbtvalue(newo, bt); } else { kp_error(ks, "cannot clone ktap value type %d\n", ttype(o)); setnilvalue(newo); } }
static int ktap_lib_backtrace(ktap_state *ks) { struct stack_trace trace; ktap_btrace *bt; bt = kp_percpu_data(KTAP_PERCPU_DATA_BTRACE); trace.nr_entries = 0; trace.skip = 10; trace.max_entries = KTAP_STACK_MAX_ENTRIES; trace.entries = &bt->entries[0]; save_stack_trace(&trace); bt->nr_entries = trace.nr_entries; setbtvalue(ks->top, bt); incr_top(ks); return 1; }