asm: reader: implement reading ident and atom constpool values
This commit is contained in:
66
asm/reader.c
66
asm/reader.c
@@ -333,6 +333,8 @@ enum ivy_status ivy_asm_constpool_reader_read_value(
|
|||||||
break;
|
break;
|
||||||
case IVY_CONSTPOOL_TABLE_ATOM:
|
case IVY_CONSTPOOL_TABLE_ATOM:
|
||||||
value->v_type = IVY_ASM_CONSTPOOL_TYPE_ATOM;
|
value->v_type = IVY_ASM_CONSTPOOL_TYPE_ATOM;
|
||||||
|
handle = b_i32_btoh(entry.e_ex_handle);
|
||||||
|
status = read_string_xdata(reader, handle, &value->v_str);
|
||||||
break;
|
break;
|
||||||
case IVY_CONSTPOOL_TABLE_SELECTOR: {
|
case IVY_CONSTPOOL_TABLE_SELECTOR: {
|
||||||
value->v_type = IVY_ASM_CONSTPOOL_TYPE_SELECTOR;
|
value->v_type = IVY_ASM_CONSTPOOL_TYPE_SELECTOR;
|
||||||
@@ -395,6 +397,8 @@ enum ivy_status ivy_asm_constpool_reader_read_value(
|
|||||||
|
|
||||||
ivy_selector_add_arg(sel, arg_name, NULL);
|
ivy_selector_add_arg(sel, arg_name, NULL);
|
||||||
free(arg_name);
|
free(arg_name);
|
||||||
|
|
||||||
|
handle += sizeof arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status != IVY_OK) {
|
if (status != IVY_OK) {
|
||||||
@@ -405,14 +409,72 @@ enum ivy_status ivy_asm_constpool_reader_read_value(
|
|||||||
value->v_sel = sel;
|
value->v_sel = sel;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IVY_CONSTPOOL_TABLE_IDENT:
|
case IVY_CONSTPOOL_TABLE_IDENT: {
|
||||||
value->v_type = IVY_ASM_CONSTPOOL_TYPE_IDENT;
|
value->v_type = IVY_ASM_CONSTPOOL_TYPE_IDENT;
|
||||||
|
handle = b_i32_btoh(entry.e_ex_handle);
|
||||||
|
|
||||||
|
struct ivy_bin_ident id_entry;
|
||||||
|
status = ivy_asm_section_reader_read(
|
||||||
|
reader->r_xdat, handle, sizeof id_entry, &id_entry, &r);
|
||||||
|
|
||||||
|
if (status != IVY_OK) {
|
||||||
break;
|
break;
|
||||||
default:
|
}
|
||||||
|
|
||||||
|
if (r != sizeof id_entry) {
|
||||||
status = IVY_ERR_BAD_FORMAT;
|
status = IVY_ERR_BAD_FORMAT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ivy_ident *id;
|
||||||
|
id = ivy_ident_create();
|
||||||
|
if (!id) {
|
||||||
|
status = IVY_ERR_NO_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
handle += sizeof id_entry;
|
||||||
|
size_t nr_parts = id_entry.id_nr_parts;
|
||||||
|
for (size_t i = 0; i < nr_parts; i++) {
|
||||||
|
b_i32 part;
|
||||||
|
status = ivy_asm_section_reader_read(
|
||||||
|
reader->r_xdat, handle, sizeof part, &part, &r);
|
||||||
|
|
||||||
|
if (status != IVY_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r != sizeof part) {
|
||||||
|
status = IVY_ERR_BAD_FORMAT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t part_key = b_i32_btoh(part);
|
||||||
|
char *part_name = NULL;
|
||||||
|
status = read_string_xdata(reader, part_key, &part_name);
|
||||||
|
if (status != IVY_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ivy_ident_add_part(id, part_name);
|
||||||
|
free(part_name);
|
||||||
|
|
||||||
|
handle += sizeof part;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status != IVY_OK) {
|
||||||
|
ivy_ident_destroy(id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
value->v_ident = id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
value->v_type = IVY_ASM_CONSTPOOL_TYPE_NONE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (status != IVY_OK) {
|
if (status != IVY_OK) {
|
||||||
free(value);
|
free(value);
|
||||||
value = NULL;
|
value = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user