def __init__(self, method, bytestream): self.method = method self.class_ = method.class_ #Old versions use shorter fields for stack, locals, and code length field_fmt = ">HHL" if self.class_.version > (45,2) else ">BBH" self.stack, self.locals, codelen = bytestream.get(field_fmt) assert(codelen > 0 and codelen < 65536) self.bytecode_raw = bytestream.getRaw(codelen) self.codelen = codelen except_cnt = bytestream.get('>H') self.except_raw = [bytestream.get('>HHHH') for i in range(except_cnt)] self.except_raw = [exceptionHandlerRaw(*t) for t in self.except_raw] self.attributes_raw = get_attributes_raw(bytestream) assert(bytestream.size() == 0) if self.except_raw: assert(self.stack >= 1) # print 'Parsing code for', method.name, method.descriptor, method.flags codestream = binUnpacker.binUnpacker(data = self.bytecode_raw) self.bytecode = bytecode.parseInstructions(codestream, self.isIdConstructor) for e in self.except_raw: assert(e.start in self.bytecode) assert(e.end == codelen or e.end in self.bytecode) assert(e.handler in self.bytecode)
def __init__(self, env, bytestream): self.env = env magic, minor, major = bytestream.get('>LHH') assert(magic == 0xCAFEBABE) self.version = major,minor self.const_pool_raw = get_cp_raw(bytestream) flags, self.this, self.super = bytestream.get('>HHH') interface_count = bytestream.get('>H') self.interfaces_raw = [bytestream.get('>H') for i in range(interface_count)] self.fields_raw = get_fields_raw(bytestream) self.methods_raw = get_methods_raw(bytestream) self.attributes_raw = get_attributes_raw(bytestream) assert(bytestream.size() == 0) self.flags = set(name for name,mask in ClassFile.flagVals.items() if (mask & flags))
def get_field_raw(bytestream): flags, name, desc = bytestream.get('>HHH') attributes = get_attributes_raw(bytestream) return flags, name, desc, attributes