Exemple #1
0
        /// <summary>
        /// Map parameter names to positional names. This must match the expectations of the interpreter
        /// </summary>
        private static void ParameterPositions(Scope parameterNames, IEnumerable <string> paramNames, NanCodeWriter wr)
        {
            parameterNames.PushScope();
            var i = 0;

            foreach (var paramName in paramNames)
            {
                if (parameterNames.InScope(NanTags.GetCrushedName(paramName)))
                {
                    throw new Exception("Duplicate parameter '" + paramName + "'.\r\n" +
                                        "All parameter names must be unique in a single function definition.");
                }

                var originalReference  = NanTags.GetCrushedName(paramName);
                var parameterReference = Scope.NameFor(i);
                var parameterByteCode  = NanTags.EncodeVariableRef(parameterReference);

                parameterNames.SetValue(originalReference, parameterByteCode);

                wr.AddSymbol(originalReference, paramName);
                wr.AddSymbol(parameterReference, "param[" + i + "]");

                i++;
            }
        }
Exemple #2
0
        public void identifier_names_can_be_encoded_and_survive_a_round_trip()
        {
            var enc  = NanTags.EncodeVariableRef("HelloWorld", out var crush);
            var type = NanTags.TypeOf(enc);

            var enc2  = NanTags.EncodeVariableRef("Hel" + "lo" + "Wo" + 'r' + 'l' + 'd', out var crush2);
            var other = NanTags.EncodeVariableRef("HelloWorld2", out var crushOther);

            Console.WriteLine("Crush:   " + crush.ToString("X"));
            Console.WriteLine("Crush:   " + crushOther.ToString("X"));

            var checkCrush = NanTags.DecodeVariableRef(enc);

            Assert.That(checkCrush, Is.EqualTo(crush));

            Assert.That(type, Is.EqualTo(DataType.VariableRef));
            Assert.That(NanTags.AreEqual(enc, enc2), Is.True);
            Assert.That(NanTags.AreEqual(enc, other), Is.False);
            Assert.That(crush, Is.EqualTo(crush2));
            Assert.That(crush, Is.Not.EqualTo(crushOther));
        }
Exemple #3
0
        public void short_identifier_names_get_encoded_uniquely()
        {
            var seen = new HashSet <ulong>();

            for (int i = 0; i < 60; i++)
            {
                var cs = ((char)('A' + i)).ToString();
                NanTags.EncodeVariableRef(cs, out var crush);
                Assert.That(seen.Contains(crush), Is.False);
                seen.Add(crush);
            }

            for (int i = 0; i < 60; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    var cs = ((char)('A' + i)).ToString() + j;
                    NanTags.EncodeVariableRef(cs, out var crush);
                    Assert.That(seen.Contains(crush), Is.False);
                    seen.Add(crush);
                }
            }
        }