def __init__(self, vm, method): self.__vm = vm self.method = method self.basic_blocks = BasicBlocks(self.__vm) self.exceptions = Exceptions(self.__vm) code = self.method.get_code() if code is None: return current_basic = DVMBasicBlock(0, self.__vm, self.method, self.basic_blocks) self.basic_blocks.push(current_basic) ########################################################## bc = code.get_bc() l = [] h = {} idx = 0 debug("Parsing instructions") for i in bc.get_instructions(): for j in BasicOPCODES: if j.match(i.get_name()) is not None: v = dvm.determineNext(i, idx, self.method) h[idx] = v l.extend(v) break idx += i.get_length() debug("Parsing exceptions") excepts = dvm.determineException(self.__vm, self.method) for i in excepts: l.extend([i[0]]) for handler in i[2:]: l.append(handler[1]) debug("Creating basic blocks in %s" % self.method) idx = 0 for i in bc.get_instructions(): # index is a destination if idx in l: if current_basic.get_nb_instructions() != 0: current_basic = DVMBasicBlock(current_basic.get_end(), self.__vm, self.method, self.basic_blocks) self.basic_blocks.push(current_basic) current_basic.push(i) # index is a branch instruction if idx in h: current_basic = DVMBasicBlock(current_basic.get_end(), self.__vm, self.method, self.basic_blocks) self.basic_blocks.push(current_basic) idx += i.get_length() if current_basic.get_nb_instructions() == 0: self.basic_blocks.pop(-1) debug("Settings basic blocks childs") for i in self.basic_blocks.get(): try: i.set_childs(h[i.end - i.get_last_length()]) except KeyError: i.set_childs([]) debug("Creating exceptions") # Create exceptions self.exceptions.add(excepts, self.basic_blocks) for i in self.basic_blocks.get(): # setup exception by basic block i.set_exception_analysis( self.exceptions.get_exception(i.start, i.end - 1)) del h, l
def __init__(self, vm, method): self.__vm = vm self.method = method self.basic_blocks = BasicBlocks(self.__vm) self.exceptions = Exceptions(self.__vm) code = self.method.get_code() if code == None: return current_basic = DVMBasicBlock(0, self.__vm, self.method, self.basic_blocks) self.basic_blocks.push(current_basic) ########################################################## bc = code.get_bc() l = [] h = {} idx = 0 debug("Parsing instructions") instructions = [i for i in bc.get_instructions()] for i in instructions: for j in BasicOPCODES: if j.match(i.get_name()) != None: v = dvm.determineNext(i, idx, self.method) h[idx] = v l.extend(v) break idx += i.get_length() debug("Parsing exceptions") excepts = dvm.determineException(self.__vm, self.method) for i in excepts: l.extend([i[0]]) for handler in i[2:]: l.append(handler[1]) debug("Creating basic blocks in %s" % self.method) idx = 0 for i in instructions: # index is a destination if idx in l: if current_basic.get_nb_instructions() != 0: current_basic = DVMBasicBlock(current_basic.get_end(), self.__vm, self.method, self.basic_blocks) self.basic_blocks.push(current_basic) current_basic.push(i) # index is a branch instruction if idx in h: current_basic = DVMBasicBlock(current_basic.get_end(), self.__vm, self.method, self.basic_blocks) self.basic_blocks.push(current_basic) idx += i.get_length() if current_basic.get_nb_instructions() == 0: self.basic_blocks.pop(-1) debug("Settings basic blocks childs") for i in self.basic_blocks.get(): try: i.set_childs(h[i.end - i.get_last_length()]) except KeyError: i.set_childs([]) debug("Creating exceptions") # Create exceptions self.exceptions.add(excepts, self.basic_blocks) for i in self.basic_blocks.get(): # setup exception by basic block i.set_exception_analysis(self.exceptions.get_exception(i.start, i.end - 1)) del instructions del h, l