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); } }
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 (hoisted == null) { var storey = parameterInfo.Block.StateMachine ?? this; var hp = new HoistedParameter (storey, parameterReference); hoisted = hp; parameterInfo.Parameter.HoistedVariant = hoisted; if (storey.hoisted_params == null) storey.hoisted_params = new List<HoistedParameter> (2); storey.hoisted_params.Add (hp); } // // 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); } }
public void CaptureParameter (ResolveContext ec, ParameterReference param_ref) { ec.CurrentBlock.Explicit.HasCapturedVariable = true; AddReferenceFromChildrenBlock (ec.CurrentBlock.Explicit); if (param_ref.GetHoistedVariable (ec) != null) return; if (hoisted_params == null) hoisted_params = new List<HoistedParameter> (2); var expr = new HoistedParameter (this, param_ref); param_ref.Parameter.HoistedVariant = expr; hoisted_params.Add (expr); }
public void CaptureParameter (EmitContext ec, ParameterReference param_ref) { if (param_ref.HoistedVariable != null) return; if (hoisted_params == null) hoisted_params = new ArrayList (2); HoistedVariable expr = new HoistedParameter (this, param_ref); param_ref.Parameter.HoistedVariableReference = expr; hoisted_params.Add (expr); }