class MapException(MicroInstruction): COUNT = 0 def __init__(self, instr, mapping): if isinstance(instr, str): self.instr = InstructionList([PushAllArgs, instr, StoreResult]) else: self.instr = InstructionList(instr) self.mapping = mapping def render(self, generator, op): ilasm = generator.ilasm label = '__check_block_%d' % MapException.COUNT MapException.COUNT += 1 ilasm.begin_try() self.instr.render(generator, op) ilasm.leave(label) ilasm.end_try() for cli_exc, py_exc in self.mapping: ilasm.begin_catch(cli_exc) ilasm.new('instance void class %s::.ctor()' % py_exc) ilasm.opcode('throw') ilasm.end_catch() ilasm.label(label) ilasm.opcode('nop')
def render_sub_op(sub_op, db, generator): op = sub_op.op instr_list = db.genoo.opcodes.get(op.opname, None) assert instr_list is not None, 'Unknown opcode: %s ' % op assert isinstance(instr_list, InstructionList) assert instr_list[-1] is StoreResult, "Cannot inline an operation that doesn't store the result" # record that we know about the type of result and args db.cts.lltype_to_cts(op.result.concretetype) for v in op.args: db.cts.lltype_to_cts(v.concretetype) instr_list = InstructionList(instr_list[:-1]) # leave the value on the stack if this is a sub-op instr_list.render(generator, op)
def render_sub_op(sub_op, db, generator): op = sub_op.op instr_list = db.genoo.opcodes.get(op.opname, None) assert instr_list is not None, 'Unknown opcode: %s ' % op assert isinstance(instr_list, InstructionList) assert instr_list[ -1] is StoreResult, "Cannot inline an operation that doesn't store the result" # record that we know about the type of result and args db.cts.lltype_to_cts(op.result.concretetype) for v in op.args: db.cts.lltype_to_cts(v.concretetype) instr_list = InstructionList( instr_list[:-1]) # leave the value on the stack if this is a sub-op instr_list.render(generator, op)