Пример #1
0
        public void TestPromotionForStorage()
        {
            string test
                = @"integer g() { return 0; }
                    f() { 
                        integer i;
                        float f = 1;
                        float h = g();
                        float j = i;
                        float l = i++;
                        float k = i - 5;

                        f = 1;
                        h = g();
                        j = i;
                        l = i++;
                        k = i - 5;
                    }

                    default { state_entry() {} }
                    ";

            TestListener      listener     = new TestListener();
            MCompilerFrontend testFrontend = new MCompilerFrontend(listener, Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"), true);
            CompiledScript    script       = testFrontend.Compile(test);

            string byteCode = testFrontend.GeneratedByteCode;

            Console.WriteLine(byteCode);
            int castCount = new Regex("fcast").Matches(byteCode).Count;

            Assert.IsTrue(listener.HasErrors() == false);
            Assert.AreEqual(castCount, 10);
        }
Пример #2
0
        public void TestPromotionForFunctionCalls()
        {
            string test
                = @"g(float parm) { }
                    integer intfunc() { return 0; }

                    f() { 
                        integer i;
                        
                        g(1);
                        g(i);
                        g(i++);
                        g(i - 3);
                        g(intfunc());
                    }

                    default { state_entry() {} }
                    ";

            TestListener      listener     = new TestListener();
            MCompilerFrontend testFrontend = new MCompilerFrontend(listener, Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"), true);
            CompiledScript    script       = testFrontend.Compile(test);

            string byteCode = testFrontend.GeneratedByteCode;

            Console.WriteLine(byteCode);
            int castCount = new Regex("fcast").Matches(byteCode).Count;

            Assert.IsTrue(listener.HasErrors() == false);
            Assert.AreEqual(castCount, 5);
        }
Пример #3
0
        public void TestJumpDifferentSymbolSameName()
        {
            string test = @"
                        f() {
                            @a;
                            jump a;
                        }

                        g() {
                            @a;
                            jump a;
                        }
                    
                        default
                        {
                            touch_start(integer num) {
                            }
                        }";

            TestListener      listener     = new TestListener();
            MCompilerFrontend testFrontend = new MCompilerFrontend(listener, Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"), true);
            CompiledScript    script       = testFrontend.Compile(test);

            string byteCode = testFrontend.GeneratedByteCode;

            Console.WriteLine(byteCode);

            Assert.IsTrue(listener.HasErrors() == false);
            Assert.AreEqual(new Regex("a_usrlbl__0").Matches(byteCode).Count, 2);
            Assert.AreEqual(new Regex("a_usrlbl__1").Matches(byteCode).Count, 2);
            Assert.AreEqual(new Regex("jmp a_usrlbl__0").Matches(byteCode).Count, 1);
            Assert.AreEqual(new Regex("jmp a_usrlbl__1").Matches(byteCode).Count, 1);
        }
Пример #4
0
        public void TestDoGenerateBooleanEval()
        {
            string test
                = @"string strfunc() { return """"; }

                    f() { 
                        if (strfunc()) {
                        }

                        while (0.0) {
                        }

                        for (;"""";) {
                        }
                        
                        key k;
                        do {
                        } while (k);
                    }

                    default { state_entry() {} }
                    ";

            TestListener      listener     = new TestListener();
            MCompilerFrontend testFrontend = new MCompilerFrontend(listener, Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"), true);
            CompiledScript    script       = testFrontend.Compile(test);

            string byteCode = testFrontend.GeneratedByteCode;

            Console.WriteLine(byteCode);
            int evalCount = new Regex("booleval").Matches(byteCode).Count;

            Assert.IsTrue(listener.HasErrors() == false);
            Assert.AreEqual(evalCount, 4);
        }
Пример #5
0
        public void TestImplicitCastForSubscriptAssignment()
        {
            string test
                = @"g(float parm) { }
                    integer intfunc() { return 0; }

                    f() { 
                        vector v;
                        v.x = intfunc();
                        float f = (v.y = 1);
                        
                    }

                    default { state_entry() {} }
                    ";

            TestListener      listener     = new TestListener();
            MCompilerFrontend testFrontend = new MCompilerFrontend(listener, Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"), true);
            CompiledScript    script       = testFrontend.Compile(test);

            string byteCode = testFrontend.GeneratedByteCode;

            Console.WriteLine(byteCode);
            int castCount = new Regex("fcast").Matches(byteCode).Count;

            Assert.IsTrue(listener.HasErrors() == false);
            Assert.AreEqual(castCount, 2);
        }
Пример #6
0
        public Halcyon.Phlox.Glue.CompilerFrontend Compile(ICharStream input)
        {
            Halcyon.Phlox.Glue.CompilerFrontend frontEnd = new Halcyon.Phlox.Glue.CompilerFrontend(_listener, _grammarFolder, true);
            frontEnd.OutputASTGraph = true;

            frontEnd.Compile(input);

            return(frontEnd);
        }
Пример #7
0
        public void TestGeneratesFinalRetForEvent()
        {
            string test
                = @"default 
                    {
                        state_entry()
                        {
                            llSay(0, ""Script Running"");
                        }
                    }";

            MCompilerFrontend testFrontend = new MCompilerFrontend(new TestListener(), Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"));
            CompiledScript    script       = testFrontend.Compile(test);

            Assert.Contains(93, script.ByteCode);
        }
Пример #8
0
        public void TestGoodAssignmentBeforeAndAfterShadowing()
        {
            string test
                = @"
                    func(vector v) {
                        v = <1,1,1>;
                        vector v;
                        v = <2,2,2>;
                    }
                    default { state_entry() {} }
                    ";

            Halcyon.Phlox.Glue.CompilerFrontend fe = Compiler.Compile(new ANTLRStringStream(test));
            Assert.IsTrue(Listener.ErrorCount == 0);
            Assert.IsTrue(fe.GeneratedByteCode.Contains("store 0"));
            Assert.IsTrue(fe.GeneratedByteCode.Contains("store 1"));
        }
Пример #9
0
        public void TestGoodAssignmentReferenceToParamFromShadow()
        {
            string test
                = @"
                    func(vector v) {
                        v = <1.0, 1.0, 1.0>;
                        vector v = v;
                        v = <1.0, 1.0, 1.0>;
                    }
                    default { state_entry() {} }
                    ";

            Halcyon.Phlox.Glue.CompilerFrontend fe = Compiler.Compile(new ANTLRStringStream(test));
            Assert.IsTrue(Listener.ErrorCount == 0);
            Console.WriteLine(fe.GeneratedByteCode);
            Assert.IsTrue(fe.GeneratedByteCode.Contains("load 0"));
            Assert.IsTrue(fe.GeneratedByteCode.Contains("store 1"));
        }
Пример #10
0
        public void TestMultiParamEvent()
        {
            string test
                = @"default 
                    {
                        listen(integer chan, string name, key id, string text)
                        {
                            llSay(0, ""Script Running"");
                        }

                        timer()
                        {
                        }
                    }";

            TestListener      listener     = new TestListener();
            MCompilerFrontend testFrontend = new MCompilerFrontend(listener, Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"));
            CompiledScript    script       = testFrontend.Compile(test);

            Assert.AreEqual(0, listener.ErrorCount);
        }
Пример #11
0
        public void TestLocalInitsMemoryAccountingBug()
        {
            string test
                = @"integer i;
                    float f;
                    vector v;
                    string s;
                    list l;
                    rotation r;

                    f() {
                      integer i;
                    }

                    g() {
                     integer i = 0;
                     for (i = 0; i < 999; i++) {
                        f();
                     }
                    }

                    integer h() {
                     g();
                     return 1;
                    }

                    integer k = h();

                    default { state_entry() {} }
                    ";

            MCompilerFrontend testFrontend = new MCompilerFrontend(new TestListener(), Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"));
            CompiledScript    script       = testFrontend.Compile(test);

            Interpreter i = InterpRunner.Run(script);

            Assert.IsTrue(i.ScriptState.MemInfo.MemoryFree < MemoryInfo.MAX_MEMORY);
        }
Пример #12
0
        public void TestLauksLarrowScript()
        {
            string test;

            string LAUKS_LARROW = Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar", "test_files", "Lauks_Larrow_Main.lsl");

            // This file is not committed; skip test if not on a machine where it can be found.
            if (!File.Exists(LAUKS_LARROW))
            {
                return;
            }

            using (StreamReader rdr = File.OpenText(LAUKS_LARROW))
            {
                test = rdr.ReadToEnd();
            }

            TestListener      listener     = new TestListener();
            MCompilerFrontend testFrontend = new MCompilerFrontend(listener, Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"));
            CompiledScript    script       = testFrontend.Compile(test);

            Assert.IsTrue(listener.HasErrors() == false);
        }
Пример #13
0
        public void TestGenerationOutputForTypePromotion()
        {
            string test
                = @"string strfunc() { return """"; }

                    f() { 
                        integer i;
                        float f;
                        
                        if (i < f) {}
                        if (i > f) {}
                        if (f > i) {}
                        if (f < i) {}
                        if (i >= f) {}
                        if (i <= f) {}
                        if (i < i) {}
                    }

                    default { state_entry() {} }
                    ";

            TestListener      listener     = new TestListener();
            MCompilerFrontend testFrontend = new MCompilerFrontend(listener, Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "grammar"), true);
            CompiledScript    script       = testFrontend.Compile(test);

            string byteCode = testFrontend.GeneratedByteCode;

            Console.WriteLine(byteCode);

            Assert.IsTrue(listener.HasErrors() == false);
            Assert.AreEqual(new Regex("flt(?!e)").Matches(byteCode).Count, 2);
            Assert.AreEqual(new Regex("fgt(?!e)").Matches(byteCode).Count, 2);
            Assert.AreEqual(new Regex("fgte").Matches(byteCode).Count, 1);
            Assert.AreEqual(new Regex("flte").Matches(byteCode).Count, 1);
            Assert.AreEqual(new Regex("ilt").Matches(byteCode).Count, 1);
        }