jcov_util.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 647 行 · 第 1/2 页
C
647 行
case JVM_CONSTANT_Class: cp_buf->u.Class.name_index = read2bytes(buf, len, err_code); break; case JVM_CONSTANT_Methodref: cp_buf->u.Methodref.class_index = read2bytes(buf, len, err_code); if (*err_code) break; cp_buf->u.Methodref.name_and_type_index = read2bytes(buf, len, err_code); break; case JVM_CONSTANT_InterfaceMethodref: cp_buf->u.InterfaceMethodref.class_index = read2bytes(buf, len, err_code); if (*err_code) break; cp_buf->u.InterfaceMethodref.name_and_type_index = read2bytes(buf, len, err_code); break; case JVM_CONSTANT_NameAndType: cp_buf->u.NameAndType.name_index = read2bytes(buf, len, err_code); if (*err_code) break; cp_buf->u.NameAndType.type_index = read2bytes(buf, len, err_code); break; case JVM_CONSTANT_Integer: case JVM_CONSTANT_Float: /* we're not interested in the rest of tags */#ifndef DEBUG read4bytes(buf, len, err_code);#else cp_buf->u.Integer.val = read4bytes(buf, len, err_code);#endif break; case JVM_CONSTANT_Long: case JVM_CONSTANT_Double:#ifndef DEBUG read4bytes(buf, len, err_code); if (*err_code) break; read4bytes(buf, len, err_code);#else cp_buf->u.Long.hi = read4bytes(buf, len, err_code); if (*err_code) break; cp_buf->u.Long.lo = read4bytes(buf, len, err_code);#endif break; case JVM_CONSTANT_String:#ifndef DEBUG read2bytes(buf, len, err_code);#else cp_buf->u.String.cp_index = read2bytes(buf, len, err_code);#endif break; case JVM_CONSTANT_Fieldref:#ifndef DEBUG read4bytes(buf, len, err_code);#else cp_buf->u.Field.class_index = read2bytes(buf, len, err_code); if (*err_code) break; cp_buf->u.Field.name_and_type_index = read2bytes(buf, len, err_code);#endif break; default: jcov_error("unrecognized constant pool entry encountered"); *err_code = 1; } } if (*err_code) { jcov_free_cp_entry(cp_buf); cp_buf = NULL; } return cp_buf;}void jcov_free_cp_entry(cp_entry_t *cp_entry) { if (cp_entry != NULL) { if (cp_entry->tag == JVM_CONSTANT_Utf8) { jcov_free(cp_entry->u.Utf8.bytes); } jcov_free(cp_entry); }}void jcov_free_constant_pool(cp_entry_t **cp, int cp_count) { int i; if (cp == NULL) return; for (i = 1; i < cp_count; i++) { jcov_free_cp_entry(cp[i]); } jcov_free(cp);}void jcov_free_method(jcov_method_t *meth) { if (meth == NULL) return; jcov_free(meth->name); jcov_free(meth->signature); jcov_free(meth->covtable); jcov_free(meth->pc_cache); jcov_free(meth);}void jcov_free_hooked_class(jcov_hooked_class_t *c) { int i; if (c == NULL) return; jcov_free(c->src_name); jcov_free(c->name); if (c->method_cache != NULL) { for (i = 0; i < c->methods_total; i++) { jcov_free_method(c->method_cache[i]); } jcov_free(c->method_cache); } jcov_free(c);}static void *f(void *c, void *arg) { jcov_free_hooked_class((jcov_hooked_class_t*)c); return NULL;}void jcov_conserve_thread(jcov_thread_t *thread) { void *dummy = NULL; jcov_hash_iterate(thread->hooked_class_table, f, dummy);}char *jcov_strdup(const char *str) { char *res = jcov_calloc(strlen(str)+1); strcpy(res, str); return res;}int get_instr_size(UINT16 pc, UINT8 *code) { UINT8 opcode = code[pc] & 0xFF; UINT16 cur_pc, instr_size; switch (opcode) { case opc_wide: return ((code[pc + 1] & 0xFF) == opc_iinc ? 6 : 4); case opc_lookupswitch: cur_pc = (pc + 4) & (~3); instr_size = cur_pc - pc /* padding bytes */ + 8 /* default offset and npairs */; cur_pc += 4; return INT32_AT(code, cur_pc) * 8 + instr_size; case opc_tableswitch: cur_pc = (pc + 4) & (~3); instr_size = cur_pc - pc /* padding bytes */ + 12 /* default offset, low and high */; cur_pc += 4; return (INT32_AT(code, cur_pc + 4) - INT32_AT(code, cur_pc) + 1) * 4 + instr_size; case opc_xxxunusedxxx: return 1; default: return opc_lengths[opcode]; }}static int bit_flags[12];static int lengths[12];static char *string_flags[12];void decode_modifiers(char *buf, int access_flags) { char *ptr = buf; int i = 0; for (i = 0; i < 12; i++) { if (access_flags & bit_flags[i]) { memcpy(ptr, string_flags[i], lengths[i]); ptr += lengths[i]; *ptr = ' '; ptr++; } } if (ptr == buf) { ptr++; } *(ptr-1) = '\0';}char *dummy_src_name(char *class_name) { char *res; int len = strlen(class_name) + strlen(DUMMY_SRC_PREF) + strlen(DUMMY_SRC_SUFF) + 1; res = (char*)jcov_calloc(len); sprintf(res, "%s%s%s", DUMMY_SRC_PREF, class_name, DUMMY_SRC_SUFF); res[len - 1] = '\0'; return res;}static int my_strcmp(const void *s1, const void *s2) { return strcmp(*(char**)s1, *(char**)s2);}static int starts_with(const void *str1, const void *str2) { return strncmp(*(char**)str1, *(char**)str2, strlen(*(char**)str2));}jcov_filter_t *jcov_filter_new() { jcov_filter_t *res = (jcov_filter_t*)jcov_calloc(sizeof(jcov_filter_t)); res->incl = (char**)jcov_calloc(sizeof(char*) * MAX_FILTER_SIZE); res->excl = (char**)jcov_calloc(sizeof(char*) * MAX_FILTER_SIZE); return res;}void filter_add_incl(jcov_filter_t *filter, char *str) { if (filter->incl_size >= MAX_FILTER_SIZE) jcov_error_stop("too many filters"); filter->incl[filter->incl_size++] = jcov_strdup(str);}void filter_add_excl(jcov_filter_t *filter, char *str) { if (filter->excl_size >= MAX_FILTER_SIZE) jcov_error_stop("too many filters"); filter->excl[filter->excl_size++] = jcov_strdup(str);}void filter_finalize(jcov_filter_t *filter) { if (filter == NULL) return; qsort(filter->incl, filter->incl_size, sizeof(char*), my_strcmp); qsort(filter->excl, filter->excl_size, sizeof(char*), my_strcmp);}int string_suits_filter(jcov_filter_t *filter, char *str) { if (filter == NULL) return 1; if (bsearch(&str, filter->excl, filter->excl_size, sizeof(char*), starts_with) != NULL) return 0; if (filter->incl_size == 0) return 1; if (bsearch(&str, filter->incl, filter->incl_size, sizeof(char*), starts_with) != NULL) return 1; return 0;}void jcov_close(FILE **f) { if (*f == NULL) return; if (fclose(*f) != 0) { jcov_error("cannot close file"); } *f = NULL;}void jcov_remove(const char *filename) { char buf[MAX_PATH_LEN]; if (remove(filename) == -1) { sprintf(buf,"cannot remove file : %s\n", filename); jcov_error(buf); }}void free_list(jcov_list_t **l, void (*free_elem_f)(void *)) { jcov_list_t *list; if (l == NULL || *l == NULL) return; list = *l; while (list != NULL) { jcov_list_t *next = list->next; void *tmp = list->elem; list->elem = NULL; if (free_elem_f != NULL) { free_elem_f(tmp); } jcov_free(list); list = next; } *l = NULL;}void add_to_list(jcov_list_t **l, void *elem) { jcov_list_t *new_entry = (jcov_list_t*)jcov_calloc(sizeof(jcov_list_t)); new_entry->elem = elem; new_entry->next = *l; *l = new_entry;}void add_to_list_end(jcov_list_t **l, void *elem) { jcov_list_t *cur = *l; jcov_list_t *new_entry = (jcov_list_t*)jcov_calloc(sizeof(jcov_list_t)); new_entry->elem = elem; new_entry->next = NULL; if (cur == NULL) { *l = new_entry; return; } for (; cur->next != NULL; cur = cur->next); cur->next = new_entry;}int list_size(jcov_list_t *l) { int res = 0; for (; l != NULL; l = l->next, res++); return res;}void jcov_util_init(void) { int i; bit_flags[0] = JVM_ACC_PUBLIC; bit_flags[1] = JVM_ACC_PRIVATE; bit_flags[2] = JVM_ACC_PROTECTED; bit_flags[3] = JVM_ACC_STATIC; bit_flags[4] = JVM_ACC_FINAL; bit_flags[5] = JVM_ACC_SYNCHRONIZED; bit_flags[6] = JVM_ACC_VOLATILE; bit_flags[7] = JVM_ACC_TRANSIENT; bit_flags[8] = JVM_ACC_NATIVE; bit_flags[9] = JVM_ACC_INTERFACE; bit_flags[10] = JVM_ACC_ABSTRACT; bit_flags[11] = JVM_ACC_STRICT; string_flags[0] = "public"; string_flags[1] = "private"; string_flags[2] = "protected"; string_flags[3] = "static"; string_flags[4] = "final"; string_flags[5] = "synchronized"; string_flags[6] = "volatile"; string_flags[7] = "transient"; string_flags[8] = "native"; string_flags[9] = "interface"; string_flags[10] = "abstract"; string_flags[11] = "strictfp"; for (i = 0; i < 12; i++){ lengths[i] = strlen(string_flags[i]); } DUMMY_SRC_PREF = "<UNKNOWN_SOURCE/"; DUMMY_SRC_SUFF = ".java>";}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?