static int ktap_lib_pairs(ktap_state *ks) { ktap_value *v = kp_arg(ks, 1); ktap_table *t; if (G(ks)->mainthread != ks) { kp_error(ks, "only mainthread can call table pairs\n"); return -1; } if (ttistable(v)) { t = hvalue(v); } else if (ttisaggrtable(v)) { t = kp_aggrtable_synthesis(ks, ahvalue(v)); } else if (isnil(v)) { kp_error(ks, "table is nil in pairs\n"); return 0; } else { kp_error(ks, "wrong argument for pairs\n"); return 0; } setfvalue(ks->top++, ktap_lib_next); sethvalue(ks->top++, t); setnilvalue(ks->top++); return 3; }
static void settable(ktap_state *ks, const ktap_value *t, ktap_value *key, StkId val) { if (ttistable(t)) { kp_table_setvalue(ks, hvalue(t), key, val); } else if (ttisaggrtable(t)) { kp_aggrtable_set(ks, ahvalue(t), key, val); } else { kp_error(ks, "set key to non-table\n"); } }
static void gettable(ktap_state *ks, const ktap_value *t, ktap_value *key, StkId val) { if (ttistable(t)) { setobj(val, kp_table_get(hvalue(t), key)); } else if (ttisaggrtable(t)) { kp_aggrtable_get(ks, ahvalue(t), key, val); } else { kp_error(ks, "get key from non-table\n"); } }
static int ktap_lib_histogram(ktap_state *ks) { ktap_value *v = kp_arg(ks, 1); if (G(ks)->mainthread != ks) { kp_error(ks, "only mainthread can call table historgram\n"); return -1; } if (ttistable(v)) kp_table_histogram(ks, hvalue(v)); else if (ttisaggrtable(v)) kp_aggrtable_histogram(ks, ahvalue(v)); return 0; }
void kp_showobj(ktap_state *ks, const ktap_value *v) { switch (ttype(v)) { case KTAP_TNIL: kp_puts(ks, "nil"); break; case KTAP_TNUMBER: kp_printf(ks, "%ld", nvalue(v)); break; case KTAP_TBOOLEAN: kp_puts(ks, (bvalue(v) == 1) ? "true" : "false"); break; case KTAP_TLIGHTUSERDATA: kp_printf(ks, "0x%lx", (unsigned long)pvalue(v)); break; case KTAP_TLCF: kp_printf(ks, "0x%lx", (unsigned long)fvalue(v)); break; case KTAP_TSHRSTR: case KTAP_TLNGSTR: kp_puts(ks, svalue(v)); break; case KTAP_TUSERDATA: kp_printf(ks, "0x%lx", (unsigned long)uvalue(v)); break; case KTAP_TTABLE: kp_table_dump(ks, hvalue(v)); break; #ifdef __KERNEL__ case KTAP_TEVENT: kp_transport_event_write(ks, evalue(v)); break; case KTAP_TBTRACE: kp_btrace_dump(ks, btvalue(v)); break; case KTAP_TAGGRTABLE: kp_aggrtable_dump(ks, ahvalue(v)); break; case KTAP_TAGGRACCVAL: kp_aggraccval_dump(ks, aggraccvalue(v)); break; #endif default: kp_error(ks, "print unknown value type: %d\n", ttype(v)); break; } }