public override int Run(InterpretedFrame frame) {
Debug.Assert(_offset != Unknown);
Interpreter.AbortThreadIfRequested(frame, _offset);
object value = _hasValue ? frame.Pop() : null;
// run finally blocks:
if (_finallyBlocks != null) {
int oldIndex = frame.InstructionIndex;
for (int i = 0; i < _finallyBlocks.Count; i++) {
var finallyBlock = _finallyBlocks[i];
frame.SetStackDepth(finallyBlock.StackDepth);
frame.InstructionIndex = finallyBlock.Start;
// If an exception is thrown and caught in finally the we go on.
// If an exception is thrown but not handled within finally block it is propagated.
frame.Interpreter.RunBlock(frame, finallyBlock.End);
}
frame.InstructionIndex = oldIndex;
}
frame.SetStackDepth(_targetStackDepth);
if (_hasValue) {
frame.Data[frame.StackIndex - 1] = value;
}
// keep the return value on the stack
return _offset;
}