コード例 #1
0
ファイル: ModCompiler.cs プロジェクト: slimlime/lslib
        private void BuildIR(IRBuildTasks tasks)
        {
            var goalLoader = new IRGenerator(Compiler.Context);

            while (tasks.Inputs.TryDequeue(out GoalScript script))
            {
                using (var stream = new MemoryStream(script.ScriptBody))
                {
                    var ast = goalLoader.ParseGoal(script.Path, stream);

                    if (ast != null)
                    {
                        var ir = goalLoader.GenerateGoalIR(ast);
                        ir.Name = script.Name;
                        tasks.IRs.Enqueue(ir);
                    }
                    else
                    {
                        var msg = new Diagnostic(goalLoader.LastLocation, MessageLevel.Error, "X00", $"Could not parse goal file " + script.Name);
                        Logger.CompilationDiagnostic(msg);
                        HasErrors = true;
                    }
                }
            }
        }
コード例 #2
0
ファイル: StructureInfo.cs プロジェクト: yeganaaa/mug
        public int GetFieldIndexFromName(string name, IRGenerator generator, Range position)
        {
            for (int i = 0; i < FieldNames.Length; i++)
            {
                if (FieldNames[i] == name)
                {
                    return(i);
                }
            }

            generator.Error(position, "Undeclared field `", name, "`");
            throw new();
        }
コード例 #3
0
            private string InitialiseImage()
            {
                string messages = "";

                MapOutputMode imageMode = new MapOutputMode();

                imageMode.XRes = FSize.Width;
                imageMode.YRes = FSize.Height;
                imageMode.FPS  = 30;

                if (Mode == ImageNodeMode.RGB)
                {
                    if (FIRGenerator != null)
                    {
                        FIRGenerator.StopGenerating();
                        FIRGenerator.Dispose();
                    }
                    FRGBGenerator = new ImageGenerator(FState.Context);

                    FRGBGenerator.MapOutputMode = imageMode;
                    Image.Image.Initialise(FSize, TColorFormat.RGB8);

                    if (FState.DepthGenerator.AlternativeViewpointCapability.IsViewpointSupported(FRGBGenerator))
                    {
                        FState.DepthGenerator.AlternativeViewpointCapability.SetViewpoint(FRGBGenerator);
                    }
                    else
                    {
                        messages += "AlternativeViewportCapability not supported\n";
                    }
                    FRGBGenerator.StartGenerating();
                }
                else
                {
                    if (FRGBGenerator != null)
                    {
                        FRGBGenerator.StopGenerating();
                        FRGBGenerator.Dispose();
                    }
                    FIRGenerator = new IRGenerator(FState.Context);
                    FIRGenerator.MapOutputMode = imageMode;
                    FIRGenerator.StartGenerating();

                    Image.Image.Initialise(FSize, TColorFormat.L16);
                }

                return(messages);
            }
コード例 #4
0
        public CompilationUnit(string path, bool isMainModule, bool throwerror)
        {
            if (!File.Exists(path))
            {
                if (throwerror)
                {
                    CompilationErrors.Throw($"Unable to open path: `{path}`");
                }

                FailedOpeningPath = true;
            }
            else
            {
                IRGenerator = new(path, File.ReadAllText(path), isMainModule);
            }
        }
コード例 #5
0
        private void Initialise()
        {
            try
            {
                FMode = FPinInMode[0];
                Size size = new Size(640, 480);

                if (FMode == ImageNodeMode.RGB)
                {
                    FImageGenerator = new ImageGenerator(FState.Context);
                    FImageImage.Image.Initialise(size, TColourFormat.RGB8);
                    FState.DepthGenerator.AlternativeViewpointCapability.SetViewpoint(FImageGenerator);
                    FImageGenerator.StartGenerating();
                }
                else
                {
                    FIRGenerator = new IRGenerator(FState.Context);
                    FImageImage.Image.Initialise(size, TColourFormat.L16);
                    FIRGenerator.StartGenerating();
                }

                FImageDepth.Image.Initialise(size, TColourFormat.L16);
                FImageWorld.Image.Initialise(size, TColourFormat.RGB32F);

                FPinOutImageImage[0] = FImageImage.Link;
                FPinOutImageDepth[0] = FImageDepth.Link;
                FPinOutImageWorld[0] = FImageWorld.Link;

                for (int x = 0; x < 640; x++)
                {
                    for (int y = 0; y < 480; y++)
                    {
                        FProjective[x + y * 640].X = x;
                        FProjective[x + y * 640].Y = y;
                    }
                }

                FState.Update += new EventHandler(FState_Update);

                FStatus = "OK";
            }
            catch (StatusException e)
            {
                FStatus = e.Message;
            }
        }
コード例 #6
0
        public override bool Initialize()
        {
            // string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
            var           dir     = GTPath.GetLocalApplicationDataPath();
            DirectoryInfo dirInfo = new DirectoryInfo(new Uri(dir).LocalPath);

            this.context = new Context(dirInfo.FullName + Path.DirectorySeparatorChar + configFile);

            this.ir = context.FindExistingNode(NodeType.IR) as IRGenerator;

            if (this.ir != null)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
コード例 #7
0
ファイル: ModCompiler.cs プロジェクト: slimlime/lslib
        public bool Compile(string outputPath, string debugInfoPath, List <string> mods)
        {
            Logger.CompilationStarted();
            HasErrors     = false;
            Compiler.Game = Game;
            Compiler.AllowTypeCoercion = AllowTypeCoercion;

            if (mods.Count > 0)
            {
                Logger.TaskStarted("Discovering module files");
                var visitor = new ModPathVisitor(Mods)
                {
                    Game = Game,
                    CollectStoryGoals = true,
                    CollectGlobals    = CheckGameObjects,
                    CollectLevels     = CheckGameObjects,
                    LoadPackages      = LoadPackages
                };
                visitor.Discover(GameDataPath);
                Logger.TaskFinished();

                Logger.TaskStarted("Loading module files");
                if (CheckGameObjects)
                {
                    var nullGameObject = new GameObjectInfo
                    {
                        Name = "NULL_00000000-0000-0000-0000-000000000000",
                        Type = Compiler.Context.LookupType("GUIDSTRING")
                    };
                    Compiler.Context.GameObjects.Add("00000000-0000-0000-0000-000000000000", nullGameObject);
                }

                foreach (var modName in mods)
                {
                    LoadMod(modName);
                }

                AbstractFileInfo storyHeaderFile           = null;
                AbstractFileInfo typeCoercionWhitelistFile = null;
                var modsSearchPath = mods.ToList();
                modsSearchPath.Reverse();
                foreach (var modName in modsSearchPath)
                {
                    if (storyHeaderFile == null && Mods.Mods[modName].StoryHeaderFile != null)
                    {
                        storyHeaderFile = Mods.Mods[modName].StoryHeaderFile;
                    }

                    if (typeCoercionWhitelistFile == null && Mods.Mods[modName].TypeCoercionWhitelistFile != null)
                    {
                        typeCoercionWhitelistFile = Mods.Mods[modName].TypeCoercionWhitelistFile;
                    }
                }

                if (storyHeaderFile != null)
                {
                    var storyStream = storyHeaderFile.MakeStream();
                    LoadStoryHeaders(storyStream);
                    storyHeaderFile.ReleaseStream();
                }
                else
                {
                    Logger.CompilationDiagnostic(new Diagnostic(null, MessageLevel.Error, "X00", "Unable to locate story header file (story_header.div)"));
                    HasErrors = true;
                }

                if (typeCoercionWhitelistFile != null)
                {
                    var typeCoercionStream = typeCoercionWhitelistFile.MakeStream();
                    LoadTypeCoercionWhitelist(typeCoercionStream);
                    typeCoercionWhitelistFile.ReleaseStream();
                    Compiler.TypeCoercionWhitelist = TypeCoercionWhitelist;
                }

                Logger.TaskFinished();
            }

            if (CheckGameObjects)
            {
                Logger.TaskStarted("Loading game objects");
                LoadGlobals();
                Logger.TaskFinished();
            }
            else
            {
                Compiler.Context.Log.WarningSwitches[DiagnosticCode.UnresolvedGameObjectName] = false;
            }

            if (OsiExtender)
            {
                Logger.TaskStarted("Precompiling scripts");
                ParallelPreprocess();
                Logger.TaskFinished();
            }

            var asts       = new Dictionary <String, ASTGoal>();
            var goalLoader = new IRGenerator(Compiler.Context);

            Logger.TaskStarted("Generating IR");
            var orderedGoalAsts = ParallelBuildIR();

            foreach (var goal in orderedGoalAsts)
            {
                Compiler.AddGoal(goal);
            }
            Logger.TaskFinished();


            bool updated;
            var  iter = 1;

            do
            {
                Logger.TaskStarted($"Propagating rule types {iter}");
                updated = Compiler.PropagateRuleTypes();
                Logger.TaskFinished();

                if (iter++ > 10)
                {
                    Compiler.Context.Log.Error(null, DiagnosticCode.InternalError,
                                               "Maximal number of rule propagation retries exceeded");
                    break;
                }
            } while (updated);

            Logger.TaskStarted("Checking for unresolved references");
            Compiler.VerifyIR();
            Logger.TaskFinished();

            foreach (var message in Compiler.Context.Log.Log)
            {
                Logger.CompilationDiagnostic(message);
                if (message.Level == MessageLevel.Error)
                {
                    HasErrors = true;
                }
            }

            if (!HasErrors && !CheckOnly)
            {
                Logger.TaskStarted("Generating story nodes");
                var emitter = new StoryEmitter(Compiler.Context);
                if (debugInfoPath != null)
                {
                    emitter.EnableDebugInfo();
                }

                var story = emitter.EmitStory();
                Logger.TaskFinished();

                Logger.TaskStarted("Saving story binary");
                using (var file = new FileStream(outputPath, FileMode.Create, FileAccess.Write))
                {
                    var writer = new StoryWriter();
                    writer.Write(file, story);
                }
                Logger.TaskFinished();

                if (debugInfoPath != null)
                {
                    Logger.TaskStarted("Saving debug info");
                    using (var file = new FileStream(debugInfoPath, FileMode.Create, FileAccess.Write))
                    {
                        var writer = new DebugInfoSaver();
                        writer.Save(file, emitter.DebugInfo);
                    }
                    Logger.TaskFinished();
                }
            }

            Logger.CompilationFinished(!HasErrors);
            return(!HasErrors);
        }
コード例 #8
0
ファイル: StructureInfo.cs プロジェクト: yeganaaa/mug
 public MugValueType GetFieldTypeFromName(string name, IRGenerator generator, Range position)
 {
     return(FieldTypes[GetFieldIndexFromName(name, generator, position)]);
 }
コード例 #9
0
        public bool Compile(string outputPath, string debugInfoPath, List <string> mods)
        {
            Logger.CompilationStarted();
            HasErrors     = false;
            Compiler.Game = Game;
            Mods.Game     = Game;

            if (mods.Count > 0)
            {
                Logger.TaskStarted("Discovering module files");
                Mods.CollectNames = CheckGameObjects;
                Mods.LoadPackages = LoadPackages;
                Mods.Discover(GameDataPath);
                Logger.TaskFinished();

                Logger.TaskStarted("Loading module files");
                if (CheckGameObjects)
                {
                    var nullGameObject = new GameObjectInfo
                    {
                        Name = "NULL_00000000-0000-0000-0000-000000000000",
                        Type = Compiler.Context.LookupType("GUIDSTRING")
                    };
                    Compiler.Context.GameObjects.Add("00000000-0000-0000-0000-000000000000", nullGameObject);
                }

                foreach (var modName in mods)
                {
                    LoadMod(modName);
                }
                Logger.TaskFinished();
            }

            var stream = Mods.StoryHeaderFile.MakeStream();

            LoadStoryHeaders(stream);
            Mods.StoryHeaderFile.ReleaseStream();

            if (CheckGameObjects)
            {
                Logger.TaskStarted("Loading game objects");
                LoadGlobals();
                Logger.TaskFinished();
            }
            else
            {
                Compiler.Context.Log.WarningSwitches[DiagnosticCode.UnresolvedGameObjectName] = false;
            }

            var asts       = new Dictionary <String, ASTGoal>();
            var goalLoader = new IRGenerator(Compiler.Context);

            Logger.TaskStarted("Generating IR");
            var orderedGoalAsts = ParallelBuildIR();

            foreach (var goal in orderedGoalAsts)
            {
                Compiler.AddGoal(goal);
            }
            Logger.TaskFinished();


            Logger.TaskStarted("Propagating rule types");
            // TODO - this should be changed to dynamic pass count detection
            Compiler.PropagateRuleTypes();
            Compiler.PropagateRuleTypes();
            Compiler.PropagateRuleTypes();
            Logger.TaskFinished();

            Logger.TaskStarted("Checking for unresolved references");
            Compiler.VerifyIR();
            Logger.TaskFinished();

            foreach (var message in Compiler.Context.Log.Log)
            {
                Logger.CompilationDiagnostic(message);
                if (message.Level == MessageLevel.Error)
                {
                    HasErrors = true;
                }
            }

            if (!HasErrors && !CheckOnly)
            {
                Logger.TaskStarted("Generating story nodes");
                var emitter = new StoryEmitter(Compiler.Context);
                if (debugInfoPath != null)
                {
                    emitter.EnableDebugInfo();
                }

                var story = emitter.EmitStory();
                Logger.TaskFinished();

                Logger.TaskStarted("Saving story binary");
                using (var file = new FileStream(outputPath, FileMode.Create, FileAccess.Write))
                {
                    var writer = new StoryWriter();
                    writer.Write(file, story);
                }
                Logger.TaskFinished();

                if (debugInfoPath != null)
                {
                    Logger.TaskStarted("Saving debug info");
                    using (var file = new FileStream(debugInfoPath, FileMode.Create, FileAccess.Write))
                    {
                        var writer = new DebugInfoSaver();
                        writer.Save(file, emitter.DebugInfo);
                    }
                    Logger.TaskFinished();
                }
            }

            Logger.CompilationFinished(!HasErrors);
            return(!HasErrors);
        }
コード例 #10
0
 public CompilationUnit(string moduleName, string source, bool isMainModule)
 {
     IRGenerator = new(moduleName, source, isMainModule);
 }