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 _loadClass(self, name, subclasses): print "Loading ", name[:70] data = self._searchForFile(name) if data is None: raise ClassLoaderError('ClassNotFoundException', name) stream = binUnpacker.binUnpacker(data=data) new = ClassFile(self, stream) new.load(name, subclasses) self.classes[name] = new
def _loadCode(self): cpool = self.class_.cpool code_attrs = [a for a in self.attributes if cpool.getArgsCheck('Utf8', a[0]) == 'Code'] if self.native or self.abstract: assert(not code_attrs) self.code = None else: assert(len(code_attrs) == 1) code_raw = code_attrs[0][1] bytestream = binUnpacker.binUnpacker(code_raw) self.code = Code(self, bytestream)