public HoistedParameter (HoistedParameter hp, string name) : base (hp.storey, name, hp.parameter.Type) { this.parameter = hp.parameter; }
public void CaptureParameter (ResolveContext ec, ParametersBlock.ParameterInfo parameterInfo, ParameterReference parameterReference) { if (!(this is StateMachine)) { ec.CurrentBlock.Explicit.HasCapturedVariable = true; } var hoisted = parameterInfo.Parameter.HoistedVariant; if (parameterInfo.Block.StateMachine != null) { // // Another storey in same block exists but state machine does not // have parameter captured. We need to add it there as well to // proxy parameter value correctly. // if (hoisted == null && parameterInfo.Block.StateMachine != this) { var storey = parameterInfo.Block.StateMachine; hoisted = new HoistedParameter (storey, parameterReference); parameterInfo.Parameter.HoistedVariant = hoisted; if (storey.hoisted_params == null) storey.hoisted_params = new List<HoistedParameter> (); storey.hoisted_params.Add (hoisted); } // // Lift captured parameter from value type storey to reference type one. Otherwise // any side effects would be done on a copy // if (hoisted != null && hoisted.Storey != this && hoisted.Storey is StateMachine) { if (hoisted_local_params == null) hoisted_local_params = new List<HoistedParameter> (); hoisted_local_params.Add (hoisted); hoisted = null; } } if (hoisted == null) { hoisted = new HoistedParameter (this, parameterReference); parameterInfo.Parameter.HoistedVariant = hoisted; if (hoisted_params == null) hoisted_params = new List<HoistedParameter> (); hoisted_params.Add (hoisted); } // // Register link between current block and parameter storey. It will // be used when setting up storey definition to deploy storey reference // when parameters are used from multiple blocks // if (ec.CurrentBlock.Explicit != parameterInfo.Block) { hoisted.Storey.AddReferenceFromChildrenBlock (ec.CurrentBlock.Explicit); } }