Maintaining the function list as well
This commit is contained in:
parent
0b4301cd60
commit
577bbb4e6f
@ -364,6 +364,8 @@ static int _decode_fields(FormatPlugin * format, uint16_t cnt);
|
|||||||
static int _decode_interfaces(FormatPlugin * format, uint16_t cnt);
|
static int _decode_interfaces(FormatPlugin * format, uint16_t cnt);
|
||||||
static int _decode_methods(FormatPlugin * format, uint16_t cnt,
|
static int _decode_methods(FormatPlugin * format, uint16_t cnt,
|
||||||
ArchInstructionCall ** calls, size_t * calls_cnt);
|
ArchInstructionCall ** calls, size_t * calls_cnt);
|
||||||
|
static int _methods_add(FormatPlugin * format, uint16_t id, uint16_t name,
|
||||||
|
off_t offset, size_t size);
|
||||||
|
|
||||||
static int _java_decode_section(FormatPlugin * format, AsmSection * section,
|
static int _java_decode_section(FormatPlugin * format, AsmSection * section,
|
||||||
ArchInstructionCall ** calls, size_t * calls_cnt)
|
ArchInstructionCall ** calls, size_t * calls_cnt)
|
||||||
@ -638,6 +640,8 @@ static int _decode_methods(FormatPlugin * format, uint16_t cnt,
|
|||||||
FormatPluginHelper * helper = format->helper;
|
FormatPluginHelper * helper = format->helper;
|
||||||
size_t i;
|
size_t i;
|
||||||
JavaMethodInfo jmi;
|
JavaMethodInfo jmi;
|
||||||
|
off_t begin;
|
||||||
|
off_t end;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s(%u)\n", __func__, cnt);
|
fprintf(stderr, "DEBUG: %s(%u)\n", __func__, cnt);
|
||||||
@ -647,9 +651,40 @@ static int _decode_methods(FormatPlugin * format, uint16_t cnt,
|
|||||||
if(helper->read(helper->format, &jmi, sizeof(jmi))
|
if(helper->read(helper->format, &jmi, sizeof(jmi))
|
||||||
!= sizeof(jmi))
|
!= sizeof(jmi))
|
||||||
return -1;
|
return -1;
|
||||||
|
jmi.access = _htob16(jmi.access);
|
||||||
|
jmi.name = _htob16(jmi.name);
|
||||||
|
jmi.descriptor = _htob16(jmi.descriptor);
|
||||||
jmi.attributes_cnt = _htob16(jmi.attributes_cnt);
|
jmi.attributes_cnt = _htob16(jmi.attributes_cnt);
|
||||||
|
/* decode attributes and code */
|
||||||
|
if((begin = helper->seek(helper->format, 0, SEEK_CUR)) < 0)
|
||||||
|
return -1;
|
||||||
|
if(jmi.attributes_cnt > 0)
|
||||||
|
begin += sizeof(JavaAttributeInfo);
|
||||||
_decode_attributes(format, jmi.attributes_cnt, calls,
|
_decode_attributes(format, jmi.attributes_cnt, calls,
|
||||||
calls_cnt);
|
calls_cnt);
|
||||||
|
if((end = helper->seek(helper->format, 0, SEEK_CUR)) < 0)
|
||||||
|
return -1;
|
||||||
|
/* add the method to the function list */
|
||||||
|
_methods_add(format, i, jmi.name, begin, end - begin);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _methods_add(FormatPlugin * format, uint16_t id, uint16_t name,
|
||||||
|
off_t offset, size_t size)
|
||||||
|
{
|
||||||
|
FormatPluginHelper * helper = format->helper;
|
||||||
|
JavaPlugin * java = format->priv;
|
||||||
|
JavaCpInfo * jci;
|
||||||
|
AsmString * as;
|
||||||
|
|
||||||
|
jci = &java->constants[name];
|
||||||
|
if(name >= java->constants_cnt || jci->tag != CONSTANT_Utf8)
|
||||||
|
return 0;
|
||||||
|
if(helper->set_string(helper->format, name, NULL, jci->offset + 3,
|
||||||
|
jci->info.utf8.length) < 0)
|
||||||
|
return -1;
|
||||||
|
if((as = helper->get_string_by_id(helper->format, name)) == NULL)
|
||||||
|
return -1;
|
||||||
|
return helper->set_function(helper->format, id, as->name, offset, size);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user