void kp_cdata_ptr_get(ktap_state_t *ks, ktap_cdata_t *cd, ktap_val_t *key, ktap_val_t *val) { ktap_number idx; csymbol *cs; size_t size; char *addr; csymbol_id cs_id; if (!is_number(key)) { kp_error(ks, "array index should be number\n"); return; } idx = nvalue(key); if (unlikely(idx < 0 || (cd_ptr_nmemb(cd) >= 0 && idx >= cd_ptr_nmemb(cd)))) { kp_error(ks, "array index out of bound\n"); return; } cs_id = csym_ptr_deref_id(cd_csym(ks, cd)); cs = id_to_csym(ks, cs_id); size = csym_size(ks, cs); addr = cd_ptr(cd); addr += size * idx; kp_cdata_init(ks, val, addr, -1, cs_id); kp_cdata_pack(ks, val, addr, cs); }
/* this is a debug function used for check csymbol array */ void ktapc_dump_csymbols() { int i, j, cs_nr; cp_csymbol_state *cs_state; csymbol *cs, *cs_arr; csymbol_func *csf; csymbol_struct *csst; cs_state = ctype_get_csym_state(); cs_arr = cs_state->cs_arr; cs_nr = cs_state->cs_nr; printf("\n----------------------------------------------------\n"); printf("Number of csymbols: %d\n", cs_nr); for (i = 0; i < cs_nr; i++) { cs = &cs_arr[i]; printf("%dth symbol", i); ktapc_dump_csymbol_id("", i); switch (cs->type) { case FFI_PTR: ktapc_dump_csymbol_id("\tDeref", csym_ptr_deref_id(cs)); break; case FFI_FUNC: csf = csym_func(cs); printf("\tAddress: 0x%p\n", csf->addr); ktapc_dump_csymbol_id("\tReturn", csf->ret_id); printf("\tArg number: %d\n", csf->arg_nr); for (j = 0; j < csf->arg_nr; j++) ktapc_dump_csymbol_id("\t\tArg", csf->arg_ids[j]); printf("\tHas variable arg: %d\n", csf->has_var_arg); break; case FFI_STRUCT: case FFI_UNION: csst = csym_struct(cs); printf("\tMember number: %d\n", csst->memb_nr); for (j = 0; j < csst->memb_nr; j++) { printf("\t\tMember %s", csst->members[j].name); if (csst->members[j].len >= 0) printf("(len %d)", csst->members[j].len); ktapc_dump_csymbol_id("", csst->members[j].id); } break; default: break; } } }
/* argument nmemb here indicates the length of array that is pointed to, * -1 for unknown */ ktap_cdata_t *kp_cdata_new_ptr(ktap_state_t *ks, void *addr, int nmemb, csymbol_id id, int to_allocate) { ktap_cdata_t *cd; size_t memb_size; csymbol_id deref_id; cd = kp_cdata_new(ks, id); if (to_allocate) { /* allocate new empty space */ deref_id = csym_ptr_deref_id(id_to_csym(ks, id)); memb_size = csym_size(ks, id_to_csym(ks, deref_id)); cd_ptr(cd) = kp_rawobj_alloc(ks, memb_size * nmemb); } else { cd_ptr(cd) = addr; } cd_ptr_nmemb(cd) = nmemb; return cd; }