/// <summary> /// Creates new type context, flow context and flow state for the routine. /// </summary> public static FlowState CreateInitialState(SourceRoutineSymbol /*!*/ routine, FlowContext flowCtx = null) { Contract.ThrowIfNull(routine); // get or create typeCtx var typeCtx = routine.TypeRefContext; if (flowCtx == null) { // create FlowContext flowCtx = new FlowContext(typeCtx, routine); } // create FlowState var state = new FlowState(flowCtx); // handle input parameters type foreach (var p in routine.SourceParameters) { var local = state.GetLocalHandle(new VariableName(p.Name)); var ptype = p.GetResultType(typeCtx); if (p.IsNotNull) { // remove 'null' type from the mask, // it cannot be null ptype = typeCtx.WithoutNull(ptype); } else if (p.Type.IsReferenceType) // a reference type that can be null { ptype |= typeCtx.GetNullTypeMask(); } state.SetLocalType(local, ptype); if (p.Syntax.PassedByRef && !p.Syntax.IsVariadic) { state.MarkLocalByRef(local); } } // $this if (routine.GetPhpThisVariablePlace() != null) { InitThisVar(flowCtx, state); } // return(state); }
/// <summary> /// Creates new type context, flow context and flow state for the routine. /// </summary> public static FlowState CreateInitialState(SourceRoutineSymbol /*!*/ routine) { Contract.ThrowIfNull(routine); // create typeCtx var typeCtx = routine.TypeRefContext; // create FlowContext var flowCtx = new FlowContext(typeCtx, routine); // create FlowState var state = new FlowState(flowCtx); // handle input parameters type var parameters = routine.SourceParameters; foreach (var p in parameters) { var local = state.GetLocalHandle(new VariableName(p.Name)); state.SetLocalType(local, p.GetResultType(typeCtx)); if (p.Syntax.PassedByRef && !p.Syntax.IsVariadic) { state.MarkLocalByRef(local); } } // $this if (routine.GetPhpThisVariablePlace() != null) { InitThisVar(flowCtx, state); } // return(state); }