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); }
void kp_cdata_ptr_set(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; 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 = csym_ptr_deref(ks, cd_csym(ks, cd)); if (kp_cdata_type_match(ks, cs, val)) { kp_error(ks, "array member should be %s type\n", csym_name(cs)); return; } size = csym_size(ks, cs); addr = cd_ptr(cd); addr += size * idx; kp_cdata_unpack(ks, addr, cs, val); }
void kp_cdata_dump(ktap_state_t *ks, ktap_cdata_t *cd) { switch (cd_type(ks, cd)) { case FFI_UINT8: case FFI_INT8: kp_printf(ks, "c int(0x%01x)", cd_int(cd)); break; case FFI_UINT16: case FFI_INT16: kp_printf(ks, "c int(0x%02x)", cd_int(cd)); break; case FFI_UINT32: case FFI_INT32: kp_printf(ks, "c int(0x%04x)", cd_int(cd)); break; case FFI_UINT64: case FFI_INT64: kp_printf(ks, "c int(0x%08x)", cd_int(cd)); break; case FFI_PTR: kp_printf(ks, "c pointer(0x%p)", cd_ptr(cd)); break; case FFI_STRUCT: kp_printf(ks, "c struct(0x%p)", cd_struct(cd)); break; case FFI_UNION: kp_printf(ks, "c union(0x%p)", cd_union(cd)); break; default: kp_printf(ks, "unsupported cdata type %d!\n", cd_type(ks, cd)); } }
static void kp_cdata_value(ktap_state_t *ks, ktap_val_t *val, void **out_addr, size_t *out_size, void **temp) { ktap_cdata_t *cd; csymbol *cs; ffi_type type; switch (ttypenv(val)) { case KTAP_TYPE_BOOLEAN: *out_addr = &bvalue(val); *out_size = sizeof(int); return; case KTAP_TYPE_LIGHTUSERDATA: *out_addr = pvalue(val); *out_size = sizeof(void *); return; case KTAP_TYPE_NUMBER: *out_addr = &nvalue(val); *out_size = sizeof(ktap_number); return; case KTAP_TYPE_STRING: *temp = (void *)svalue(val); *out_addr = temp; *out_size = sizeof(void *); return; } cd = cdvalue(val); cs = cd_csym(ks, cd); type = csym_type(cs); *out_size = csym_size(ks, cs); switch (type) { case FFI_VOID: kp_error(ks, "Error: Cannot copy data from void type\n"); return; case FFI_UINT8: case FFI_INT8: case FFI_UINT16: case FFI_INT16: case FFI_UINT32: case FFI_INT32: case FFI_UINT64: case FFI_INT64: *out_addr = &cd_int(cd); return; case FFI_PTR: *out_addr = &cd_ptr(cd); return; case FFI_STRUCT: case FFI_UNION: *out_addr = cd_record(cd); return; case FFI_FUNC: case FFI_UNKNOWN: kp_error(ks, "Error: internal error for csymbol %s\n", csym_name(cs)); return; } }
void Shop::AddCD(const char* pTitle, unsigned int unitPricePence, unsigned int runningTimeMins, unsigned int noOfTracks) { std::shared_ptr<CD> cd_ptr(new CD(pTitle, unitPricePence, runningTimeMins, noOfTracks)); items.push_back(cd_ptr); }
/* 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; }