From a3f58e4c739e545f432e7ce26931b31f02623b4f Mon Sep 17 00:00:00 2001 From: Raphael Koh Date: Mon, 17 Aug 2020 11:26:28 -0400 Subject: [PATCH] Fix stackoverflow error for QArray args --- src/Simulation/Core/TypeExtensions.cs | 15 ++++++++----- .../Circuits/RuntimeMetadataTest.qs | 4 ++++ .../Simulators.Tests/RuntimeMetadataTests.cs | 22 +++++++++++++++++++ .../Simulators.Tests/TypeExtensionsTest.cs | 3 +++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/Simulation/Core/TypeExtensions.cs b/src/Simulation/Core/TypeExtensions.cs index 59cb0370b52..6b7722fc234 100644 --- a/src/Simulation/Core/TypeExtensions.cs +++ b/src/Simulation/Core/TypeExtensions.cs @@ -165,12 +165,6 @@ public static Type[] GetTupleFieldTypes(this Type arg) return op.Name; } - // If object is an IApplyData, recursively extract arguments - if (o is IApplyData data) - { - return data.Value?.GetNonQubitArgumentsAsString(); - } - // If object is a string, enclose it in quotations if (o is string s) { @@ -197,6 +191,15 @@ public static Type[] GetTupleFieldTypes(this Type arg) return (items.Any()) ? $"({string.Join(", ", items)})" : null; } + // If object is an IApplyData, recursively extract arguments + if (o is IApplyData data) + { + if (data.Value != data) + { + return data.Value?.GetNonQubitArgumentsAsString(); + } + } + // Otherwise, return argument as a string return (o != null) ? o.ToString() : null; } diff --git a/src/Simulation/Simulators.Tests/Circuits/RuntimeMetadataTest.qs b/src/Simulation/Simulators.Tests/Circuits/RuntimeMetadataTest.qs index 4e721723832..5836a3426f5 100644 --- a/src/Simulation/Simulators.Tests/Circuits/RuntimeMetadataTest.qs +++ b/src/Simulation/Simulators.Tests/Circuits/RuntimeMetadataTest.qs @@ -30,5 +30,9 @@ namespace Microsoft.Quantum.Simulation.Simulators.Tests.Circuits { operation TwoQubitOp (q1 : Qubit, q2 : Qubit) : Unit { // ... } + + operation BoolArrayOp (bits : Bool[]) : Unit { + // ... + } } diff --git a/src/Simulation/Simulators.Tests/RuntimeMetadataTests.cs b/src/Simulation/Simulators.Tests/RuntimeMetadataTests.cs index e9f6e69e626..a84d4d76423 100644 --- a/src/Simulation/Simulators.Tests/RuntimeMetadataTests.cs +++ b/src/Simulation/Simulators.Tests/RuntimeMetadataTests.cs @@ -500,6 +500,28 @@ public void DuplicateQubitArgs() Assert.Equal(op.GetRuntimeMetadata(args), expected); } + + [Fact] + public void QArrayArgs() + { + var op = new QuantumSimulator().Get(); + IQArray bits = new QArray(new bool[] { false, true }); + var args = op.__dataIn(bits); + var expected = new RuntimeMetadata() + { + Label = "BoolArrayOp", + FormattedNonQubitArgs = "[False, True]", + IsAdjoint = false, + IsControlled = false, + IsMeasurement = false, + IsComposite = false, + Children = null, + Controls = new List() { }, + Targets = new List() { }, + }; + + Assert.Equal(op.GetRuntimeMetadata(args), expected); + } } public class UDTTests diff --git a/src/Simulation/Simulators.Tests/TypeExtensionsTest.cs b/src/Simulation/Simulators.Tests/TypeExtensionsTest.cs index a7942f7f110..2707ca2b150 100644 --- a/src/Simulation/Simulators.Tests/TypeExtensionsTest.cs +++ b/src/Simulation/Simulators.Tests/TypeExtensionsTest.cs @@ -94,6 +94,9 @@ public void ArrayTypes() (new FreeQubit(1), "bar"), }; Assert.Equal("[(\"foo\"), (\"bar\")]", qTupleArr.GetNonQubitArgumentsAsString()); + + var qArrayBool = new QArray(new[] { false, true }); + Assert.Equal("[False, True]", qArrayBool.GetNonQubitArgumentsAsString()); } [Fact]