protected override EventResult DoProcessEvent(Inferior.ChildEvent cevent,
out TargetEventArgs args)
{
if ((cevent.Type == Inferior.ChildEventType.CHILD_NOTIFICATION) &&
((NotificationType) cevent.Argument == NotificationType.Trampoline)) {
TargetAddress info = new TargetAddress (
inferior.AddressDomain, cevent.Data1);
TargetReader reader = new TargetReader (inferior.ReadMemory (info, 3 * inferior.TargetAddressSize));
TargetAddress trampoline = reader.ReadAddress ();
TargetAddress method = reader.ReadAddress ();
TargetAddress code = reader.ReadAddress ();
if ((trampoline.IsNull) || (trampoline != CallSite.Address + CallSite.InstructionSize)) {
args = null;
sse.do_continue ();
return EventResult.Running;
}
args = null;
compiled = true;
TrampolineCompiled (method, code);
return EventResult.Running;
} else if ((cevent.Type == Inferior.ChildEventType.CHILD_NOTIFICATION) &&
((NotificationType) cevent.Argument == NotificationType.OldTrampoline)) {
TargetAddress method = new TargetAddress (
inferior.AddressDomain, cevent.Data1);
TargetAddress code = new TargetAddress (
inferior.AddressDomain, cevent.Data2);
args = null;
compiled = true;
TrampolineCompiled (method, code);
return EventResult.Running;
}
args = null;
if (!compiled) {
sse.disable_extended_notification (NotificationType.Trampoline);
return EventResult.Completed;
} else
return EventResult.ResumeOperation;
}