Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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           
Exemplo n.º 3
0
 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)