📄 classview.cc
字号:
ht_snprintf(info, sizeof info, "line number table entry [%08x]:", i); cs->init(f, s2, 1, info, 1); g2->insertsub(cs); } cs2 = new ht_collapsable_sub(); cs2->init(f, g2, 1, "line number table", 1); g->insertsub(cs2); break; case ATTRIB_InnerClasses: s->add_staticmask_ptable(ainn_hdr, a->offset, true); f->seek(a->offset+6); f->read(inp, 2); j = a->offset + 6 + 2; tabl_len = (((u2)inp[0]<<8)|inp[1]); g2 = new ht_group_sub(); g2->init(f); if (!tabl_len) { s2 = new ht_mask_sub(); s2->init(f, (*idx)++); s2->add_mask("<none>"); g2->insertsub(s2); } for (i=0; i<tabl_len; i++) { s2 = new ht_mask_sub(); s2->init(f, (*idx)++); s2->add_staticmask_ptable(ainn_info, j+i*8, true); cs = new ht_collapsable_sub(); ht_snprintf(info, sizeof info, "classes entry [%08x]:", i); cs->init(f, s2, 1, info, 1); g2->insertsub(cs); } cs2 = new ht_collapsable_sub(); cs2->init(f, g2, 1, "classes", 1); g->insertsub(cs2); break; case ATTRIB_Exceptions: s->add_staticmask_ptable(axpt_hdr, a->offset, true); f->seek(a->offset+6); f->read(inp, 2); j = a->offset + 6 + 2; tabl_len = (((u2)inp[0]<<8)|inp[1]); g2 = new ht_group_sub(); g2->init(f); if (!tabl_len) { s2 = new ht_mask_sub(); s2->init(f, (*idx)++); s2->add_mask("<none>"); g2->insertsub(s2); } for (i=0; i<tabl_len; i++) { s2 = new ht_mask_sub(); s2->init(f, (*idx)++); s2->add_staticmask_ptable(ainn_info, j+i*2, true); cs = new ht_collapsable_sub(); ht_snprintf(info, sizeof info, "exception index table entry [%08x]:", i); cs->init(f, s2, 1, info, 1); g2->insertsub(cs); } cs2 = new ht_collapsable_sub(); cs2->init(f, g2, 1, "exception index table", 1); g->insertsub(cs2); break; case ATTRIB_LocalVariableTable: s->add_staticmask_ptable(aloc_hdr, a->offset, true); f->seek(a->offset+6); f->read(inp, 2); j = a->offset + 6 + 2; tabl_len = (((u2)inp[0]<<8)|inp[1]); g2 = new ht_group_sub(); g2->init(f); if (!tabl_len) { s2 = new ht_mask_sub(); s2->init(f, (*idx)++); s2->add_mask("<none>"); g2->insertsub(s2); } for (i=0; i<tabl_len; i++) { s2 = new ht_mask_sub(); s2->init(f, (*idx)++); s2->add_staticmask_ptable(aloc_info, j+i*10, true); cs = new ht_collapsable_sub(); ht_snprintf(info, sizeof info, "local variable table entry [%08x]:", i); cs->init(f, s2, 1, info, 1); g2->insertsub(cs); } cs2 = new ht_collapsable_sub(); cs2->init(f, g2, 1, "local variable table", 1); g->insertsub(cs2); break; case ATTRIB_Synthetic: case ATTRIB_Deprecated: default: break; }}static void mf_view(ht_group_sub *g, File *f, unsigned *idx, classfile *c, mf_info *mf){ ht_group_sub *g2, *g3; ht_mask_sub *s; ht_collapsable_sub *cs, *cs2; char info[128]; s = new ht_mask_sub(); s->init(f, (*idx)++); s->add_staticmask_ptable(mf_hdr, mf->offset, true); g->insertsub(s); g2 = new ht_group_sub(); g2->init(f); if (!mf->attribs_count) { s = new ht_mask_sub(); s->init(f, (*idx)++); s->add_mask("<none>"); g2->insertsub(s); } for (uint i=0; i<mf->attribs_count; i++) { g3 = new ht_group_sub(); g3->init(f); attrib_view(g3, f, idx, c, mf->attribs[i]); cs = new ht_collapsable_sub(); ht_snprintf(info, sizeof info, "attribute entry [%08x]: %s", i, c->cpool[mf->attribs[i]->name]->value.string); cs->init(f, g3, 1, info, 1); g2->insertsub(cs); } cs2 = new ht_collapsable_sub(); cs2->init(f, g2, 1, "attributes", 1); g->insertsub(cs2);}static ht_view *class_view(Bounds *b, File *file, ht_format_group *group){ ht_mask_sub *s; ht_collapsable_sub *cs, *cs2; ht_group_sub *g, *g2, *g3; classfile *clazz; char info[128]; unsigned i, j, idx = 0; clazz = ((ht_class_shared_data *)group->get_shared_data())->file; if (clazz) { ht_uformat_viewer *v = new ht_uformat_viewer(); v->init(b, DESC_JAVA_HEADERS, VC_EDIT, file, group); registerAtom(ATOM_CLS_ACCESS, access_flags); registerAtom(ATOM_CLS_CPOOL, cpool_tags); g = new ht_group_sub(); g->init(file); s = new ht_mask_sub(); s->init(file, idx++); s->add_staticmask_ptable(cls_class1_hdr, clazz->offset, true); g->insertsub(s); g2 = new ht_group_sub(); g2->init(file); for (i=1; i < clazz->cpool_count; i++) { s = new ht_mask_sub(); s->init(file, idx++); s->add_staticmask_ptable(cpool_hdr, clazz->cpool[i]->offset, true); switch (clazz->cpool[i]->tag) { case CONSTANT_Utf8: s->add_staticmask_ptable(cpool_utf8, clazz->cpool[i]->offset, true); break; case CONSTANT_Integer: case CONSTANT_Float: s->add_staticmask_ptable(cpool_if, clazz->cpool[i]->offset, true); break; case CONSTANT_Long: case CONSTANT_Double: s->add_staticmask_ptable(cpool_ld, clazz->cpool[i]->offset, true); break; case CONSTANT_Class: s->add_staticmask_ptable(cpool_class, clazz->cpool[i]->offset, true); break; case CONSTANT_String: s->add_staticmask_ptable(cpool_str, clazz->cpool[i]->offset, true); break; case CONSTANT_Fieldref: case CONSTANT_Methodref: case CONSTANT_InterfaceMethodref: s->add_staticmask_ptable(cpool_fmi, clazz->cpool[i]->offset, true); break; case CONSTANT_NameAndType: s->add_staticmask_ptable(cpool_nat, clazz->cpool[i]->offset, true); break; } cs = new ht_collapsable_sub(); ht_snprintf(info, sizeof info, "constant pool entry [%08x]: %s", i, (clazz->cpool[i]->tag == CONSTANT_Utf8) ? clazz->cpool[i]->value.string : ""); cs->init(file, s, 1, info, 1); g2->insertsub(cs); if (clazz->cpool[i]->tag == CONSTANT_Long || clazz->cpool[i]->tag == CONSTANT_Double) { i++; } } cs2 = new ht_collapsable_sub(); cs2->init(file, g2, 1, "constant pool", 1); g->insertsub(cs2); s = new ht_mask_sub(); s->init(file, idx++); s->add_staticmask_ptable(cls_class2_hdr, clazz->coffset, true); g->insertsub(s); g2 = new ht_group_sub(); g2->init(file); if (!clazz->interfaces_count) { s = new ht_mask_sub(); s->init(file, idx++); s->add_mask("<none>"); g2->insertsub(s); } for (i=0; i < clazz->interfaces_count; i++) { s = new ht_mask_sub(); s->init(file, idx++); s->add_staticmask_ptable(iface_hdr, clazz->coffset+8+i*2, true); cs = new ht_collapsable_sub(); j = clazz->cpool[clazz->interfaces[i]]->value.llval[0]; ht_snprintf(info, sizeof info, "interface entry [%08x]: %s", i, clazz->cpool[j]->value.string); cs->init(file, s, 1, info, 1); g2->insertsub(cs); } cs2 = new ht_collapsable_sub(); cs2->init(file, g2, 1, "interfaces", 1); g->insertsub(cs2); s = new ht_mask_sub(); s->init(file, idx++); s->add_staticmask_ptable(field_hdr, clazz->foffset, true); g->insertsub(s); g2 = new ht_group_sub(); g2->init(file); if (!clazz->fields_count) { s = new ht_mask_sub(); s->init(file, idx++); s->add_mask("<none>"); g2->insertsub(s); } for (i=0; i < clazz->fields_count; i++) { g3 = new ht_group_sub(); g3->init(file); mf_view(g3, file, &idx, clazz, clazz->fields[i]); cs = new ht_collapsable_sub(); ht_snprintf(info, sizeof info, "field entry [%08x]: %s", i, clazz->fields[i]->name); cs->init(file, g3, 1, info, 1); g2->insertsub(cs); } cs2 = new ht_collapsable_sub(); cs2->init(file, g2, 1, "fields", 1); g->insertsub(cs2); s = new ht_mask_sub(); s->init(file, idx++); s->add_staticmask_ptable(method_hdr, clazz->moffset, true); g->insertsub(s); g2 = new ht_group_sub(); g2->init(file); if (!clazz->methods_count) { s = new ht_mask_sub(); s->init(file, idx++); s->add_mask("<none>"); g2->insertsub(s); } for (i=0; i<clazz->methods_count; i++) { g3 = new ht_group_sub(); g3->init(file); mf_view(g3, file, &idx, clazz, clazz->methods[i]); cs = new ht_collapsable_sub(); ht_snprintf(info, sizeof info, "method entry [%08x]: %s", i, clazz->methods[i]->name); cs->init(file, g3, 1, info, 1); g2->insertsub(cs); } cs2 = new ht_collapsable_sub(); cs2->init(file, g2, 1, "methods", 1); g->insertsub(cs2); s = new ht_mask_sub(); s->init(file, idx++); s->add_staticmask_ptable(atr_hdr, clazz->aoffset, true); g->insertsub(s); g2 = new ht_group_sub(); g2->init(file); if (!clazz->attribs_count) { s = new ht_mask_sub(); s->init(file, idx++); s->add_mask("<none>"); g2->insertsub(s); } for (i = 0; i < clazz->attribs_count; i++) { g3 = new ht_group_sub(); g3->init(file); attrib_view(g3, file, &idx, clazz, clazz->attribs[i]); cs = new ht_collapsable_sub(); j = clazz->attribs[i]->name; ht_snprintf(info, sizeof info, "attribute entry [%08x]: %s", i, clazz->cpool[j]->value.string); cs->init(file, g3, 1, info, 1); g2->insertsub(cs); } cs2 = new ht_collapsable_sub(); cs2->init(file, g2, 1, "attributes", 1); g->insertsub(cs2); v->insertsub(g); return v; } else { return NULL; }}void cview::init(Bounds *b, File *f, format_viewer_if **ifs, ht_format_group *g, FileOfs header_ofs, void *shared){ ht_format_group::init(b, VO_SELECTABLE | VO_BROWSABLE | VO_RESIZE, DESC_JAVA, f, false, true, 0, g); shared_data = shared; ht_format_group::init_ifs(ifs);}void cview::done(){ ht_format_group::done(); ht_class_shared_data *clazz = (ht_class_shared_data *)shared_data; if (clazz) { class_unread(clazz); }}static format_viewer_if htcls_cview = { &class_view, 0};static format_viewer_if *htcls_ifs[] = { &htcls_cview, &htclassimage_if, 0};static ht_view *class_init(Bounds *b, File *file, ht_format_group *group){ u1 magic[4]; file->seek(0); file->read(magic, 4); if (magic[0] == 0xca && magic[1] == 0xfe && magic[2] == 0xba && magic[3] == 0xbe) { file->seek(0); void *shared_data = (void*)class_read(file); if (!shared_data) return NULL; cview *c = new cview(); c->init(b, file, htcls_ifs, group, 0, shared_data); return c; } return NULL;}format_viewer_if htcls_if = { &class_init, 0};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -