internal static void CompareCores(Core c1, Core c2) { Assert.AreEqual(c1.DSExecutable.runtimeSymbols.Length, c2.DSExecutable.runtimeSymbols.Length); for (int symTableIndex = 0; symTableIndex < c1.DSExecutable.runtimeSymbols.Length; symTableIndex++) { foreach (SymbolNode symNode in c1.DSExecutable.runtimeSymbols[symTableIndex].symbolList.Values) { ExecutionMirror runExecMirror = new ExecutionMirror(c1.CurrentExecutive.CurrentDSASMExec, c1); ExecutionMirror debugExecMirror = new ExecutionMirror(c2.CurrentExecutive.CurrentDSASMExec, c2); bool lookupOk = false; StackValue runValue = new StackValue(); if (symNode.name.StartsWith("%") || symNode.functionIndex != Constants.kInvalidIndex) { continue; //Don't care about internal variables } try { runValue = runExecMirror.GetGlobalValue(symNode.name); Console.WriteLine(symNode.name + ": " + runValue); lookupOk = true; } catch (NotImplementedException) { } catch (Exception ex) { if ((ex is ArgumentOutOfRangeException || ex is IndexOutOfRangeException) && (c1.RunningBlock != symNode.runtimeTableIndex)) { // Quite possible that variables defined in the inner // language block have been garbage collected and // stack frame pointer has been adjusted when return // to the outer block. } else { throw ex; } } if (lookupOk) { StackValue debugValue = debugExecMirror.GetGlobalValue(symNode.name); if (!StackUtils.CompareStackValues(debugValue, runValue, c2, c1)) { Assert.Fail(string.Format("\tThe value of variable \"{0}\" doesn't match in run mode and in debug mode.\n", symNode.name)); } } } } }