I'm porting a python script to .NET to make it easier to mantain and this is the first time i'm actually doing anything in python so I am heavily checking stackoverflow for every line I don't understand and I can't seem to figure this out at all.
I got a handler object which gets set by getattr()
when name is None?
As far as I can tell from reading the code the name will never be None as it's set above properly so what does the getattr()
actually do here?
if the instruction object was None? (I guess that's like null/Nothing?) wouldn't it raise a exception before hitting the getattr()
line and then again I don't believe instruction can ever be None, if mnemonic is None the string would still look like on_
so name
will still technically never be None
. So handler will never be None
then why is it possible here?
name = 'on_%s' % instruction.mnemonic
handler = getattr(self, name, None)
if handler is None:
self.on_fail('Not implemented', instruction)
return False
about 30 lines down in python the handler is used one last time here.
if handler(instruction) is False:
self.on_fail('Handler skipped', instruction)
Seems now the handler can accept a instruction Class i can't find any handler class that has __init__
with instruction in it either.
Figured out a little it seems it's used with some global function mappers
on_cmovae = on_cmovcc
on_cmova = on_cmovcc
on_cmovbe = on_cmovcc
on_cmovb = on_cmovcc
on_cmovg = on_cmovcc
on_cmovge = on_cmovcc
on_cmovl = on_cmovcc
on_cmovle = on_cmovcc
on_cmove = on_cmovcc
on_cmovne = on_cmovcc
on_cmovs = on_cmovcc
which map back to a function
def on_cmovcc(self, i):
self.writer.putlnc('if (%s)', i.get_condition_value())
self.writer.indent()
self.set_op(i.op1, i.op2.get())
self.writer.dedent()
Okay it seems getattr() is used to map to function calls by string name
Okay it seems that you use getattr()
to map function calls by string name to a handler function which is a wrapper for the function you are trying to map over.