private string GenerateDataAccess(Core.DataAccess access, Core.DeclFunct funct) { var accessReg = access as Core.DataAccessRegister; if (accessReg != null) { return("var" + accessReg.registerIndex); } var accessDeref = access as Core.DataAccessDereference; if (accessDeref != null) { return("*(" + GenerateDataAccess(accessDeref.innerAccess, funct) + ")"); } var accessField = access as Core.DataAccessField; if (accessField != null) { var baseType = Semantics.TypeResolver.GetDataAccessType(this.session, funct, accessField.baseAccess); var fieldName = Semantics.TypeResolver.GetFieldName(this.session, baseType, accessField.fieldIndex); return("(" + GenerateDataAccess(accessField.baseAccess, funct) + ")." + fieldName.GetString()); } return("??"); }
public static bool Check(Core.Session session, Core.DeclFunct funct) { var checker = new FunctTypeChecker(session, funct); checker.Check(); return(checker.foundErrors); }
private FunctBodyResolver(Core.Session session, Core.DeclFunct funct, Core.UseDirective[] useDirectives) { this.session = session; this.funct = funct; this.useDirectives = useDirectives; this.foundErrors = false; this.localScopeLivenesses = new List<bool>(); for (var i = 0; i < funct.parameterNum; i++) this.localScopeLivenesses.Add(true); }
public static bool Resolve( Core.Session session, Core.DeclFunct funct, Core.UseDirective[] useDirectives, Grammar.ASTNodeExpr bodyExpr) { var resolver = new FunctBodyResolver(session, funct, useDirectives); resolver.Resolve(bodyExpr); return(resolver.foundErrors); }
private string GenerateDataStore(Core.DataAccess dest, Core.DeclFunct funct) { var destType = Semantics.TypeResolver.GetDataAccessType(this.session, funct, dest); if (destType.IsZeroSized(this.session)) { return(""); } return(GenerateDataAccess(dest, funct) + " = "); }
private FunctBodyResolver(Core.Session session, Core.DeclFunct funct, Core.UseDirective[] useDirectives) { this.session = session; this.funct = funct; this.useDirectives = useDirectives; this.foundErrors = false; this.localScopeLivenesses = new List <bool>(); for (var i = 0; i < funct.parameterNum; i++) { this.localScopeLivenesses.Add(true); } }
public static Core.Type GetDataAccessType( Core.Session session, Core.DeclFunct funct, Core.DataAccess access) { var regAccess = access as Core.DataAccessRegister; if (regAccess != null) { return(funct.registerTypes[regAccess.registerIndex]); } var regField = access as Core.DataAccessField; if (regField != null) { return(GetFieldType( session, GetDataAccessType(session, funct, regField.baseAccess), regField.fieldIndex)); } var regDeref = access as Core.DataAccessDereference; if (regDeref != null) { var innerType = GetDataAccessType(session, funct, regDeref.innerAccess); var innerPtr = innerType as Core.TypePointer; if (innerPtr == null) { return(new Core.TypeError()); } return(innerPtr.pointedToType); } var regDiscard = access as Core.DataAccessDiscard; if (regDiscard != null) { return(Core.TypeTuple.Empty()); } return(new Core.TypeError()); }
public static bool GetDataAccessMutability( Core.Session session, Core.DeclFunct funct, Core.DataAccess access) { var regAccess = access as Core.DataAccessRegister; if (regAccess != null) { return(funct.registerMutabilities[regAccess.registerIndex]); } var regField = access as Core.DataAccessField; if (regField != null) { return(GetDataAccessMutability(session, funct, regField.baseAccess)); } var regDeref = access as Core.DataAccessDereference; if (regDeref != null) { var innerType = GetDataAccessType(session, funct, regDeref.innerAccess); var innerPtr = innerType as Core.TypePointer; if (innerPtr == null) { return(false); } if (!innerPtr.mutable) { return(false); } return(true); } return(false); }
public static bool Check(Core.Session session, Core.DeclFunct funct) { var checker = new FunctInitChecker(session, funct); var statusList = new List <InitStatus>(); for (var i = 0; i < funct.registerTypes.Count; i++) { statusList.Add(new InitStatus(i >= 1 && i < funct.parameterNum + 1)); } var segmentVisitCounts = new List <int>(); for (var i = 0; i < funct.segments.Count; i++) { segmentVisitCounts.Add(0); } checker.CheckSegment(0, segmentVisitCounts, statusList); checker.CheckUnusedMutabilities(); return(checker.foundErrors); }
public static bool ValidateDataAccess( Core.Session session, Core.DeclFunct funct, Core.DataAccess access) { var regDeref = access as Core.DataAccessDereference; if (regDeref != null) { var innerType = GetDataAccessType(session, funct, regDeref.innerAccess); var innerPtr = innerType as Core.TypePointer; if (innerPtr == null) { session.AddMessage( Diagnostics.MessageKind.Error, Diagnostics.MessageCode.CannotDereferenceType, "dereferencing '" + innerType.GetString(session) + "'", access.span); return(false); } } return(true); }
private FunctInitChecker(Core.Session session, Core.DeclFunct funct) { this.session = session; this.funct = funct; this.foundErrors = false; }
public static void DoInference(Core.Session session, Core.DeclFunct funct) { var inferencer = new FunctTypeInferencer(session, funct); inferencer.ApplyRules(); }
private FunctTypeInferencer(Core.Session session, Core.DeclFunct funct) { this.session = session; this.funct = funct; }