/// <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++; } }
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)); }
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); } } }