Exemple #1
0
        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("??");
        }
Exemple #2
0
        public static bool Check(Core.Session session, Core.DeclFunct funct)
        {
            var checker = new FunctTypeChecker(session, funct);

            checker.Check();
            return(checker.foundErrors);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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) + " = ");
        }
Exemple #6
0
        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);
            }
        }
Exemple #7
0
        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());
        }
Exemple #8
0
        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);
        }
Exemple #9
0
        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);
        }
Exemple #10
0
        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);
        }
Exemple #11
0
 private FunctInitChecker(Core.Session session, Core.DeclFunct funct)
 {
     this.session     = session;
     this.funct       = funct;
     this.foundErrors = false;
 }
Exemple #12
0
        public static void DoInference(Core.Session session, Core.DeclFunct funct)
        {
            var inferencer = new FunctTypeInferencer(session, funct);

            inferencer.ApplyRules();
        }
Exemple #13
0
 private FunctTypeInferencer(Core.Session session, Core.DeclFunct funct)
 {
     this.session = session;
     this.funct   = funct;
 }
Exemple #14
0
 private FunctInitChecker(Core.Session session, Core.DeclFunct funct)
 {
     this.session = session;
     this.funct = funct;
     this.foundErrors = false;
 }