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; }